20172322 《程序设计与数据结构》第九周学习总结
20172322 《程序设计与数据结构》第九周学习总结
教材学习内容总结
本章的内容主要讲图的知识,图与树的定义类似,让树允许在其每个结点连通多个其他节点,不再有父亲孩子之说时就成了图。图由顶点和边构成,顶点一般由A,B,C,D等表示,相应的边可以表示成(A,B),(B,C)等。图分为两种:有向图和无向图。
-
无向图:边为无序结点的图。在无向图中边(A,B)和边(B,A)所蕴含的意义是相同的。
-
邻接的顶点:如果两个顶点之间有一条边连通,这两个顶点就是连通的。
-
完全的无向图:对于有n个顶点的无向图来说,如果有n(n-1)/2条边,该无向图就是完全的。
-
路径的长度:路径是图中所有的边的总和,路径的长度是路径中边的条数。
-
连通的无向图:如果无向图中任意两个顶点之间都存在一条路径,则认为该无向图是连通的。
-
环路:首末顶点相同且没有重边的路径。
-
无向树:连通的、无环无向的图,其中一个元素被指定为树根。
-
-
有向图:边为有序结点的图。在有向图中边(A,B)和边(B,A)所蕴含的意义是不同的。
- 路径:图中连通两个顶点的有向边序列。
- 拓扑序:在有向图中,有一条边从A到B,则把A安排在B之前,这种排列顺序成为拓扑序。
-
网络(加权图):每一条边都有相应的价值或者代价。
-
图的遍历:
- 广度优先遍历:类似于树的层序遍历,例如:
从 A 开始的遍历顺序为(邻接的遍历顺序为字母升序):ABCEDF。
- 深度优先遍历:类似于树的前序遍历,例如:
从 A 开始的遍历顺序为(邻接的遍历顺序为字母升序):ABCEDF。
- 深度优先遍历和广度优先遍历的唯一不同是:深度优先遍历使用栈而非队列来管理遍历。
-
连通性测试:当且仅当广度优先遍历中的顶点数目等于图中的顶点数目时,该图才是连通的。
-
最小生成树:首先明确生成树的概念,包含图的全部顶点和所有边。最小生成树,其边的权重之和小于或等于同一个图中其他任何一个生成树。例如,普利姆算法求最小生成树:
-
最小路径的判断:两种情况
- 两个顶点之间的最小边数。
- 加权图的最便宜路径。
-
图的实现策略:书上讲到了两种实现策略,邻接列表和邻接矩阵,而所谓邻接指的就是实现图的两个相邻的顶点连接起来。
图的实现策略
邻接列表实现
- 首先,让我们来了解什么是邻接列表。邻接列表:存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。
邻接矩阵实现
-
邻接矩阵:利用一个二维数组实现的矩阵,行列的元素代表顶点,而矩阵中的元素代表边。
-
在无权图中,矩阵中的元素为1则代表有边,而为0时代表无边。
-
如图:
-
在网络中,矩阵中的元素为非0则代表有边,而为0时代表无边。
-
如图:
教材学习中的问题和解决过程
-
问题一:最先看到书上的邻接列表时比较懵逼,而且书上所述非常简单,不知道邻接列表的结构如何。
-
问题一解决方案:先在网上查阅了部分资料后还是不太明白,仅仅是发现它的结构跟链地址法有些类似,但是如何实现的边不清楚,随后向王志强老师求助,王老师说的确跟链地址法比较类似,但是还有一个更加生动的例子就是糖葫芦串,每个顶点把与自己相接的顶点列在自己的后面就可以啦。就像这一张图:
-
问题二:书上关于无向图的邻接矩阵实现中是矩阵中的元素如果为一则是连通的,并且是对称的,那么对于加权图来说如何实现?
-
问题二解决方案:其实这个问题非常简单,只是自己的脑子没扭过来,直接把那个1变为需要加上的权重就实现了加权图。
代码调试中的问题和解决过程
- 问题一:在实现书上的
Graph
类补全时遇到一些困难。。 - 问题一解决方案:参考了一些方艺雯同学的代码,并且对我自己的代码进行了一些优化,例如
isEmpty
方法,我原本的代码如下:
public boolean isEmpty()
{
if (numVertices == 0)
{
return true;
}
else {
return false;
}
}
- 但是方艺雯同学的代码是
public boolean isEmpty()
{
return (numVertices == 0)
}
自己想了想发现这样的确会简单很多。这告诉我们应该多多想想算法的优化。
代码托管“点这里跳转到码云”
- 这周PP15.7的commit写错了,应该是PP15.7而不是PP15.1。
上周考试错题总结
-
错题1:Heap sort is O(________).
-
A .n
-
B .log n
-
C .n log n
-
D .None of the above
-
错题1解析:堆排序的时间复杂度是O(nlogn)
-
错题2:Heap sort is O(n log n).
-
A .True
-
B .Flase
-
错题2解析:跟上题同理。
结对及互评
- 博客中值得学习的或问题:
- 范雯琪同学的博客课本上的学习内容总结部分写得十分详细,值得学习。
- 每次看到范雯琪同学的博客自己都比较惭愧,实在是非常优秀,可想而知她在博客这一方面所做出的努力,我也非常想想她学习。
- 代码中值得学习的或问题:
- commit提交的解释清晰明了,我觉得我应该学习。
- 有许多代码的问题都是我向她询问,我很感谢她
点评过的同学博客和代码
- 本周结对学习情况
-
结对学习内容
- 她提醒了我的PP12.1有点问题,感谢。
其他
- 感悟:感觉图的知识有一些难度,特别是刚刚开始接触的时候,邻接列表的知识让我无从下手。
课本单词
(本部分用于收集本章节后的生词)
- graph:图
- vertice:顶点
- edge:边
- undirected graph:无向图
- adjacent:邻接的
- self-loop:自循环
- complete:完全的
- path:路径
- path length:路径长度
- connected:连通的
- cycle:环路
- acyclic:无环的
- directed graph:有向图
- topological order:拓扑序
- network(weighted graph):网络(加权图)
- breadth-first traversal:宽度优先遍历
- depth-first traversal:深度优先遍历
- spanning tree:生成树
- minimun spanning tree:最小生成树
- adjacency list:邻接列表
- adjacency matrix:邻接矩阵
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/5000 | 2/2 | 8/8 | 认真学习!积极向上 |
第二周 | 812/812 | 1/3 | 22/30 | |
第三周 | 814/1626 | 1/4 | 20/50 | |
第四周 | 1386/3012 | 2/6 | 20/70 | 愉快的国庆节就要结束了... |
第五周 | 1222/3234 | 1/7 | 30/100 | |
第六周 | 1327/4561 | 2/7 | 30/100 | 啦啦啦啦啦 |
第七周 | 1170/5631 | 1/8 | 33/133 | |
第八周 | 1250/6881 | 2/10 | 30/163 | |
第九周 | 2275/9156 | 1/11 | 31/194 |
- 改进情况:根据学姐的建议在借鉴代码时放上了自己的代码并加以说明。