随笔分类 -  数据结构与算法

摘要:1 int womanPrefer[10][10],manPrefer[10][10]; 2 //womanPrefer[i][j]:i号女人第j喜欢的男人编号 3 //manPrefer[i][j]:i号男人第j喜欢的女人编号 4 vector<int>& GaleShplay(){ 5 int 阅读全文
posted @ 2020-06-22 01:45 NeoZy 阅读(831) 评论(0) 推荐(0)
摘要:Floyd算法(求所有节点对的最短路径): 首先考虑使用单源最短路径算法重复|V|次,这样的复杂度会达到|V|^4,因为其中有很多重复的运算。 Floyd算法复杂度为|V|^3。 其维护一个二维数组Q,Q[i][j]表示i到j的最短路径长度,如果不存在则为无穷大,若i==j则为0。 然后分别利用节点 阅读全文
posted @ 2020-06-05 15:27 NeoZy 阅读(1144) 评论(0) 推荐(0)
摘要:Dijkstra: 和Bellman-Ford算法都是求单源最短路径的,但Dijkstra算法要求图中没有负权边。 整体思路:集合S包含所有已经找到最短路径的节点,Q集合为没有找到最短路径的节点。 起初Q为V(原始顶点集),S为空集。每次从Q中选取节点v,v满足条件:s到v的路径权和最小。将v从Q中 阅读全文
posted @ 2020-06-03 00:17 NeoZy 阅读(282) 评论(0) 推荐(0)
摘要:struct EdgeNode{ //邻接链表节点 int num; int weigh; EdgeNode* next; EdgeNode():num(0),weigh(0),next(nullptr){} EdgeNode(int x,int w):num(x),weigh(w),next(nu 阅读全文
posted @ 2020-06-02 14:27 NeoZy 阅读(263) 评论(0) 推荐(0)
摘要:强联通分量指的是有向无环图中的一个子图,该子图中任意两个节点i、j,都存在i到j的路径和j到i的路径,换句话,该子图中任意两点有路径可达(不需要直接有边相连,可以通过多条边)。 对于原图G做DFS,每个节点回溯时压到一个栈里。 对原图取转置,记G'。对于G'按之前栈的次序取栈顶进行DFS,每次得到的 阅读全文
posted @ 2020-05-27 00:24 NeoZy 阅读(249) 评论(0) 推荐(0)
摘要:int MatrixDP(int p[][2],int len ){ //p[i][0]、p[i][1]分别表示p[i]矩阵的行数、列数 int dp[100][100]={0}; for(int range=2;range<=len;++range){ int _begin=0,_end=rang 阅读全文
posted @ 2020-05-23 17:44 NeoZy 阅读(190) 评论(0) 推荐(0)
摘要:基数排序(radix sort): 对个位数先排序,再对十位数排序,以此类推。。 如果数据不满足位数相同,要对不够位数的数字前面补0(或者做类似处理)。 时间复杂度O(nk)其中n为数字个数,k为最多的数字位数。 void RadixSort(vector<int>& nums){ int maxD 阅读全文
posted @ 2020-05-14 01:09 NeoZy 阅读(397) 评论(0) 推荐(0)
摘要:输入数组A长度为n,数据范围为m1~m2。 建立一个长度m2-m1+1的数组B用做临时数组。 1.统计A中每个数字出现的次数,记录在B中。B[i]=k:A中值为i的索引一共有k处。 2.统计比A中每个数字小的数字个数,也就是统计A中每个数字应该在最终数组中排到的位置。 3.开一个结果数组C,倒序从A 阅读全文
posted @ 2020-05-09 02:04 NeoZy 阅读(174) 评论(0) 推荐(0)
摘要:算法导论上写的太mathmetical了,记不住。 以递归式为T(n) = a*T(n/b)+f(n)为例 (1)如果n^>f(n) 则复杂度为O(n) = n^ (2)如果n^=f(n) 则复杂度为O(n) = n^*lgn (2)如果n^<f(n) 则复杂度为O(n) = f(n) 阅读全文
posted @ 2020-05-07 18:06 NeoZy 阅读(361) 评论(0) 推荐(0)
摘要:如题,大O是表示上界,O(f)=g:函数g最大也比f小。Ω(f)=g:函数g最小也比f大 O、Ω都是带等号的(O:上界、Ω:下界) o、小Ω(w)都是不带等号的(即上下确界) 实际中我们说我们这个算法的复杂度是O(n^2)是什么意思呢? 答:是表示我们这个算法的函数位于一个集合中,这个集合是所有不超 阅读全文
posted @ 2020-05-06 17:13 NeoZy 阅读(545) 评论(0) 推荐(0)
摘要:Kruscal原理: 使用贪心算法。先将所有边按照权值从小到大排序,每个点初始都是一个树(一个节点的树)。从前到后遍历边集,对于当前边x-y来说,如果x、y已经在我们的最小生成树里,那么跳过该边。 如果x、y至少有一个不在我们的最小生成树里,将该边加入最小生成树,并且将包含x的树和包含y的树合并为一 阅读全文
posted @ 2020-03-29 22:55 NeoZy 阅读(257) 评论(0) 推荐(0)
摘要:为了克服普通队列的“假溢出”缺点,使用循环队列,用一个数组来模拟圆环,到达末尾后利用取模运算重新回到队首。 实现: front为队首指针,back为队尾指针。 由于队列满和队列空时front和back都相等,所以人为空一个元素。即如果队列数据结构容量为N,循环队列能容纳的有效数据为N-1。这样队列满 阅读全文
posted @ 2020-03-24 22:57 NeoZy 阅读(333) 评论(0) 推荐(0)
摘要:假设有一大堆人,这其中分了很多小群体。每个小群体都有自己的首领。比如a、b、c、d是一个小群体。其中a是头儿,b是a的下属,c和d都是b的下属。 那么我们可以这样写:b->a,表示b的上级是a。 c->b,d->b,表示c和d的上级都是b。 这其实就已经是并差集了。稍微抽象一下,字母替换为数字,用一 阅读全文
posted @ 2020-02-26 19:56 NeoZy 阅读(417) 评论(0) 推荐(0)
摘要:主要是记录一下这个数据结构。 比如这个trie树,包含三个单词:sea,sells,she。 代码: 1 class Trie { 2 bool isWord; 3 vector<Trie*> children; 4 public: 5 /** Initialize your data struct 阅读全文
posted @ 2020-02-17 22:50 NeoZy 阅读(175) 评论(0) 推荐(0)
摘要:问题: 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明: 你 阅读全文
posted @ 2020-02-17 13:09 NeoZy 阅读(370) 评论(0) 推荐(0)
摘要:#include<vector> #include<iostream> #include<time.h> using namespace std; int partition_1(vector<int> &nums,int le,int ri){ //来回填坑法 if(le>=ri){ return 阅读全文
posted @ 2020-02-08 02:51 NeoZy 阅读(503) 评论(0) 推荐(0)
摘要:头节点Head,快指针fast,慢指针slow。 初始快慢指针都等于Head,slow一次走一格,fast一次走两格。 另外我们现在要达成共识,first_meet节点一定在环内部,即相遇的地方一定是在环里面的某处。能理解再往下看。 快慢指针第一次相遇时,假设都等于first_meet,即二者在fi 阅读全文
posted @ 2019-12-07 21:56 NeoZy 阅读(214) 评论(0) 推荐(0)
摘要:首先贴一篇我看的博客,写的很清楚。作者:Emma_U 一些解释 索引堆首先是堆,但比堆肯定是更有用。 用处: 1.加速。 索引堆存储的是索引,并不直接存储值。在堆上浮下沉的元素交换的时候,交换索引可比交换值来的快。虽然我代码只实现了int类型的索引堆,但比方说string类型的索引堆,交换两个str 阅读全文
posted @ 2019-11-15 16:07 NeoZy 阅读(293) 评论(0) 推荐(0)
摘要:今天看剑指offer突然发现下学期都要去面试了,还没自己实现过快排非递归和归并非递归,这怎么能行呢,于是就写了一下。 (虽然有点卡壳,又回去翻了下算导,还是顺利写出来了) 先放图: 一亿数据量: #pragma warning(disable:4996) #include <iostream> #i 阅读全文
posted @ 2019-10-31 02:23 NeoZy 阅读(336) 评论(0) 推荐(0)
摘要:该写法最大的优势就是不必考虑返回left还是right,因为条件是while(le<ri) 题目:704. 二分查找 1:若中位数是左中位数,那么判断排除左半部的语句,一定要排除左中位数,不然两个元素的时候,左中位数就是首元素,会死循环。 样例: class Solution { public: i 阅读全文
posted @ 2019-10-07 01:40 NeoZy 阅读(305) 评论(0) 推荐(0)