
数据结构
tiny_Sean
这个作者很懒,什么都没留下…
展开
-
动态规划
思想 动态规划是一种用来解决一类最优化问题的算法思想过。 它将一个复杂的问题分解为若干个子问题,通过综合子问题的最优解来得到原问题的解。 概念 如果一问题可以被分解为若干个子问题,且这些子问题会重复出现,那么就称这个问题拥有重叠子问题 如果一问题可以由其子问题的最优解有效地构造出来,那么称这个问题拥有最优子结构。 一问题必须拥有重叠子问题和最优子结构,才能使用动态规划去求解。 动态规划必须设计一个...原创 2020-03-31 09:36:36 · 247 阅读 · 0 评论 -
KMP字符串匹配
void getNext(char S[], int len){ int j = -1; next[0] = -1; for(int i = 1; i < len; i++){ while(j != -1 && s[i] != s[j+1]){ j = next[j]; } if(s[i] == s[j+1]){ j...原创 2020-03-29 11:57:45 · 197 阅读 · 0 评论 -
最大回文子串
暴力方法O(n^3) #include <iostream> #include <cstdio> #include <string.h> #include <algorithm> using namespace std; int maxN = 1010; bool isHuiWen(string temp){ int size = temp...原创 2020-03-29 10:41:01 · 258 阅读 · 0 评论 -
关键路径
算法理论 AOV网与AOE网 AOV网(Activity On Vertex):顶点表示活动,边表示活动间的优先关系的有向无环图; AOE网(Activity On Edge):带权的边表示活动,而用顶点表示事件的有向无环图;边权表示完成活动需要的时间; AOE网中的最长路径被称为关键路径,关键路径上的活动称为关键活动,关键活动会影响整个工程的进度 理解:关键路径的定义是AOE网中的最长路径,为...原创 2020-03-20 19:11:54 · 316 阅读 · 0 评论 -
拓扑排序
算法步骤 定义一个队列Q,并把所有入度为0的结点加入队列 取队首结点,输出。然后删去所有从它出发的边,并令这些边到达的顶点的入度减1. 返回步骤2,直至队列为空。如果队列为空时入过队的结点数目恰好为N,说明拓扑排序成功,否则失败。 算法代码 const int maxn = 10010; vector<int> Adj[maxn]; //邻接表 int in_degree[max...原创 2020-03-20 15:34:10 · 149 阅读 · 0 评论 -
最小生成树
Prim 算法 算法理论 Prim算法的思想 1)清空生成树,任取一个顶点加入生成树; 2)在那些一个端点在生成树里,另一个端点不在生成树里的边中,选取一条权最小的边,将它和另一个端点加进生成树; 3)重复步骤2,直到所有的顶点都进入了生成树为止,此时的生成树就是最小生成树。 Dijkstra算法和Prim算法实际上是相同的思路,不过是数组d[]所表示的最小距离含义不同而已;其中,Dijkstra...原创 2020-03-19 22:53:21 · 144 阅读 · 0 评论 -
最短路径
1. 单源最短路问题(Dijkstra 算法) 算法代码 伪代码 //G为图,一般设为全局变量,数组d为源点到达各个点的最短路径长度,s为起点 Dijkstra(G, d[], s) { 初始化; for(循环n次) { u = 使d[u]最小且还未被访问的顶点的标号; //暴力搜索 or 堆结构 标记u已被访问; for(从u出发...原创 2020-03-19 21:10:26 · 184 阅读 · 0 评论 -
图
图的存储 邻接矩阵 一般只适用于顶点数目不太大的题目(一般不超过1000) 邻接表 顶点数大于1000的题目 vector实现 开一个vector数组Adj[N],其中N为顶点个数 如果邻接表只存储每条边的终点编号,而不存储边权,则vector中的元素类型可以直接定义为int 如果需要存储边权,则把替换类型替换为结构体Node strcut Node{ int v, w; Node(i...原创 2020-03-19 09:50:13 · 105 阅读 · 0 评论 -
并查集
理论 定义 并查集是一种维护集合的数据结构,它的名字中“并”“查”“集“分别取自Union(合并)、Find(查找)、Set(集合)这三个单词。也就是说,并查集之锤下面两个操作: 1.合并:合并两个集合。 2.查找:判断两个元素是否在一个集合。 并查集一般就是用一个father数组实现,表示其父亲结点。 基本操作 初始化 for(int i=0;i<=N;i++){ father[i]=i...原创 2020-03-17 22:22:26 · 117 阅读 · 0 评论 -
priority_queue与堆
1.priority_queue(优先级队列) 优先级队列的底层是堆,每次队首元素都是优先级最大的。 头文件 include<queue> using namespace std; 常用操作 push() push(x)令x入队,复杂度O(logN) top() 获取队首元素,复杂度O(1) pop() 令队首元素出队,复杂度O(logN) empty() 检测优先队...原创 2020-03-17 15:51:03 · 194 阅读 · 0 评论 -
树
树的深度自顶向下计算,树的高度自底向上计算。 1. 二叉树 1.1 二叉树定义 struct TreeNode{ ElementType data; TreeNode *leftChild; TreeNode *rightChild } 1.2 其他理论部分 二叉树不等于度为2的树,二叉树的左右子树有严格的定义 1.3 完全二叉树 满二叉树:每一层的结点个数都达到了当层能达到的最大结点数 ...原创 2020-03-17 14:53:38 · 99 阅读 · 0 评论 -
搜索
搜索(剪枝matter!) 1. 宽度优先搜索(BFS) 宽度优先搜索,一般是用队列来实现,特别适合求最短时间,最短路径之内的问题,在求解的时候要用一个数据结构去保存以前已经访问的单位避免重复搜索,同时还需要注意剪枝。 1.1 例子 BFS模版 void BFS(int s){ queue<int> q; q.push(s); while(!q.empty()){ 取出队...原创 2020-03-17 14:52:00 · 104 阅读 · 0 评论 -
分治与递归
分治与递归 1. 递归 两个核心 子问题必须与原始问题相同,且规模更小(递归式) 不能无限制地调用自身,必须有一个递归出口 (递归边界) 2.分治法 步骤 分:将问题分解为规模更小的问题(严格来说根据这一步的不同还可能分为减治法和分治法) 治:将这些规模更小的子问题逐个击破 合:将已解决的子问题合并,最终得出“母”问题的解 跟递归的关系 分治法既可以用递归求解也可以不用递归求解,但是一般来...原创 2020-03-17 14:35:03 · 806 阅读 · 0 评论