文章目录
1.图 的基本概念
Subgraphs:例:S是G的一个子图
•S的顶点是G的顶点的子集
•S的边是G的边的子集
spanning subgraph:该子图包含了原图中所有顶点
树:树是无向图,图是连通的,且没有围成环
Spanning Tree :连通图的生成树就是树的生成子图。
条件:- 包含图中所有顶点的树。
•除非图原来是树,否则生成树不是唯一的。
2.深度优先搜索 Depth-First Search
- 是遍历图的一种方式,访问图的所有顶点和边。
- 算法“遵循”图中的一条可能路径,直到它不能继续前进,然后沿着这条路径回溯,直到找到另一条可能的路径。
- 一个有n个顶点和m条边的图的DFS复杂度为O(n + m)
- DFS扩展以解决其他图数据问题:
①查找并报告两个给定顶点之间的路径
②在图中找到一个cycle
3.广度优先搜索 Breadth-First Search
- 是遍历图的一种方式,访问图的所有顶点和边。
- 一个有n个顶点和m条边的图的DFS复杂度为O(n + m)
- BFS扩展以解决其他图数据问题:与DFS同样
4.最短路径
- 给定一个加权图和两个顶点u和v,我们要找到u和v之间的最小总权值路径。一条路径的长度是它的边的权值的和。
- 最短路径的属性:
①最短路径的子路径本身就是最短路径属性
②从一个开始顶点到所有其他顶点有一个最短路径树
Dijkstra算法
- 计算从给定开始顶点s开始到所有顶点的距离。
- idea:我们生成一个“云”,从s开始,最终覆盖所有的顶点。每个顶点v都有一个标签d(v),表示v到s的距离,这个子图由云和它的邻接顶点组成
- 每一步:•我们添加距离d(u)最小的顶点u(不在云中)到云中。•我们更新与u相邻的顶点的标签。
5.最小生成树
- 最小:对于一个图来说,有很多生成树,把生成树边的权值和加起来,不同的生成树有不同的权值和,最小生成树就是权值和最小的那棵树
- 生成树:结构中不能形成环,连接图中所有顶点
具有最小总边权的加权图的生成树。
Kruskal 算法
直接选择那些权值最小的边
•基于记录顶点云。
•最初,每个顶点都在自己的云中。
•使用最短边连续合并两个云,直到整个图包含在一个云中。
•用于合并云的边缘成为用于MST的边缘。
- 将图中的边全部取出,按边权值从大到小的顺序重新排列
- 回贴:从列表中按次序,每次取出一条边回帖到图中(每回贴一条边后,都要判断图中是否形成了环,如果没有,则这条边就被选中为最小生成树的一条边;否则,如果形成了环,这条边将会被丢弃)
- 每次成功回贴一条边,edge++,直到edge=n-1,这时最小生成树构成
使用优先队列将边缘存储在云之外
复杂度;O(m log n)
从顶点出发,间接选择与顶点相连最小的边
当已选顶点包含了所有顶点,最小生成树创建完成
6.哈夫曼编码
- 把顶点出现的次数记为该顶点的权值
权值越高的编码(出现频率越高),编码越短 - 对同一数据来说,赫夫曼编码不唯一,因为可能有多个节点权值相同,而我们又是任意选择的权值最小的节点,有多种选法,但是不论使用哪个赫夫曼树,最短路径(WPL)都是相同的
- 前缀码:前缀码中,任意字符的编码串都不是另一字符编码串的前缀,即没有代码字是其他代码的前缀。
赫夫曼树的根节点到任意叶子节点的路径都不可能是通往其余叶子节点的路径,即赫夫曼编码正好就是前缀码,所以赫夫曼编码不会产生歧义 - 赫夫曼树的带权路径长度(WPL)是最小的,哈夫曼编码产生的不仅是前缀码,还是最短前缀码