数据结构
文章平均质量分 65
21RGHLY
哈哈哈哈
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
堆------神奇的优先队列
堆的定义: 堆:一种特殊的完全二叉树。 此二叉树的特点:所有父结点都比子结点要小(圆圈里面的数是值,圆圈上面的数是此结点编号)符合这样特点的完全二叉树我们称为最小堆。反之,如果所有父结点都比子结点要大,这样的完全二叉树称为最大堆。(金字塔,上面的牛逼) 最小堆的应用: 找最小值。 假如有 ...原创 2022-02-11 18:04:34 · 349 阅读 · 0 评论 -
二叉树 = =
二叉树的定义: 二叉树要么为空,要么由根节点、左子树和右子树组成,而左子树和右子树分别是一颗二叉树。 二叉树的特点: (1)每个节点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树。 (2)使用范围广:一颗多叉树也可以转化为二叉树。 满二叉树: 1.定义 如果二叉树中每个内部结点都有两个儿子,这样的二叉树叫做满二叉树。或者说满二叉树所有的叶结点都有同样的深度。严格的定义是一棵深度为h且有2的h次方- 1个结点的二叉树。 2.图形原创 2022-02-11 13:48:49 · 709 阅读 · 0 评论 -
树 = =
定义: 树:原创 2022-02-07 18:08:48 · 391 阅读 · 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 · 1082 阅读 · 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 · 207 阅读 · 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 · 333 阅读 · 0 评论 -
并查集 = =
(1)朴素并查集 int p[N]; // 存储每个点的祖宗点 //返回x的祖宗节点 int find(int x) { if(p[x] != x) p[x] = find(p[x]); return p[x]; } //初始化,假定节点编号是1~n int 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 · 200 阅读 · 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 · 394 阅读 · 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 · 202 阅读 · 0 评论 -
栈 = =
模板: // tt表示栈顶 int stk[N], tt = 0; // 向栈顶插入一个数 stk[ ++ tt] = x; //从栈顶弹出一个数 tt --; //栈顶的值 stk[tt]; // 判断栈是否为空 if(tt > 0) { ... }原创 2022-01-15 16:19:06 · 169 阅读 · 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 · 322 阅读 · 0 评论
分享