算法导论复习


期末考试到了QAQ,所以整理了一下相关内容。文章中的内容是相关资料的整理,参考的博客都在文末有列举,如有侵权,还麻烦您联系我一下,保证立马删除。

排序

在这里插入图片描述

插入排序

在这里插入图片描述
在这里插入图片描述

归并排序

在这里插入图片描述
归并排序的合并步骤
在这里插入图片描述
在这里插入图片描述

堆排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

渐进符号、函数和运行时间

我们使用渐进记号来刻画算法的运行时间,有时我们对最坏情况运行时间感兴趣,但是,我们常常希望刻画任何输入的运行时间。换言之,就是希望做出一种综合性地覆盖所有输入而不仅仅是最坏情况的陈述。
在这里插入图片描述

主方法进行递归式求解

在这里插入图片描述
在这里插入图片描述

最大堆&最小堆
在这里插入图片描述

维护最大堆

在这里插入图片描述
在这里插入图片描述

AVL

AVL(Adelson-Velskii and Landis)树是带有平衡条件(balance condition)的二叉查找树,树中的任意节点的左右子树的高度之差不超过1。
这个平衡条件必须容易保持,而且必须保证树的深度是O(logN)。
在这里插入图片描述

LL右旋

LL的意思是向左子树(L)的左孩子(L)中插入新节点后导致不平衡,这种情况下需要右旋操作
在这里插入图片描述

在这里插入图片描述

RR左旋

在这里插入图片描述
在这里插入图片描述

LR

在这里插入图片描述
下图第三个模块,X和Z需要换一下位置。
在这里插入图片描述

RL

在这里插入图片描述
下图中,第二模块y的左孩子为T1,第三个模块x和z反了,孩子从左至右依次是T1,T2,T3,T4
在这里插入图片描述
辅助理解示例:
初始的AVL树有两个节点,a和b,此时树平衡。
在这里插入图片描述
插入节点c,若节点c小于b,则成为b的左子节点,此时a左子树深度为2,右子树深度为0,处于不平衡状态,此时执行右旋操作。
在这里插入图片描述
右旋就是使a、b进行右旋1/4圆,使得b节点作为父节点,a节点变为b节点的右节点,b的左子树在经过右旋操作后仍是b的左子树。
如果b有右子树。那么右旋后b的右子树将成为a的左子树。
在这里插入图片描述
这就是右旋操作的具体实现,左旋是右旋对称的过程。当二叉树插入或者删除一个节点时,如果破坏了树的平衡性,就会根据树的失衡情况进行旋转操作,如果左子树高于右子树,则右旋,如果右子树高于左子树,则左旋。
上面将树从失衡状态恢复到平衡状态只进行了一次旋转操作,事实上还有一种稍微复杂的情况,需要进行两次旋转才能将树重新恢复平衡。
如果节点插入到a的左子树的右节点,则需要先左旋再右旋来重新平衡树。同理,如果节点插入到a的右子树的左子节点,则需要先右旋再左旋来重新平衡树。如果直接进行右旋,生成的树将仍然是失衡的。
在这里插入图片描述
(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树,树上的每一个结点对应数组中的一个元素。除了最底层外,该树是完全充满的,而且是从左至右填充。
在这里插入图片描述

找路径

BFS

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从顶点1开始进行广度优先搜索:
初始状态,从顶点1开始,队列={1}
访问1的邻接顶点,1出队变黑,2,3入队,队列={2,3,}
访问2的邻接结点,2出队,4入队,队列={3,4}
访问3的邻接结点,3出队,队列={4}
访问4的邻接结点,4出队,队列={ 空}
结点5对于1来说不可达。

DFS

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
示例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从顶点1开始做深度搜索:
初始状态,从顶点1开始
依次访问过顶点1,2,3后,终止于顶点3
从顶点3回溯到顶点2,继续访问顶点5,并且终止于顶点5
从顶点5回溯到顶点2,并且终止于顶点2
从顶点2回溯到顶点1,并终止于顶点1
从顶点4开始访问,并终止于顶点4

BFS和DFS的时间复杂度

因为算法导论这本书中对于图来说,存储结构都是用的邻接链表,所以BFS和DFS的时间复杂度是O(N+E)
但是对于图来说,还有另一种存储形式,也就是邻接矩阵,此时的时间复杂度为O(n2)
DFS
在这里插入图片描述
BFS
在这里插入图片描述
在这里插入图片描述

求最短路径

Dijkstra

贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。
指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径。
在这里插入图片描述
用矩阵存储图的信息
在这里插入图片描述
用一个一维数组存储1号结点到其余各个顶点的初始路程
在这里插入图片描述
算法的过程
在这里插入图片描述
时间复杂度O(n2)
堆优化Dijkstra算法,即运用堆排序来加快找边的速度,使算法总体时间复杂度达到O((n+m)logm)
缺点是不能处理负权边

Bellman-Ford

可求解边上带有负值的单源最短路径问题
但是要求图中不能包含权值总和为负值回路(负权值回路)
如果存在从源点可达的负权值回路,则最短路径不存在,因为可以重复走这个回路,使得路径无穷小。
在这里插入图片描述
在这里插入图片描述
是否存在负权值回路的判断
在这里插入图片描述
算法复杂度
在这里插入图片描述

Dijkstra&Bellman-Ford区别

在这里插入图片描述

引用博客

详细图文——AVL树
手把手教,手写AVL树
Dijkstra算法图文详解
BFS和DFS算法

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值