数据结构
会笑的小熊
在努力,在进步
展开
-
哈希表(字符串哈希)
如何求字符串哈希?举例子:求字符串"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 · 592 阅读 · 0 评论 -
哈希表(模拟散列表)
来吧!一文彻底搞定哈希表!_庆哥Java的CSDN技术博客-CSDN博客原创 2022-02-10 15:57:42 · 319 阅读 · 0 评论 -
堆(堆排序)
堆的基本操作(以小根堆为例):1.插入一个数:在堆的最后位置插入一个x,并不断往上移heap[ ++ size] = x; up[size];2.求集合当中的最小值heap[1];3.删除最小值:用堆的最后一个元素覆盖堆顶元素,删除最后一个元素,再downheap[1] = heap[size]; size--; down(1);4.删除任意一个元素heap[k] = heap[size]; size--; down(k); up(k);5.修改任意一个元素原创 2022-02-09 21:03:29 · 588 阅读 · 1 评论 -
堆(模拟堆)
数据结构之堆_Hidden.Blueee的博客-CSDN博客_堆题目:代码:#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 · 284 阅读 · 0 评论 -
并查集(食物链)
食物链:如果知道两个关系:A吃B,B吃C,那么由环形食物链一定可以推出第三种关系:C吃A。并查集里面每一个集合是一棵树的形式,不管两个元素是同类还是异类,即只要两个动物之间有关系,都把它放入一个集合中,最后可以通过这个集合推理出所有动物之间的关系如何通过树推出它们的具体关系?记录一下每个点和根节点之间的关系:三种动物相互循环被吃,用每个点到根节点之间的距离d来表示它和根节点之间的关系。如果d=1:表示它可以吃根节点 如果d=2:表示它被根节点吃 如果d=3:表示它和根节点是同原创 2022-02-09 18:26:34 · 785 阅读 · 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 · 85 阅读 · 0 评论 -
并查集(合并集合)
对于并查集转载一篇非常生动的博客【算法与数据结构】—— 并查集_the_ZED的博客-CSDN博客并查集的两个操作:1.将两个集合合并2.询问两个元素是否在一个集合中基本原理:每一个集合用一棵树来表示,树根的编号就是整个集合的编号。对于每一个节点都存储一下它的父节点是谁,p[x]表示x的父节点。求某一个元素属于哪一个集合时,先找到它的父节点,如果它的父节点不是树根,就继续往上找,直到找到树根为止。最后当前的元素所属的树根编号就是所属集合的编号三个问题:1.如何判断树根:if(p[原创 2022-02-09 13:36:40 · 509 阅读 · 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 · 239 阅读 · 0 评论 -
Trie(Trie字符串统计)
Trie树是用来高效地存储和查找字符串集合的数据结构题目:代码:#include <iostream>using namespace std;const int N = 1e5 + 10;int son[N][26]; // 因为字符串仅包含小写英文字母,所以每个节点的子节点最多为26int cnt [N]; // cnt[]表示以当前这个节点结尾的单词有多少个int idx; // idx表示当前用到的下标。注意:下标是0的点既是根节点,.原创 2022-02-07 23:20:27 · 248 阅读 · 0 评论 -
KMP(KMP字符串)
分享一篇博客有关KMP的详细介绍数据结构KMP算法配图详解(超详细)_哈顿之光的博客-CSDN博客_数据结构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 · 327 阅读 · 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 · 726 阅读 · 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 · 230 阅读 · 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 · 301 阅读 · 0 评论 -
栈(表达式求值)
“表达式求值”问题,两个核心关键点:1.双栈:一个操作数栈,一个运算符栈;2.运算符优先级:栈顶运算符和即将入栈的运算符的优先级比较:如果栈顶的运算符优先级低,新运算符直接入栈如果栈顶的运算符优先级高,先出栈计算,新运算符再入栈题目:代码:#include<iostream>#include<cstring>#include<algorithm>#include<stack>#include<unordered.原创 2022-02-07 14:24:53 · 260 阅读 · 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 · 88 阅读 · 0 评论 -
链表(双链表)
双链表和单链表类似,单链表是每个节点有一个指针指向后面一个节点,双链表是每个节点有两个指针,一个指向前,一个指向后题目:题解:原创 2022-02-06 22:44:31 · 296 阅读 · 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 · 612 阅读 · 0 评论