20162308 2017-2018-2 《程序设计与数据结构》第11周学习总结
20162308 2017-2018-2 《程序设计与数据结构》第11周学习总结
教材学习内容总结
学习目标
- 图论
学习内容
图论
- 广度优先算法&深度优先算法
图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。注意到树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历。图的遍历主要有两种算法:广度优先搜索(Breadth-First-Search)和深度优先搜索(Depth-First-Search)。
- 广度优先搜索(BFS)的算法思想
广度优先搜索类似于树的遍历算法中的层序遍历,它的基本思想就是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问过的邻接顶点w1,w2,…,wi,然后再依次访问w1,w2,…,wi的所有未被访问过的邻接顶点;再从这些访问过的顶点出发,再访问它们所有未被访问过的邻接顶点……依次类推,直到图中所有顶点都被访问过为止。
广度优先搜索是一种分层的查找过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有往回退的情况,因此它不是一个递归的算法。为了实现逐层的访问,算法必须借助一个辅助队列,以记录正在访问的顶点的下一层顶点。
- 深度优先搜索(DFS)的算法思想
深度优先搜索算法所遵循的搜索策略是尽可能“深”地搜索一个图,与树的遍历算法中的中序遍历类似。它的基本思想就是:首先访问图中某一起始顶点v,然后由v出发,访问与v邻接且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2,……重复上述过程。当不能再继续向下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直到图中所有顶点均被访问过为止。
- 最小生成树
定义
最小生成树是一副连通加权无向图中一棵权值最小的生成树。
最小生成树其实是最小权重生成树的简称。
可能翻译为最小权重生成树
更容易理解一些。意思就是说在图中的每条边都加上权值,所谓权值是一种抽象的含义。可以指代一切可以量化的东西。比如说修路的费用,路程等等。然后在图中找到这样一棵树,边的权值加起来最小。并且既然是棵树,必须满足的要求是无环.
一般用两种贪心算法来找到最小生成树,分别是prim
和Kruskal
Kruskal
- 新建图G
- 把图G中所有的边按照权值从小到大排序。
- 取出最小的边
- 如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G中.(使用并查集)
- 重复3,直至图G中所有的节点都在同一个连通分量中
Prim
- 生成图G
- 从s点开始
- 把与s点相连的边都加入
edgeTo[]
,并且保存到这些点的距离distTo[]
,且插入到优先队列 - 出队一个点
- 查找与这个点相连的点,若权值比
distTo[]
中保存的值小则进更新,同时更新distTo[]
和优先队列. - 重复4
性能
Kruskal
算法 基本上取决于优先队列的选择,以及并查集的实现,比较优的算法效率为O(ElogE)
E为图中的边数。
Prim
算法具体性能也是取决于优先队列的选择,一般来说可以达到O(ElogV)
Kruskal can have better performance if the edges can be sorted in linear time, or are already sorted.
Prim’s better if the number of edges to vertices is high.
Kruskal多用于稀疏图,Prim多用于稠密图。
教材学习中的问题和解决过程
没有问题
代码调试中的问题和解决过程
没有问题
代码托管
- 代码提交过程 & 代码量截图:
结对及互评
点评模板:
- 博客中值得学习的或问题:
其他
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | - | 1 | 10 | |
第二周 | - | 2 | 20 | |
第三周 | - | 3 | 30 | |
第四周 | - | 4 | 40 | |
第五周 | - | 5 | 50 | |
第六周 | - | 6 | 60 |
-
计划学习时间:20小时
-
实际学习时间:10小时
-
改进情况: