本章是第十五章,主要介绍了图的概念。
首先我来介绍一下图的基本结构。
从逻辑上讲,图是由边和结点组成的,在个人理解中结点是用于储存信息的,而边则是用来肯定各个结点之间的关系
而图又能够分为两类,无向图和有向图。php
无向图
无向图是一种边为无需结点对的图。记做(A,B)意味着A与B之间有一条从两个方向均可以有力的链接。在无向图中,边记做(A,,B)和记做(A,B)的含义是彻底同样的。
这是书上的话。
个人理解就是无向图就是将各个结点经过边链接,而已链接结点之间能够双向交互。
下面展现了一个无向图
顶点:A,B,C,D
边:(A,B)(A,C)(B,C)(B,D)(C,D)
html
有向图
有向图有时也称为双向图,它是一种边为有序顶点对的图,这意味着边(A,B)和边(B,A)在有向图中是不一样的有向边。
个人理解就是有向图是已链接的点之间只能单向交互(按照事先规定好的方向)。
下面展现了一个有向图
顶点:A,B,C,D
边:(A,B)(A,C)(B,C)(B,D)(C,D)
java
一些概念git
邻接 | 若是图中的两个顶点之间有一条链接边则称这两个边是邻接的。 |
邻居 | 邻接顶点 |
路径 | 图中的一系列边,每一个边链接两个顶点 |
自循环/环 | 链接一个顶点及其自身对的边 |
彻底图 | 一个无向图拥有最大数目的连通顶点的边 |
连通 | 无向图中任意两个顶点之间都存在一条路径,则认为这个无向图是连通的 |
无向图连通和不连通的例子。、
连通
web
不连通
算法
有向图连通和不连通的例子。
连通
不连通
数组
网络的概念
网络实际上就是图在实际中的应用,将一些人们须要的信息储存在边中,经过遍历进行比较或者计算,而后得出对人么有用的结果或信息。
下面是两个关于飞机票价的图的应用。
一个无向网络
一个有向网络
对于网络,咱们将用一个三元组中包括起始顶点、终止顶点和权重。对于无向网络来讲,起始顶点与终止顶点能够互换。但对于有向图来讲,必须宝宝韩每一个有向链接的三元组。例如上图能够表示为
顶点: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软件结构与数据结构