
数据结构
会笑的小熊
在努力,在进步
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
哈希表(字符串哈希)
如何求字符串哈希? 举例子:求字符串"ABCD"的哈希值,"ABCD"字符串看成是P进制的(1234)p,其对应的十进制数就是1*p^3+2*p^2+3*p^1+4*p^0,这样就可以把一个字符串转化为一个数字。但是这个数字可能比较大不好存储,所以要对这个数字模一个比较小的数Q,通过取模就可以把这个数即这个字符串映射到0~Q-1之间的一个数。 注意: 1.不能把字母映射成0。例如:A如果映射成0, A (0)p=0,AA (00)p=0 不对 2.减少哈希冲突:经验值p=131或13331,Q=2^原创 2022-02-11 16:09:05 · 749 阅读 · 0 评论 -
哈希表(模拟散列表)
来吧!一文彻底搞定哈希表!_庆哥Java的优快云技术博客-优快云博客原创 2022-02-10 15:57:42 · 421 阅读 · 0 评论 -
堆(堆排序)
堆的基本操作(以小根堆为例): 1.插入一个数:在堆的最后位置插入一个x,并不断往上移 heap[ ++ size] = x; up[size]; 2.求集合当中的最小值 heap[1]; 3.删除最小值:用堆的最后一个元素覆盖堆顶元素,删除最后一个元素,再down heap[1] = heap[size]; size--; down(1); 4.删除任意一个元素 heap[k] = heap[size]; size--; down(k); up(k); 5.修改任意一个元素原创 2022-02-09 21:03:29 · 661 阅读 · 1 评论 -
堆(模拟堆)
数据结构之堆_Hidden.Blueee的博客-优快云博客_堆 题目: 代码: #include <iostream> #include <algorithm> #include <string.h> using namespace std; const int N = 100010; int h[N], ph[N], hp[N], cnt; void heap_swap(int a, int b) { swap(ph[hp[a]],ph[hp[b原创 2022-02-09 20:24:25 · 335 阅读 · 0 评论 -
并查集(食物链)
食物链:如果知道两个关系:A吃B,B吃C,那么由环形食物链一定可以推出第三种关系:C吃A。 并查集里面每一个集合是一棵树的形式,不管两个元素是同类还是异类,即只要两个动物之间有关系,都把它放入一个集合中,最后可以通过这个集合推理出所有动物之间的关系 如何通过树推出它们的具体关系? 记录一下每个点和根节点之间的关系: 三种动物相互循环被吃,用每个点到根节点之间的距离d来表示它和根节点之间的关系。 如果d=1:表示它可以吃根节点 如果d=2:表示它被根节点吃 如果d=3:表示它和根节点是同原创 2022-02-09 18:26:34 · 866 阅读 · 0 评论 -
并查集(连通块中点的数量)
连通块:简单来说,就是从点a可以走到点b,也可以从点b走到点a,就说两个点在一个连通块中 思路:用一个集合来维护两个连通块,一个连通块中的点就在一个集合中。当在两个集合之间连一条边时,其作用就是把两个集合合并。其原理上一篇相似 题目: 代码: #include<iostream> using namespace std; const int N = 1e5 + 10; int p[N],s[N]; //s[]表示每一个集合里点的数量,注意不要用size,避免关键字 int原创 2022-02-09 14:58:46 · 145 阅读 · 0 评论 -
并查集(合并集合)
对于并查集转载一篇非常生动的博客【算法与数据结构】—— 并查集_the_ZED的博客-优快云博客 并查集的两个操作: 1.将两个集合合并 2.询问两个元素是否在一个集合中 基本原理: 每一个集合用一棵树来表示,树根的编号就是整个集合的编号。对于每一个节点都存储一下它的父节点是谁,p[x]表示x的父节点。求某一个元素属于哪一个集合时,先找到它的父节点,如果它的父节点不是树根,就继续往上找,直到找到树根为止。最后当前的元素所属的树根编号就是所属集合的编号 三个问题: 1.如何判断树根:if(p[原创 2022-02-09 13:36:40 · 619 阅读 · 0 评论 -
Trie(最大异或对)
题目: 暴力做法(会超时): 先固定其中一个数Ai,然后从A1~An中选出一个值Aj,使得Ai^Aj最大,枚举Ai #include<iostream> using namespace std; const int N=10e5+10; int n,a[N]; int main(){ cin>>n; for(int i=0;i<n;i++)cin>>a[i]; int res=0; for(int i=0;i<...原创 2022-02-09 12:21:31 · 295 阅读 · 0 评论 -
Trie(Trie字符串统计)
Trie树是用来高效地存储和查找字符串集合的数据结构 题目: 代码: #include <iostream> using namespace std; const int N = 1e5 + 10; int son[N][26]; // 因为字符串仅包含小写英文字母,所以每个节点的子节点最多为26 int cnt [N]; // cnt[]表示以当前这个节点结尾的单词有多少个 int idx; // idx表示当前用到的下标。注意:下标是0的点既是根节点,.原创 2022-02-07 23:20:27 · 339 阅读 · 0 评论 -
KMP(KMP字符串)
分享一篇博客有关KMP的详细介绍数据结构KMP算法配图详解(超详细)_哈顿之光的博客-优快云博客_数据结构kmp算法详解 题目: 代码: #include <iostream> using namespace std; const int N = 100010, M = 1000010; int n, m; int ne[N]; char s[M], p[N]; int main() { cin >> n >> p + 1 >> m原创 2022-02-07 21:52:13 · 372 阅读 · 0 评论 -
单调队列(滑动窗口)
思路: 1.思考用普通队列该怎么做 2.将对了中没有用的元素删掉,最终使队列具有单调性 3.可以用O(1)的时间从队头/队尾取出最值 题目: 代码: # include<iostream> using namespace std; const int N = 1000010; int a[N], q[N];//a[]表示原数组,q[]表示单调队列,hh表示队头,tt表示队尾 int main() { int n, k; cin >> n >&原创 2022-02-07 17:55:44 · 844 阅读 · 0 评论 -
单调栈(单调栈)
利用栈先进后出的性质,定义一个栈为空,当i指针每往右移动一个数,就往栈里加入一个数,即栈里存入i指针左侧的所有数,每一次从栈顶往下找,找到第一个比i小的数就停下来 思考:哪些元素不会作为答案输出? 栈中如果a[3]>=a[5],那么a[3]不会作为答案输出。所以如果栈中存在a[x]>=a[y]&&x<y这种逆序关系,那么a[x]可以被删掉,最终栈中存入的是单调递增序列 借助某位大佬的图来理解一下! 题目: 代码: #include<ios..原创 2022-02-07 16:25:06 · 271 阅读 · 0 评论 -
队列(模拟队列)
题目: 代码: #include <iostream> using namespace std; const int N = 100010; int q[N],hh,tt=-1; //hh表示队头,tt表示队尾 int main() { int n; cin >> n; while(n--) { string s; cin >> s; //在队尾插入元素原创 2022-02-07 14:58:31 · 338 阅读 · 0 评论 -
栈(表达式求值)
“表达式求值”问题,两个核心关键点: 1.双栈:一个操作数栈,一个运算符栈; 2.运算符优先级:栈顶运算符和即将入栈的运算符的优先级比较: 如果栈顶的运算符优先级低,新运算符直接入栈 如果栈顶的运算符优先级高,先出栈计算,新运算符再入栈 题目: 代码: #include<iostream> #include<cstring> #include<algorithm> #include<stack> #include<unordered.原创 2022-02-07 14:24:53 · 367 阅读 · 0 评论 -
栈(模拟栈)
栈和队列 题目: 代码: #include <iostream> using namespace std; const int N = 100010; int st[N]; int top = -1; int n; int main() { cin >> n; while(n--) { string s; cin >> s; //插入 if(s == "push") .原创 2022-02-07 12:49:52 · 130 阅读 · 0 评论 -
链表(双链表)
双链表和单链表类似,单链表是每个节点有一个指针指向后面一个节点,双链表是每个节点有两个指针,一个指向前,一个指向后 题目: 题解:原创 2022-02-06 22:44:31 · 339 阅读 · 0 评论 -
链表(单链表)
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。 题目: 题解: //head表示头节点的下标 //e[i]表示节点i的值 //ne[i]表示节点i的next指针值多少 //idx存储当前已经用到了哪个点 int head,e[N],ne[N],idx; //初始化 void init(..原创 2022-02-06 19:00:29 · 682 阅读 · 0 评论