本文已参与「新人创作礼」活动,一起开启掘金创作之路。
这篇博客是一篇综合类的,主要是汇集各种数据结构的应用,也是补上之前偷懒没写的,就总结成一篇了
栈
括号匹配
[ ( [ ] [ ] ) ] 是否匹配成功
栈中的情况:[ ( [ ] 第四个匹配成功,弹出匹配成功的项
栈中的情况:[ ( [ ] 第六个匹配成功
栈中的情况:[ ( ) 第七个匹配成功
栈中的情况:[ ] 第八个匹配成功
该括号串匹配成功
前/中/后缀表达式
- 中缀表达式 => 后缀表达式
(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
递归
链接: pan.baidu.com/s/1UVyo93OV… 提取码: 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图)
链接: pan.baidu.com/s/1TSrAY3jO… 提取码: aph2 咸鱼学长无敌!!!
拓扑排序,AOV网
==注:一定不能有环路==
关键路径
-
从源点(开始顶点)到汇点(结束顶点)的所有路径中,具有最大路径长度的路径称为关键路径
-
关键路径不一定唯一,因此缩短某一条关键路径的某一个活动时间不一定可以缩短时间,要缩短所有关键路径的交集边才可以