![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 63
基础算法中的数据结构部分的原理及例题
CSDN729180099
这个作者很懒,什么都没留下…
展开
-
数据结构——树状数组与线段树
树状数组 基本介绍 本质:用一维数组模拟一棵树 用途:在O(logn)时间内对一段序列进行以下两种操作 1)给某个位置上的数加上一个数 2)求某个前缀和 核心方程:tr[x] = (x - lowbit(x), x] 即tr[x] = 原数组下标为 (x - lowbit(x), x] 之间的区间和 两个功能对应的代码: //给某个位置上的数加上一个数c for(int i = x; i <= N; i += lowbit(i)) tr[i] += c; //其中N是数组的最大值 //原创 2021-02-03 11:34:48 · 177 阅读 · 1 评论 -
数据结构——哈希表(模拟哈希表、字符串哈希)
1. 哈希表的定义 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 2. 哈希表的用途 把一个较大范围的值域映射到一个较小的范围 3. 哈希表的原理 通过对大数取余运算把一个大数映射到一个较小的范围,若取余结果有冲突则进行处理 4. 两种储存结构 根据对出现冲突时的不同处理方式,把哈希表分为两类:开放寻址法、拉链法 5. 两种模板 (1) 拉链法 int h[N],原创 2020-08-20 19:17:02 · 381 阅读 · 0 评论 -
数据结构——堆(C++版)
堆的特征 1)堆中某个节点的值总是不大于或不小于其父节点的值;将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。 2)堆总是一棵完全二叉树。 堆借结构中用到二叉树的一些性质 1)设任意一个节点为x则该节点的左儿子是2x,右儿子是2x+1 2)叶子节点占全部节点的二分之一 模板 // h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1 // ph[k]存储第k个插入的点在堆中的位置 // hp[k]存储堆中下标是k的点是第几个插入的 int h..原创 2020-07-30 15:43:14 · 248 阅读 · 0 评论 -
数据结构——并查集(C++)
并查集数据结构的用途 快速的将两个集合合并或者询问两个元素是否在同一个集合当中 基本原理 每个集合用一棵树来表示。树根的编号就是整个集合的编号,每个节点存储它的父节点,p[x]表示x的父节点。在查找根节点的同时对路径上的节点进行“路径压缩”优化(使路径上的所有节点的p[x]都指向根节点) 模板 (1)朴素并查集: int p[N]; //存储每个点的祖宗节点 // 返回x的祖宗节点 int find(int x) { if (p[x] != x) p[.原创 2020-07-30 15:42:54 · 164 阅读 · 0 评论 -
数据结构——Trie树(C++版)
Trie树用途 高效的储存和查找字符串集合的数据结构 模板 int son[N][26], cnt[N], idx; // 0号点既是根节点,又是空节点 // son[][]存储树中每个节点的子节点 // cnt[]存储以每个节点结尾的单词数量 // 插入一个字符串 void insert(char *str) { int p = 0; for (int i = 0; str[i]; i ++ ) { int u = str[i] - 'a'; .原创 2020-07-28 09:28:47 · 257 阅读 · 0 评论 -
数据结构——KMP(C++版)
List item原创 2020-07-26 00:05:58 · 151 阅读 · 0 评论 -
数据结构——单调栈和单调队列(C++版)
单调栈 栈中的元素从栈底到栈顶单调 模板 常见模型:找出每个数左边离它最近的比它大/小的数 int tt = 0; for (int i = 1; i <= n; i ++ ) { while (tt && check(stk[tt], i)) tt -- ; stk[ ++ tt] = i; } 例题:单调栈 给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。 输入格式 第一行包含整数N,表示数列长度。 第二行包含N个整数,表示.原创 2020-07-23 21:54:48 · 342 阅读 · 0 评论 -
数据结构——栈和队列(C++版)
栈 先进后出 模板 // tt表示栈顶下标 int stk[N], tt = 0; // 向栈顶插入一个数 stk[ ++ tt] = x; // 从栈顶弹出一个数 tt -- ; // 栈顶的值 stk[tt]; // 判断栈是否为空 if (tt > 0) { } 例题:模拟栈 实现一个栈,栈初始为空,支持四种操作: (1) “push x” – 向栈顶插入一个数x; (2) “pop” – 从栈顶弹出一个数; (3) “empty” – 判断栈是否为空; (4) “query”.原创 2020-07-23 14:46:07 · 193 阅读 · 0 评论 -
数据结构——双链表(C++版)
基本思路 用三个数组模拟双链表,提高时间效率 模板 // e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点 int e[N], l[N], r[N], idx; // 初始化 void init() { //0是左端点,1是右端点 r[0] = 1, l[1] = 0; idx = 2; } // 在节点a的右边插入一个数x void insert(int a, int x) { e[idx] = x; l[id.原创 2020-07-23 13:48:08 · 269 阅读 · 0 评论 -
数据结构——单链表(C++版)
模拟链表 用两个数组模拟动态链表,因为C++中动态内存申请太慢,所以用静态的数组模拟动态链表,提高算法效率。 基本思路 与动态链表的操作原理和步骤大致相同,只不过是用数组代替节点,用变量代替指针 模板 // head存储链表头,e[]存储节点的值(即数据域),ne[]存储节点的next指针(即指针域),idx表示当前用到了哪个节点 int head, e[N], ne[N], idx; // 初始化 void init() { head = -1; idx = 0; } // 在链表.原创 2020-07-20 00:27:59 · 368 阅读 · 0 评论