
数据结构
文章平均质量分 50
数据结构
DearLife丶
“翻滚的时代浪潮中,曾有多少灵魂抗争”
展开
-
C++ ——常用STL容器
摘要vector 变长数组,倍增的思想pair 存储二元组string 字符串,substr(), c_str()queue 队列, push(),pop(),front()priority_queue, 优先队列,push(),pop(),top()deque,双端队列stack 栈, push(),pop(),top()set,map,multiset,multimap, 基于平衡二叉树(红黑树),动态维护有序序列unordered_set, unordered_ma原创 2021-01-22 13:10:54 · 394 阅读 · 0 评论 -
字符串哈希
字符串哈希法是一个处理字符串的利器,可以简化很多字符串的问题。有时用这个方法比KMP更有优势。什么是字符串前缀哈希?举个“栗子”就明白!例如 : str = “ABCDEFG”H(1) = "A"的哈希值H(2) = "AB"的哈希值H(3) = "ABC"的哈希值``` ```步骤1.把字符串看成是一个p进制的数,把字符串中的每个字符看成是p进制数中的每一位;2.把p进制的数转化成10进制的数 mod Q;(不进行取模操作的话得到的数字可能比较大,存储会不方便)原创 2021-01-21 17:39:14 · 237 阅读 · 0 评论 -
哈希表(散列表)
散列函数和散列地址:在记录的存储位置p和其关键字key之间建立一个确定的对应关系H,使p = H(key),称这个对应关系H为散列函数,p为散列地址。散列表:一个有连续的地址空间,用以存储按散列函数计算得到相应散列地址的数据记录。通常散列表的存储空间是一个一维数组,散列地址是数组的下标。冲突和同义词:对不同的关键字可能得到同一散列地址,即key1≠key2,而H(key1) = H(key2),这种现象称为冲突。具有相同函数值的关键字对该函数来说称作同义词,key1与key2互称为同义词。散列查原创 2021-01-21 13:24:19 · 876 阅读 · 0 评论 -
堆(模拟堆)
如何手写一个堆?性质:堆的结构是一棵完全二叉树小根堆:每个节点小于等于左右孩子节点(递归定义),因此根节点就是最小值。大根堆与之相反 。堆的存储:用一维数组存储,根节点下标为1,x的左孩子为2x,右孩子为2x + 1。(下标从1开始)基本操作:down(x) 向下调整up(x) 向上调整常见应用:1.插入一个数在整个堆的最后一个位置插入x, heap[++size] = x;然后将这个数x不断往上移动,up(x);2.求集合中的最..原创 2021-01-20 16:59:26 · 143 阅读 · 0 评论 -
并查集
并查集1.将两个集合合并2.询问两个元素是否在一个集合中近乎O(1)基本原理每个集合用一棵树来表示,树根的编号即为整个集合的编号。并存储每个节点的父节点,p[x]表示x的父节点。问题1.如何判断树根:if(p[x] = x)问题2.如何求x的集合编号:while(p[x] != x) x = p[x]; (当查找元素是否在某个集合中时,依次向上找父节点,直到找到树根,就知道该元素属于哪个集合了。)问题3.如何合并两个集合:px是x的集合编号,py是y的集合..原创 2021-01-19 15:19:07 · 168 阅读 · 0 评论 -
Trie树(字典树)
Trie树:高效地存储和查找字符串集合的数据结构。AcWing 835.Trie字符串统计维护一个字符串集合,支持两种操作:“I x”向集合中插入一个字符串x; “Q x”询问一个字符串在集合中出现了多少次。共有N个操作,输入的字符串总长度不超过 105105,字符串仅包含小写英文字母。输入格式第一行包含整数N,表示操作数。接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。输出格式对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出原创 2021-01-18 20:39:03 · 156 阅读 · 0 评论 -
KMP算法
AcWing 831.#include <iostream>using namespace std;const int N = 100010,M = 1000010;int n,m;int ne[N];char p[N],s[M];int main(){ cin >> n >> p + 1 >> m >> s + 1; //求next数组的值 for(int i = 2,j = 0.原创 2021-01-14 15:40:53 · 146 阅读 · 0 评论 -
单调队列——滑动窗口
单调队列优化: 以输出每个位置滑动窗口中的最小值为例,在当前“窗口”时,若两个数满足:i<j,ai>aj, 那么ai永远不会作为答案输出,我们可以把ai删掉(出队),删除这样的逆序对后,队列中的元素就是一个单调递增的序列,在队尾插入x时,判断队尾元素>=x,就将队尾元素删除(出队)。这时,我们输出队头元素,就是滑动窗口中的最小值。您的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。第一行输出,从左至右,每个位置滑动窗口中的最小值。第二行输出,从左至右,每个位置滑动窗口中的最大值。原创 2021-01-13 22:03:48 · 433 阅读 · 0 评论 -
单调栈及其应用
单调栈常见题型:求一个数左边第一个比它小的数,或右边第一个比它大的数。暴力做法:外层循环枚举每一个元素x,内层循环找到x左边第一个比它小的数。for(int i = 0;i < n; i ++ ){ for(int j = i - 1; j >= 0; j -- ) { if (a[j] < a[i]) { cout << a[i]; } break;原创 2021-01-13 10:51:46 · 161 阅读 · 0 评论 -
栈和队列(模板)
数组模拟栈#include <iostream>using namespace std;const int N = 100010;int stk[N],tt;//插入stk[ ++ tt] = x;//弹出tt -- ;//判断栈是否为空if(tt > 0) not empty;else is empty;//栈顶stk[tt];数组模拟队列#include <iostream>using namespace s..原创 2021-01-13 10:18:23 · 177 阅读 · 0 评论 -
数组模拟链表——双链表
双链表模板#include <iostream>using namespace std;const int N = 100010;// e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点int e[N],l[N],r[N],idx;int m;//初始化void init(){ //0代表左端点,1代表右端点 l[1] = 0,r[0] = 1; idx = 2;}//在第k个插入的数右原创 2021-01-13 09:52:35 · 216 阅读 · 0 评论 -
数组模拟链表——单链表
单链表模板//数组模拟链表#include <iostream>using namespace std;const int N = 100010;int head,idx,e[N],ne[N];// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点//初始化void init(){ head = -1; idx = 0;}//在头结点处插入一点void add_to_head(int原创 2021-01-12 11:50:08 · 230 阅读 · 0 评论