
数据结构
文章平均质量分 65
21RGHLY
哈哈哈哈
展开
-
堆------神奇的优先队列
堆的定义:堆:一种特殊的完全二叉树。此二叉树的特点:所有父结点都比子结点要小(圆圈里面的数是值,圆圈上面的数是此结点编号)符合这样特点的完全二叉树我们称为最小堆。反之,如果所有父结点都比子结点要大,这样的完全二叉树称为最大堆。(金字塔,上面的牛逼)最小堆的应用:找最小值。假如有...原创 2022-02-11 18:04:34 · 281 阅读 · 0 评论 -
二叉树 = =
二叉树的定义:二叉树要么为空,要么由根节点、左子树和右子树组成,而左子树和右子树分别是一颗二叉树。二叉树的特点:(1)每个节点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树。(2)使用范围广:一颗多叉树也可以转化为二叉树。满二叉树:1.定义如果二叉树中每个内部结点都有两个儿子,这样的二叉树叫做满二叉树。或者说满二叉树所有的叶结点都有同样的深度。严格的定义是一棵深度为h且有2的h次方- 1个结点的二叉树。2.图形原创 2022-02-11 13:48:49 · 664 阅读 · 0 评论 -
树 = =
定义:树:原创 2022-02-07 18:08:48 · 330 阅读 · 0 评论 -
图 = =
定义:图就是由一些小圆点(成为顶点)和连接这些小圆点的直线(称为边)组成的。例如上图是由5个顶点(编号为1、2、3、4、5)和5条边(1-2、1-3、1-5、2-4、3-5)组成。遍历:现在我们从1号顶点开始遍历这个图,遍历就是指把图的每一个顶点都访问一次。使用深度优先搜索来遍历这个图将会得到如下的结果。这五个顶点的被访问顺序如下图。图中每个顶点右上方的数就表示这个顶点是第几个被访问到的,我们还为这个数起了很好听的名字---时间戳。图的存储:.原创 2022-01-26 17:28:51 · 963 阅读 · 0 评论 -
字符串哈希
核心思想:将字符串看成P进制数,P的经验值是131或者13331,取这两个值的冲突概率低小技巧:取模的数用2^64,这样直接用unsigned long long存储,溢出的结果就是取模的结果模板:typedef unsigned long long ULL;ULL h[N], p[N]; // h[k]存储字符串前k个字母的哈希值,p[k]存储 P^k mod 2 ^ 64//初始化int i;p[0] = 1;for(i = 1; i <= n ; i ++){原创 2022-01-16 18:16:43 · 171 阅读 · 0 评论 -
一般哈希 = =
(1)拉链法int h[N], e[N], ne[N] , idx;//向哈希表中插入一个数void insert(int x){ int k = (x % N + N) % N; e[idx] = x; ne[idx] = h[k]; h[k] = idx ++;} //在哈希表中查询某个数是否存在bool find(int x){ int i; int k = (x % N + N) % N; for(i = h[k]; i != -; i = ne[i]) {原创 2022-01-16 18:06:31 · 279 阅读 · 0 评论 -
并查集 = =
(1)朴素并查集int p[N]; // 存储每个点的祖宗点//返回x的祖宗节点int find(int x){ if(p[x] != x) p[x] = find(p[x]); return p[x]; } //初始化,假定节点编号是1~nint i;for(i = 1;i <= n;i ++) p[i] = i;//合并a和b所在的两个集合p[find(a)] = find(b);(2)维护size的并查集int p[N], size[N];/原创 2022-01-16 12:22:05 · 141 阅读 · 0 评论 -
Tire树
模板:int son[N][26], cnt[N] , idx;//0号点既是根节点,又是空节点//son[][]存储树中每个节点的子节点//cnt[]存储以每个节点结尾的单词数量//插入一个字符串void insert(char *str){ int i; int p = 0; for(i = 0; str[i] ; i ++) { int u = str[i] - 'a'; if(!son[p][u]) son[p][u] = ++ idx; p = son[p原创 2022-01-16 12:01:07 · 343 阅读 · 0 评论 -
KMP = =
模板://s[]是长文本,p[]是模式串,n是s的长度,m是p的长度求模式串的Next数组int i,j;for(i = 2,j = 0;i <= m;i ++){ while(j && p[i] != p[j + 1]) j = ne[j]; if(p[i] == p[j + 1]) j ++; ne[i] = j;}//匹配int i,j;for(i = 1,j = 0; i <= n; i ++){ while(j &&原创 2022-01-16 11:52:39 · 168 阅读 · 0 评论 -
栈 = =
模板:// tt表示栈顶int stk[N], tt = 0;// 向栈顶插入一个数 stk[ ++ tt] = x;//从栈顶弹出一个数 tt --;//栈顶的值stk[tt];// 判断栈是否为空if(tt > 0){ ...}原创 2022-01-15 16:19:06 · 119 阅读 · 0 评论 -
队列 = =
1.普通队列:// hh 表示队头,tt表示队尾 int q[N], hh = 0, tt = -1;//向队尾插入一个数q[ ++ tt] = x;// 从队头弹出一个数hh ++;//队头的值q[hh];//判断队列是否为空if(hh <= tt){ ...} 2.循环队列//hh 表示队头,tt表示队尾的后一个位置int q[N], hh = 0, tt = 0;// 向队尾插入一个数q[tt ++] = x;if(tt == N)原创 2022-01-15 16:32:28 · 265 阅读 · 0 评论