20172304 《程序设计与数据结构》第九周学习总结
20172304 《程序设计与数据结构》第九周学习总结
教材学习内容总结
本章是第十五章,主要介绍了图的概念。
首先我来介绍一下图的基本结构。
从逻辑上讲,图是由边和结点组成的,在我的理解中结点是用于储存信息的,而边则是用来确定各个结点之间的关系
而图又可以分为两类,无向图和有向图。
无向图
无向图是一种边为无需结点对的图。记作(A,B)意味着A与B之间有一条从两个方向都可以有力的连接。在无向图中,边记作(A,,B)和记作(A,B)的含义是完全一样的。
这是书上的话。
我的理解就是无向图就是将各个结点通过边连接,而已连接结点之间可以双向交互。
下面展示了一个无向图
顶点:A,B,C,D
边:(A,B)(A,C)(B,C)(B,D)(C,D)
有向图
有向图有时也称为双向图,它是一种边为有序顶点对的图,这意味着边(A,B)和边(B,A)在有向图中是不同的有向边。
我的理解就是有向图是已连接的点之间只能单向交互(按照事先规定好的方向)。
下面展示了一个有向图
顶点:A,B,C,D
边:(A,B)(A,C)(B,C)(B,D)(C,D)
一些概念
邻接 | 如果图中的两个顶点之间有一条连接边则称这两个边是邻接的。 |
邻居 | 邻接顶点 |
路径 | 图中的一系列边,每个边连接两个顶点 |
自循环/环 | 连接一个顶点及其自身对的边 |
完全图 | 一个无向图拥有最大数目的连通顶点的边 |
连通 | 无向图中任意两个顶点之间都存在一条路径,则认为这个无向图是连通的 |
无向图连通和不连通的例子。、
连通
不连通
有向图连通和不连通的例子。
连通
不连通
网络的概念
网络实际上就是图在实际中的应用,将一些人们需要的信息储存在边中,通过遍历进行比较或者计算,然后得出对人么有用的结果或信息。
下面是两个关于飞机票价的图的应用。
一个无向网络
一个有向网络
对于网络,我们将用一个三元组中包括起始顶点、终止顶点和权重。对于无向网络来说,起始顶点与终止顶点可以互换。但对于有向图来说,必须宝宝韩每个有向连接的三元组。例如上图可以表示为
顶点:Boston、New York、 Philadelphia、Roanoke
边:(Boston,New York,120),(Boston,Philadelphia,195)
(New York,Boston,140),(New York,Philadeohia,225)
(New York,Roanoke,320),(Philadelphia,Boston,219)
(Philadelphia,New York,205),(Roanoke,New York,240)
常用的图算法
遍历:广度优先遍历类似于树的层次遍历,深度优先遍历类似于树的前序遍历
具体的操作我就不再赘言了,过程在书上都有。这里只写一下具体的步骤,来演示一下
下面是一个演示例子。
广度优先就是先遍历9在遍历6,7,8。然后在遍历3,4,5,然后在遍历1。
深度优先就是类似于先序优先
应该是先遍历9,然后按照列表的顺序遍历6,3,1,2,然后再是4,然后是7,5然后是8。
测试连通性
在前面的讨论中,我们定义了图的连通性:如果图中的任意两个顶点之间都存在一条路径,则认为这个图是连通的。
对图的连通性有一种简单的解法,在一个含n个顶点的图中,当且仅当对每个顶点v,从v开始的广度优先遍历的resultList大小都是n,则该图就是流通的。
下面给出两个例子。一个是连通的,一个是非连通的。
可以看出,连通图中任意顶点看是的遍历都经过了四个顶点,而非连通图中则反之。
连通图
非连通
无向连通图的广度优先遍历
起始顶点 | 广度优先遍历 |
---|---|
A | A,B,C,D |
B | B,A,D,C |
C | C,B,A,D |
D | D,B,A,C |
最小生成树
生成树包括一个图中所有的顶点和部分边,所以对于某些图,它的生成树就是它本身。
给一个例子
起始顶点 | 广度优先遍历 |
---|---|
A | A,B,C |
B | B,A,C |
C | C,B,A |
D | D |
一棵生成树 | |
最小生成树的定义就是在加权图中所有的生成树中,权重之和最小的哪一个生成树。 | |
下面是一颗最小生成树的例子 | |
网络 | |
最小生成树 | |
判定最短路径 |
树的实现策略
邻接列表
关于这种实现,我并没有听从书中的内容,因为我觉得老师讲的更加的通俗易懂。老师所讲解的内容,比书上的讲解的内容更加的浅显易懂。
直接上图
实际上这种实现方法还是很好懂的就是在数组中分别存入以每个结点为头结点的链表,然后在分别在链表中存入其邻接结点。
邻接矩阵
说是矩阵实际上利用的是二维数组。然后就近似成一个表格,在表格的第一行和第一列分别写入图中的元素。然后在中间的每个单元中用二元变量来表示两个节点之间的关系。老师还说如果一个图是强联系图那么使用邻接矩阵是合算的,如果一个图是弱联系图,那么使用邻接矩阵就比较占用资源,这种区别在结点数量较少时没有太大的影响,但是数量大时,影响就很明显,比如一百个结点成链表连接,使用邻接列表就会很占用空间。干讲没意思,直接上图。
一个无向图,由于无向图邻接点之间的关系是双向的。所以显示的邻接矩阵是对称的。所以来时说用邻接矩阵来表示无向图实际上只需要画出一半,所以使用的空间比较少。
一个有向图
教材学习中遇见的问题
问题一:一开始我不是很懂那个书上的那个用邻接列表实现图是怎么来确定那带权的图
解决方案:在老师的讲解下我终于明白了一些。实际上链表中储存的结点并不是类似于树中的那个结点而是类似于边结点性质的结点对应每一个不同的指向顺序其对应的权并不相同。正如图中所圈定的部分虽然同样是在有向图中作为被指定单位部分但是由于两者之间的关系不同(边不同),所以两者之间的权就不同,这种邻接表式的表示法链表中的结点更加与表类似而不是与结点类似。
代码调试中的问题和解决方案
就是在编写代码时发现一处错误
解决方案:后来在对之前写过的代码进行排查发现,是LinkedList类没有声明StackADT这个接口。
代码托管
码云链接
(statistics.sh脚本的运行结果截图)
上周考试错题总结
无
博客互评
点评过的同学博客和代码
- 上周博客互评情况
20172304郭恺郭恺同学能对教材的内容进行合理的总结又能将树中不懂得知识点分析的如此淋漓尽致。
20172328李馨雨李馨雨同学的博客内容充实,排版美观,条理清晰,是不可多得的博客。
其他(感悟、思考等,可选)
本周学习了图的相关内容,图是一种与实际应用较为贴切的数据结构。也是一种较为复杂的数据结构。在图的学习中总会遇见许多问题。但最后还是能够通过各种帮助来解决。这应该是本学期树中的最后一章内容了,学习过这一章以后,就要开始进入实践了。总感觉时间过得这么快。希望能够在时间中更好的运用所学的技能。解决更多有用的问题。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 30/30 | 1/1 | 10/10 | |
第二周 | 766/796 | 1/2 | 40/50 | |
第三周 | 817/1613 | 1/3 | 20/70 | |
第四周 | 1370/3983 | 2/5 | 30/100 | |
第五周 | 1235/5214 | 1/6 | 10/110 | |
第六周 | 1328/6542 | 1/7 | 20/130 | |
第七周 | 1218/7860 | 1/8 | 20/150 | |
第八周 | 585/9445 | 1/9 | 20/170 | |
第九周 | 2002/11447 | 35/205 |
参考资料
1.蓝墨云班课
2.java软件结构与数据结构