20172318 2018-2019-1 《程序设计与数据结构》第9周学习总结
教材学习内容总结
图
- graph:图 由结点和这些结点之间的连接构成。
- vertice:顶点 图中的结点。
- edge:边 结点之间的连接。
- undirectedgraph:无向图 一种边为无序结点对的图
- adjacent:邻接的 两个顶点之间有一条连通边,则称这两个顶点是邻接的
- self-loop:自循环 连通一个顶点及其自身的边。
- complete:完全的 如果无向图拥有最大数目的连通顶点的边,则认为这个无向图是完全的。
- path:路径 连接图中两个顶点的一系列边。
- pathlength,路径长度 路径中边的条数(或者是顶点数减去l).
- connected:连通的 如果无向图中的任意两个顶点之间都存在一条路径,则认为这个无向图是连通的。
- cycle;环路 是一种首顶点和末顶点相同且没有重边的路径。
- acyclic:无环的 没有环路的图称为无环的。
- 无向树是一种连通的无环无向图,其中一个元素被指定为树根。
- directedgraph(digraph):有向图 有时也称为双向图,它是一种边为有序顶点对的图。
- 有向图中的路径是图中连通两个顶点的有向边序列。
- topologicalorder:拓扑序 如果有向图中没有环路,且有一条从A到B的边,则可以把顶点A安排在顶点B之前。这种排列得到的顶点次序称为拓扑序。
- network(weightedgraph):网络(加权图) ,是一种每条边都带有权重或代价的图。
- 常用的图算法
- breadth-firsttraversal:宽度优先遍历 图的一种遍历,类似于树的层次遍历。
- depth-firsttraversal:深度优先遍历 图的一种遍历,类似于树的前序遍历。
- 图的深度优先遍历与广度优先遍历的唯一不同是,它使用的是栈而不是队列来管理遍历。
- 不论哪个为起始顶点,当且仅当广度优先遍历中的顶点数目等于图中的顶点数目时,该图才是连通的。
- 无向连通图
- 无向非连通图
- spanningtree:生成树 是一棵含有图中所有顶点和部分边(但可能不是所有边)的树。
- minimumspanningtree:最小生成树 是这样一棵生成树,其边的权重总和小于或等于同一个图中其他任何一棵生成树的权重总和。
- 图的实现策略
- adjacencyt:邻接列表 指的是对于图中给定的任意结点,它与其他结点连接的边列表。对于网络,邻接列表中的每项还包括边的权重或代价。
- adjacencymatrix:邻接矩阵 一种二维数组,其中每个单元都表示了图中两个顶点的交接情况。对于无向图,数组中的每个单元是一个布尔值。对于加权图,在数组中还存储了边的权重。
*用邻接矩阵实现无向图- addEdge方法
一旦创建好了顶点列表和邻接矩阵,添加一条边就是很容易的事情了。addEdge方法使用getlndex方法来定位正确的索引,如果索引合法,调用addEdge方法的不同版本来进行赋值。 - addVertex方法
往图中添加一个顶点包括在数组的下一个可用置添加该顶点,把邻接矩阵中所有恰当的位置都设置为false, - expandCapacity方法
图的邻接矩阵实现中的expandCapacity比其他数组实现中的类似方法更有趣。它不再只是简单的扩展一个数组并复制内容了。记住,对于图,我们不仅必须扩展顶点数组并把己有顶点复制到新数组中,而且还必须扩展邻接列表的容量并把旧内容复制到这个新列表中。
教材学习中的问题和解决过程
问题1:.图怎么生成树
问题1解决方案:
参考了博客图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
如何求连通图的最小生成树?
构造最小生成树的算法很多,其中多数算法都利用了一种称之为 MST 的性质。
MST 性质:设 N = (V, E) 是一个连通网,U 是顶点集 V 的一个非空子集。若边 (u, v) 是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一棵包含边 (u, v) 的最小生成树。
普里姆 (Prim) 算法。
算法思想:
1、设 N=(V, E) 是连通网,TE 是N 上最小生成树中边的集合。初始令 U={u0}, (u0属于V ), TE={ }。
2、在所有 u属于U, v属于V-U 的边 (u, v)属于E 中,
找一条代价最小的边 (u0, v0)。
将 (u0, v0) 并入集合 TE,同时 v0 并入 U。
3、重复上述操作直至 U=V 为止,则 T=(V, TE) 为 N 的最小生成树。
总得来说,普里姆算法就是以树为单位,找最小的权边,特点是针对无向图!只和顶点有关,和边无关,适用于稠密图。算法时间复杂度为 O(n^2)
如图:普里姆算法求最小生成树
初始令 U={u0}, (u0属于V ), TE={ }。
在所有 u属于U, v属于V-U 的边 (u, v)属于E 中,找一条代价最小的边 (u0, v0)。将 (u0, v0) 并入集合 TE,同时 v0 并入 U。
重复上述操作直至 U=V 为止,则 T=(V, TE) 为 N 的最小生成树。
继续
最后,遍历完
Prim算法的实现
顶点集合如何表示?最小边如何选择?一个顶点加入U集合如何表示?如下面的例子:
当U集合中加入一个新顶点时,V-U集合中的顶点到U的最小代价边可能会更新,k 代表最终选择的顶点,k=3,代表选择是v3这个顶点,因为1-3代价是最小的=1
选取了 v3,之后,继续以最新的树为单位,来找最小的权值边,通过看和哪个顶点连接。
k=6,代表选择是v6这个顶点,因为3-6代价是最小的=4,在所有的和最新的树邻接的顶点中,权值最小的边。
选取 v6之后
继续以最新的树为单位,找临近的顶点,看哪条边的权值最小,找到6-4这条边,权值=2
新的树如图
继续以最新的树为单位,找临近的顶点,看哪条边的权值最小,找到3-2这条边,权值=5
新的树如图
继续以最新的树为单位,找临近的顶点,看哪条边的权值最小,找到2-5这条边,权值=3
直到所有顶点全部并入生成树之后,程序结束
代码调试中的问题和解决过程
问题1:.pp15.7要创建一个加权无向图,具体要怎么实现
问题1解决方案:增加边时在边中定义两个int值,分别表示价格和最短路径
上周考试错题总结
- 错题1
A minheap stores its largest element at the root of the binary tree, and both children of the root of a minheap are also minheaps.
A .True
B .Flase
选B,最小的元素储存在树根 错题2
Since a heap is a binary search tree, there is only one correct location for the insertion of a new node, and that is either the next open position from the left at level h or the first position on the left at level h+1 if level h is full.
A .True
B .Flase
选B
代码托管
点评过的同学博客和代码
- 本周结对学习情况
- 20172312
- 格式工整,问题较少
- 结对学习内容
- 课本第十五章
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 8/8 | |
第二周 | 500/500 | 1/2 | 15/ 23 | |
第三周 | 802/1302 | 1/3 | 12/35 | |
第四周 | 1530/2832 | 2/5 | 15/50 | |
第五周 | 1165/3997 | 1/6 | 10/60 | |
第六周 | 1169/5166 | 1/7 | 15/75 | |
第七周 | 843/6039 | 1/8 | 15/90 | |
第八周 | 1804/7843 | 2/10 | 30/120 | |
第九周 | 1493/9336 | 1/11 | 15/135 |