数据结构与算法
文章平均质量分 57
泥烟
邮箱[email protected],
泥烟の导航站: https://knight02-bit.github.io/
展开
-
对惰性提升快速降级FIFO(QD-LP-FIFO)的理解和简易代码实现
LRU算法的核心思想是“最近最少使用”, 它假设最近被访问的数据在未来也很可能被访问。但是, LRU算法在每次数据被访问时都会更新数据的“最近性”, 这可能会导致一些其实并不那么“热门”的数据被错误地认为是“热门”的, 因为它们恰好在短时间内被频繁访问。而FIFO算法加上懒惰提升(Lazy Promotion, LP)的策略, 则是只在数据即将被移出缓存时, 才判断它是否真的“热门”。如果一个数据在缓存中时被多次请求, 这表明它很可能是一个真正受欢迎的对象, 那么在它即将被移出缓存的时候, FIFO算法原创 2024-05-07 21:46:43 · 919 阅读 · 0 评论 -
[KMP] 对最长前后缀匹配表生成步骤的理解
字符串匹配的KMP算法 - 阮一峰的网络日志 (ruanyifeng.com)http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html没接触过kmp可以先看看这个👆例题:输入样例:3aba5ababa输出样例:0 2代码实现:#include <iostream>#include <cstring>using na.原创 2022-03-30 18:04:14 · 385 阅读 · 0 评论 -
对筛质数三种方法的理解[普通筛,诶氏筛,线性筛]
1.普通筛法 O(nlogn)2.诶氏筛法 O(nloglogn)3.线性筛法 O(n)时间复杂度对比原创 2022-03-22 20:44:07 · 440 阅读 · 3 评论 -
数据结构与算法基础梳理
总是用完就忘, 觉得有必要整理一下数据结构与算法的基础知识点(再难些的也不会)以下大部分(除了数学)是用过但需要时间来巩固, 其实界限并不是很明显, 很多思想都是互通的(虽然梳理出的图是通的,但脑子还没有通hhh)PDF文件:https://wwe.lanzoul.com/ibi4K01on7sj密码:9xqd...原创 2022-03-19 12:04:17 · 499 阅读 · 1 评论 -
[数据结构] 单链表如何判环以及求环的长度,入口
目录如何判环?如何求环的长度?如何求环的入口呢?示例如何判环?思路:利用两个移动速度不同的指针,若在均不为空的情况下相遇,则存在环如何求环的长度?思路:若存在环,那么快慢指针从相遇点重新出发到再次相遇的过程中, 一定是慢指针走了一圈,快指针走了两圈, 慢指针所走过的步数即为环的长度如何求环的入口呢?推理:所以,我们在相遇点位和链表的起点分别设立两个速度相同的指针,当他们相遇时即在环的入口示例其中测试数据的关系如图...原创 2021-12-21 23:48:52 · 580 阅读 · 0 评论 -
[停更一周,我干了什么] [C++/QT] 一个基于avl树,trie树,哈希散列表的英汉词典
目录结构关系对三种数据结构的理解1.AVL(自平衡二叉排序树)四种旋转场景AVL树的删除操作的妙处测试效果2.Trie树(字典树)测试效果3.哈希散列表图形界面方面部分代码数据结构相关avl.htrie.htrie.cpphashtable.hhashtable.cpp界面相关menu.hmenu.cpp最终效果遇到的主要问题1.链接器工具错误 LNK20052.C2011 class类型重定义解决办法原创 2021-12-16 23:31:20 · 1616 阅读 · 5 评论 -
复习数据结构之简单排序(快排,直插,希尔,选择,冒泡)
写了一遍自己的模板,增加熟练度学校不考复杂一些的排序,暂就写这几种#include <iostream>#define Size 1010using namespace std;class UpSort{ public: UpSort(){ cin >> lenth; for(int i = 1; i <= lenth; i ++) cin >> a[i]; } void quickSort(); //快速排序 .原创 2021-12-07 11:28:42 · 805 阅读 · 0 评论 -
品味C++实现AVL树的删除操作
抛开细节,如果真的找到了那个要删除的节点,问题就转化为,如何使删除完的树继续平衡呢,利用二叉排序树的特点——左子树比根小,右子树比根大 ,找到左子树中的最大值或者右子树中的最小值来替换他,因为在局部子树的最值节点,都是在边缘地带,牵扯的鸡毛蒜皮之事都远小于拖家带口的节点❓那么,该选左子树中的最大值还是右子树中的最小值呢?随便都可以吗答案是否定的,不要因小失大,小——删除一个节点;大——整棵二叉自平衡二叉查找树的平衡性原创 2021-12-05 18:16:32 · 1119 阅读 · 0 评论 -
C++实现AVL树的四种旋转
结构template<typename T>struct AVLNode{ T data; int height; AVLNode* lchild, *rchild; AVLNode(T dt, AVLNode* l, AVLNode* r):data(dt),lchild(l),rchild(r){}};template<typename T>class AVLTree{ public: AVLTree()..原创 2021-12-02 23:36:49 · 671 阅读 · 1 评论 -
C++实现Trie 树
Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起主要有两个操作,一个是将字符串集合构造成 Trie 树另一个是在 Trie 树中查询一个字符串我们不可否认,Trie 树可能很浪费内存,但是确实非常高效。原创 2021-11-30 17:36:46 · 373 阅读 · 0 评论 -
[PTA练习] (★还原树)完全二叉树的层序遍历 (25 分)
完全二叉树的层序遍历 (25 分)一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为D的,有N个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前N个结点,这样的树就是完全二叉树。给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。输入格式:输入在第一行中给出正整数N(≤30),即树中结点个数。第二行给出后序遍历序列,为N个不超过 100 的正整数。同一行中所有数字都以空格分隔。输出格式:在一行中输出该树的层序遍历...原创 2021-11-08 18:51:35 · 423 阅读 · 0 评论 -
[D-OJ练习] (★Prim路径输出)使用邻接矩阵实现最小生成树Prim算法
用邻接矩阵存储无向图,实现最小生成树Prim算法,图中边的权值为整型,顶点个数少于10个。输入描述首先输入图中顶点个数和边的条数;再输入顶点的信息(字符型);再输入各边及其权值。输出描述输出从编号为0的顶点开始的Prim算法最小生成树中的各边及其权值,每条边及其权值占一行。输入样例5 7A B C D E0 1 60 2 20 3 11 2 41 3 32 4 63 4 7输出样例A D 1A C 2D B 3C E 6本以为在p原创 2021-11-04 12:45:13 · 734 阅读 · 0 评论 -
[收藏不迷路] 搜索与图论基础
DFS[DFS模板题] 全排列以及n-皇后问题_☆迷茫狗子的秘密基地☆-CSDN博客目录排列数字利用一维数组标记利用二进制标记n-皇后问题对于关键操作的理解排列数字输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1利用一维数组标记#include <iostream>using namespace std;const int N = 10;int n,path[N];bool b[N];void dfs(int m){ if(m == n){..https:/原创 2021-10-31 18:03:49 · 367 阅读 · 3 评论 -
[总结]单源最短路(朴素Dijkstra)与最小生成树(Prim,Kruskal)
朴素Dijkstra时间复杂度:O(n2+m) , n表示点数,m表示边数稠密图???? 存储形式:邻接矩阵模板:g[x][y]存的是初始化时边权,dist[i]存的是1到i的最短距离,也就是我们的目标求1 - >n的最短路径1.初始化距离 dist[1] = 0, d[i] = +∞2.for i 1~n: t ←不在集合s中的,距离最近的点 s ←t ...原创 2021-10-28 23:55:55 · 411 阅读 · 0 评论 -
[邻接表形式]有向图的建立与深度,广度遍历
目录DirectedGraph类的构成构造函数析构函数深度优先遍历广度优先遍历DirectedGraph类的构成const int N = 10;int visit[N];struct ConnectNode{ //邻接节点的坐标 int site; ConnectNode* next;};template<typename DataType>struct VertexNode //顶点表{ DataType value;原创 2021-10-26 00:18:32 · 361 阅读 · 0 评论 -
[邻接矩阵形式]无向图的建立与深度,广度遍历
目录MGraph类构造函数深度优先遍历广度优先遍历MGraph类const int N = 10;int visit[N]; // 顶点是否被访问template<typename DataType>class MGraph//无向图{public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DF(int x); //深度优先遍历 void BF(int x);原创 2021-10-24 23:41:34 · 3311 阅读 · 1 评论 -
2021辽宁省大学生程序设计竞赛 C D E F G I L
WAWA大哭,弱鸡七题摘银准备退役...感谢队友方大师和棋兄的鼎力相助C-传染病统计_2021辽宁省大学生程序设计竞赛(正式赛) (nowcoder.com)https://ac.nowcoder.com/acm/contest/22352/CC 传染病统计https://ac.nowcoder.com/acm/contest/22352/C 题目描述阿强来到大街上,街上有 N 个人,编号为 1 ∼N 。简单起见,我们把每个人都看成一条线上的一个点。对每个合法的 i,第 i ...原创 2021-10-23 19:08:17 · 874 阅读 · 0 评论 -
[数组模拟] AcWing 847. 图中点的层次
输入样例:4 51 22 33 41 31 4输出样例:1思路:所有边的长度都是1,权值相同求有向图最短路,广度优先即可,因为要求的是1~n的距离,我们另设一个数组d[i]来表示1~i之间的距离有关边的添加思路可以参考数组实现单双链表的快速操作[时间复杂度为O(1)]_☆迷茫狗子的秘密基地☆-CSDN博客https://blog.csdn.net/qq_39391544/article/details/120680300#includ...原创 2021-10-26 18:38:48 · 133 阅读 · 0 评论 -
★★★[并查集变形] AcWing 240. 食物链 题解
输入样例:100 71 101 1 2 1 22 2 3 2 3 3 1 1 3 2 3 1 1 5 5输出样例:3思路:我们可以将食物链的环状捕食关系用并查集的形式表现出来,印射成某节点距根节点的距离取余3的值(0 / 1 / 2 ),差值为1的即为捕食与被捕食的关系,如 2 - > 1 - > 0 ->2表示的是2吃1, 1吃0(0可以吃2 )重点:1.#include <iostream>...原创 2021-10-20 23:42:10 · 130 阅读 · 0 评论 -
[图解] 数组模拟Trie树
输入样例:5I abcQ abcQ abI abQ ab输出样例:101#include <iostream>using namespace std;const int N = 100010;int son[N][26], cnt[N], idx;char str[N];void insert(char *str){ int p = 0; for (int i = 0; str[i]; i ++ ) ...原创 2021-10-15 00:02:33 · 202 阅读 · 0 评论 -
[D-OJ练习] 求二叉树的深度
采用先序法建立一棵二叉树,设计求该二叉树的深度,二叉树的数据域类型为字符型,扩展二叉树的叶子结点用‘#’表示,要求可以求多棵二叉树的深度,当二叉树的深度为0时程序结束。输入描述循环输入多棵扩展二叉树的先序遍历序列,每棵树占一行,以回车结束,每棵二叉树中结点之间以空格隔开输出描述输出各二叉树的深度,每次输出后面都换行输入样例A B # # C D # E # F # # G H # I K # # # #A B D H # # I #...原创 2021-10-12 20:46:44 · 671 阅读 · 0 评论 -
单调栈和单调队列
输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2普通做法,时间复杂度O(n^2),可能会TLE#include <iostream>using namespace std;const int N = 1e5+10;int st[N];int main(){ int n,x; int res; scanf("%d", &n); for (int i = 0; i < n; i ++ )...原创 2021-10-10 12:45:22 · 147 阅读 · 0 评论 -
数组实现单双链表的快速操作[时间复杂度为O(1)]
826. 单链表 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/828/#include <iostream>using namespace std;const int N = 1e5+10;int e[N],ne[N],head,idx;int main(){ int n,k,x; char op; head = -1, idx = 0; cin >>原创 2021-10-09 22:30:34 · 193 阅读 · 0 评论 -
[BFS模板题] 数组版/STL版 以及记录路线
目录题目用数组模拟队列运用queue拓展:记录路线题目输入样例:5 50 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0输出样例:8用数组模拟队列#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 110;...原创 2021-10-06 23:23:52 · 250 阅读 · 0 评论 -
[DFS模板题] 全排列以及n-皇后问题
目录排列数字利用一维数组标记利用二进制标记n-皇后问题对于关键操作的理解排列数字输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1利用一维数组标记#include <iostream>using namespace std;const int N = 10;int n,path[N];bool b[N];void dfs(int m){ if(m == n){..原创 2021-10-05 19:43:20 · 164 阅读 · 0 评论 -
[★状态压缩DP★] AcWing 291. 蒙德里安的梦想
输入样例:1 21 31 42 22 32 42 114 110 0输出样例:10123514451205#include<iostream>#include<cstring>#include<vector>#include<algorithm>using namespace std;typedef long long LL;const int N = 12, M = 1<...原创 2021-10-04 21:11:20 · 133 阅读 · 0 评论 -
[初学区间DP时的意识流] AcWing 282. 石子合并
例题:282. 石子合并 - AcWing题库输入样例:41 3 5 2输出样例:22思路简述:如何求每一段连续区间的最小代价呢?①将其分为两部分,举个栗子,这个区间左右边界下标分别为 3 , 10, 那么我们依次将其分为两部分(每部分至少有一个元素),如下九种情况3 | 4~103~4 | 5~103~5 | 6~10……3~9 | 10②那么我们如何确立左右边界下标呢? 首先我们需要明确我们要处理...原创 2021-09-29 19:59:09 · 112 阅读 · 0 评论 -
最长上升子序列的溯源和二分优化
目录(数据范围为1~1000时)最长上升子序列的溯源(数据范围为1~100000时)(数据范围为1~1000时)输入样例:73 1 2 1 8 5 6输出样例:4#include <iostream>#include <algorithm>using namespace std;const int N = 1010;int a[N],f[N];int main(){ int n; cin >...原创 2021-09-28 22:17:20 · 117 阅读 · 0 评论 -
[AcWing算法基础课] 五.动态规划
包括背包问题,线性DP,区间DP,计数类DP,数位统计DP,状态压缩DP,树形DP,记忆化搜索等内容。目录背包问题01背包完全背包多重背包分组背包背包问题01背包2. 01背包问题 - AcWing题库#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 1010;int v[N],w原创 2021-10-11 22:15:47 · 150 阅读 · 0 评论 -
多重背包问题的二维优化
5. 多重背包问题 II - AcWing题库输入样例4 51 2 32 4 13 4 34 5 2输出样例:10朴素做法:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int M = 110;int v[M],w[M],s[M],f[M][M];int N,V;int main(){...原创 2021-09-23 13:23:42 · 216 阅读 · 0 评论 -
[AcWing算法基础课] 一.基础算法
Algorithms + Data Structures = Programs.——Niklaus Wirth本章包括排序、二分、高精度、前缀和与差分、双指针算法、位运算、离散化、区间合并等内容目录一.排序快速排序归并排序模板二.二分三.高精度四.前缀和与差分五.双指针算法六.离散化七.区间合并一.排序 快速排序 AcWing 785. 快速排序#include<iostream>using nam...原创 2021-09-15 16:34:06 · 3468 阅读 · 0 评论 -
STL中unique原理实现 及示例
vector<int>::iterator unique(vector<int>& a){ int t = 0; for(int i=0; i<a.size(); i++) if(!i || a[i]!=a[i-1]) a[t++] = a[i]; return a.begin()+t;}int main(){ ... a.erase(unique(a),a.end());...原创 2021-09-14 22:25:04 · 240 阅读 · 0 评论 -
利用离散化求区间和
拿AcWing802. 区间和举例输入样例:3 31 23 67 51 34 67 8输出样例:805从x的取值范围可见这类题与前缀和的应用是有区别的,为了减少大量无用的操作,将其离散化思路:1.将所有出现的坐标(包括想求的边界)记下,因为这其中可能会有很大的数,导致求前缀和的时候经历许多对应值为零的坐标,尽可能在后续处理中避免这些坐标便是优化的方向2.将1中记下的数进行排序,去重,并把这些坐标映射到1 ... n上,这并不难做到,比如坐..原创 2021-09-13 23:50:20 · 244 阅读 · 0 评论 -
[练习] 高精度加减乘除
#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;vector<int> A,B;bool cmp(vector<int>& A,vector<int>& B){ if(A.size()!=B.size()) return A.size()>.原创 2021-09-09 23:28:20 · 179 阅读 · 0 评论 -
[练习](一二维 )前缀和 与 差分
目录AcWing 795. 前缀和AcWing 796.子矩阵的和AcWing 797.差分AcWing 798.差分矩阵AcWing 795. 前缀和输入样例:5 32 1 3 6 41 21 32 4输出样例:3610#include <iostream>#include <cstring>#include <algorithm>using namespace std;con..原创 2021-09-08 21:44:14 · 241 阅读 · 0 评论 -
递归快速幂与非递归快速幂模板
递归快速幂(对大素数取模)typedef long long ll;ll Quick_pow(ll a,int n){ if(n == 0) return 1;//出口为"a^0=1" else if(n % 2 == 0) return Quick_pow(a, n-1)*a; else{ ll temp = Quick_pow(a, n/2); return temp*temp; }}虽然简洁,但会产生额外的空间开销。我们可以把递归改写为循环,来避免...原创 2021-08-22 21:33:05 · 154 阅读 · 2 评论 -
[转载]如何优雅的处理边界条件?一定要数据有序时才能使用二分法吗?
基础算法一:二分法,你思考过这些问题吗? (qq.com)转自公众号:猿六学算法转载 2021-08-17 16:14:07 · 156 阅读 · 0 评论 -
[转载]由数据范围反推算法复杂度以及算法内容
转自y总:由数据范围反推算法复杂度以及算法内容转载 2021-07-10 23:27:38 · 115 阅读 · 0 评论 -
初识二分法
二分查找只能用在插入、删除操作不频繁,一次排序多次查找的场景中。针对动态变化的数据集合,二分查找将不再适用。数据量太小不适合二分查找,优势微乎其微,杀鸡用牛刀,遍历就够了数据量太大也不适合二分查找。二分查找底层依赖数组这种数据结构的,所以太大的数据用数组存储就比较吃力,甚至内存不足以支持例:在一个给定的有序数组[以下默认为升序]中快速寻找某个数的下标循环实现:#include<iostream>#include<algorithm>u...原创 2021-07-24 23:59:48 · 156 阅读 · 0 评论 -
[C语言] 单向链表的建立,头尾插,打印,删除及逆序操作(注释)
#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct Node{ int data; struct Node* next;}N;//创建节点 N* MakeNode(int d){ N* node = (N*)malloc(sizeof(N));//分配内存 if(NULL==node){ printf("Fail to malloc\n"); ret...原创 2021-08-16 18:27:10 · 169 阅读 · 0 评论