数据结构的应用大全
这篇博客是一篇综合类的,主要是汇集各种数据结构的应用,也是补上之前偷懒没写的,就总结成一篇了
栈
括号匹配
[ ( [ ] [ ] ) ] 是否匹配成功
栈中的情况:[ ( [ ] 第四个匹配成功,弹出匹配成功的项
栈中的情况:[ ( [ ] 第六个匹配成功
栈中的情况:[ ( ) 第七个匹配成功
栈中的情况:[ ] 第八个匹配成功
该括号串匹配成功
前/中/后缀表达式
- 中缀表达式 => 后缀表达式
(a+b)/c*d-(e-f/g)+h/i
// () > /* > +-
ab+c/d*efg/--hi/+
- 后缀表达式如何计算?
ab+c/d*efg/--hi/+
// 遇到符号就拿前面两个来运算
ab+ => a+b
c/ => (a+b)/c
d* => (a+b)/c*d
efg/ => f/g
- => e-f/g
- => (a+b)/c*d-(e-f/g)
hi/ => h/i
+ => (a+b)/c*d-(e-f/g)+h/i
递归
链接: https://pan.baidu.com/s/1UVyo93OVHX4SGz1HaPZ27w 提取码: n5jv
时间紧迫,递归最好还是有动画比较好懂
队列
双端队列
数据结构之队列
这个可以看之前的一篇博客,很简单
串
KMP算法
朴素匹配就不用多说,直接暴力即可
KMP算法主要考的是求next数组
判断next值就是判断模式串该从哪里开始匹配的问题,这里化了一条线,最终会在线右边第一个开始匹配
比如next3,经过向右移动,最终j=1,说明此时需要从1开始匹配,即next3=1;
又如next4,经过向右移动,再第三行这里匹配成功,此时j=2
KMP算法的优化
KMP优化算法主要考的是求nextval数组
以上个例子为基础,我们已经得到了未优化的next数组,如下
011234223456,此时我们只需要对其进行手动判断,如下
a b a b a a a b a b a a
0 1 1 2 3 4 2 2 3 4 5 6
// 1(a,0)表示第1个位置,内容为a,next数组值为0
第一个: 无需改变
第二个: 对应的是b,失败时跳转回1(a,0),因此不需要改变
第三个: 对应的是a,失败时跳转回1(a,0),因此改为1(a,0)对应的0 // 此时a匹配未成功,回到1(a,0)匹配也必定不成功
a b a
0 1 0
第四个: 对应的是b,失败时跳转回2(b,1),因此改为2(b,1)对应的1 // 此时b匹配未成功,回到2(b,1)匹配也必定不成功
a b a b
0 1 0 1
...
最终结果为 a b a b a a a b a b a a
0 1 0 1 0 4 2 1 0 1 0 4
二叉树⭐
二叉树的三种遍历及层次遍历
至少要能够手动的分析出树的结构
(1)先序遍历:根左右;(2)中序遍历:左根右;(3)后序遍历:左右根;(4)层次遍历:第一层、第二层…
例如:
- 前序遍历为DABEC,中序遍历为DEBAC,求后序遍历 CEDBA
- 前序遍历为ABCDEF,中序遍历为CBAEDF,求后序遍历 CBEFDA
线索二叉树
树、森林与二叉树的转换
哈夫曼树
并查集
并查集使用的是双亲定义方法(代码要记住)
图⭐
最小生成树(Prim、Kruskkal)
-
Prim算法
时间复杂度O(|V|2),不依赖于|E|,适用于边稠密的图
原理:每次都找跟已搜索结点毗邻的最短边
-
Kruskkal算法
时间复杂度O(|E|log|E|),适用于边稀疏而顶点较多的图
原理:每次都找最短的一条边
最短路径(Dijkstra、Floyd)
-
Dijkstra算法求单源最短路径问题
时间复杂度O(|V|2),基于贪心策略,不适用于带有负权值的边 -
Floyd算法
时间复杂度O(|V|3),基于动态规划策略
允许图中带有负权值的边,但不允许有包含带负权值的边组成的回路
有向无环图(DAG图)
链接: https://pan.baidu.com/s/1TSrAY3jOXG-0f1lX1QAnYw 提取码: aph2
咸鱼学长无敌!!!
拓扑排序,AOV网
注:一定不能有环路
关键路径
-
从源点(开始顶点)到汇点(结束顶点)的所有路径中,具有最大路径长度的路径称为关键路径
-
关键路径不一定唯一,因此缩短某一条关键路径的某一个活动时间不一定可以缩短时间,要缩短所有关键路径的交集边才可以