随笔分类 -  数据结构

摘要:Treap = Tree + Heap Treap的每个节点保存两个值 (1)键值(维持BST的熟悉) (2)优先级(随机生成,维持Heap的属性) 支持六个操作: (1)插入节点 (2)删除节点 (3)查询数x的排名 (4)查询排名为x的数 (5)查询数x的前驱(求树中比x小的最大数) (6)查询 阅读全文
posted @ 2019-09-24 20:16 Hanasaki 阅读(157) 评论(0) 推荐(0)
摘要:一种二分查找树 大多数操作有O(logN)的时间复杂度,但有时很慢 // O(N) 可以快速访问最近访问过的元素(这个结构的核心就是缓存) 每次查找之后将已找到的元素旋到树根部,旋转情况分为Zig-zag(3弯)、Zig-zig(3直)、Zig(2) 阅读全文
posted @ 2019-08-29 16:47 Hanasaki 阅读(123) 评论(0) 推荐(0)
摘要:在后缀数组sa的基础上,还需要rank(sa的反数组,表示后缀i的排名)和height(表示sa[i-1]和sa[i]的最大公共前缀)两个数组。对于满足rank[j]<rank[k]的后缀j和k,LCP(j,k)=RMQ(heght,rank[j]+1,rank[k])。最关键的地方在于优化heig 阅读全文
posted @ 2019-07-26 23:14 Hanasaki 阅读(717) 评论(0) 推荐(0)
摘要:AVL树是一种自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1。因此,插入、查找和删除在平均和最坏情况下的时间复杂度都是O(logn)。 这四个图分别对应AVL树的右旋,左旋,先右再左旋,先左再右旋。 struct node{ int key,height; node *lef 阅读全文
posted @ 2019-07-25 10:47 Hanasaki 阅读(208) 评论(0) 推荐(0)
摘要:后缀数组用来解决无法事先知道查询时的多模板匹配问题代码部分主要是要搞懂各种数组的意义sa是后缀排名到位置的映射x是第一关键字位置到排名的映射y是第二关键字排名到位置的映射 阅读全文
posted @ 2019-07-20 23:43 Hanasaki 阅读(179) 评论(0) 推荐(0)
摘要:AhoCorasick(AC)自动机相当于KMP的加强版,可用于多模板匹配。AC自动机是由Trie加上失配边组成的。 f代表失配边val用来标记终端结点由于同一个结点可能对应多个字符串的结尾,所以last用来表示此结点沿着失配边走的前一个终端结点,last也叫做后缀链接 刘汝佳大神的模板代码: 当然 阅读全文
posted @ 2019-07-16 23:00 Hanasaki 阅读(252) 评论(0) 推荐(0)
摘要:Trie(前缀树)用来保存字符串集合这个树的根结点编号为0,其余结点编号为1开始的正整数ch[i][j]表示结点i的边为j的子结点的编号(不存在则为0),当字符集为全体小写字母时,j的范围sigma_max=26 struct Trie { int ch[maxnode][sigma_size]; int val[maxnode]; int sz; Trie() ... 阅读全文
posted @ 2019-07-01 21:19 Hanasaki 阅读(217) 评论(0) 推荐(0)
摘要:带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值Wk,从根结点到每个叶子结点的长度为Lk,则每个叶子结点的带权路径长度之和就是:WPL = ΣWkLk哈夫曼树的定义:WPL最小的二叉树哈夫曼树的构造:利用堆每次把权值最小的两棵二叉树合并哈夫曼树的特点:1. 没有度为1的结点2. 阅读全文
posted @ 2019-06-26 21:40 Hanasaki 阅读(232) 评论(0) 推荐(0)
摘要:可持久化线段树是一类线段树的实现方式,用于保存线段树的历史版本。从而方便查询区间第k大值。 可持久化线段树可以看作一系列线段树的集合,这样的话就需要n^2的空间,显然无法接受。但是我们发现每次修改都只是改一条链,因此可以用动态开点的方式每次只新建一条链的节点,空间就是nlogn。 阅读全文
posted @ 2019-06-13 22:23 Hanasaki 阅读(108) 评论(0) 推荐(0)
摘要:点修改 Update(x,v): 把Ax修改为v Query(L,R): 计算Min{AL,AL+1,...,AR} minv[o]表示节点o所对应的区间中所有元素的最小值 区间修改 Add(L, R, v): 把AL, AL+1, ..., AR的值全部增加v Query(L, R): 计算子序列 阅读全文
posted @ 2019-06-11 11:24 Hanasaki 阅读(128) 评论(0) 推荐(0)
摘要:为什么要顺着失配边走?:每次沿失配边走都是当前状态的尽可能最大值 T:文本串 P:模式串 f[i]:P的前i长度子串中前后对称的最大长度(不含"全"(j > f[j])) 阅读全文
posted @ 2019-06-10 20:47 Hanasaki 阅读(121) 评论(0) 推荐(0)
摘要:给出一个数组,实现一个数据结构以支持查询操作Query(L, R):计算{AL, AL+1, ... , AR} 阅读全文
posted @ 2019-06-10 11:19 Hanasaki 阅读(181) 评论(0) 推荐(0)
摘要:#define lowbit(x) x&-x//lowbit取二进制最后的10*序列(例:lowbit(1000100)= 100) const int S; int c[S] = {0}; void add(int x, int d){ while(x <= S) c[x] += d,x += l 阅读全文
posted @ 2019-06-10 11:06 Hanasaki 阅读(99) 评论(0) 推荐(0)
摘要:void init(){ for(int i = 1; i <= N; i++) f[i] = i; } int find(int k) { return f[k] == k? k : f[k] = find(f[k]); } int union(int a, int b){ f[find(b)] = find(a); } 阅读全文
posted @ 2019-06-10 10:59 Hanasaki 阅读(115) 评论(0) 推荐(0)