20172328 2018-2019《Java软件结构与数据结构》第九周学习总结

20172328 2018-2019《Java软件结构与数据结构》第九周学习总结

概述 Generalization

本周学习了无向图、有向图、带权图、经常使用的图算法、图的实现策略。

教材学习内容总结 A summary of textbook

  • 图(graph)html

  • 与树相似,图由结点和这些结点之间的链接构成。java

  • [x] <font color = navy>顶点(vertice)</font>就是这些结点。node

  • [x] <font color = navy>边(edge)</font>就是这些结点链接起来的线段。git

  • [x] <font color = navy>路径(path)</font>:图中的一系列边,每条边连通两个顶点。算法

  • [x] <font color = navy>路径的长度(length)</font>:是该路径中边的条数(或者是顶点数减去1)。数组

  • [x] <font color = navy>环路(cycle)</font>:一种首结点和末结点相同且没有重边的路径。没有环路的图称为无环的(acyclic)。网络

  • [x] <font color = navy>彻底图(complete graph)</font>:含有最多条边的无向图 数据结构

    • 对有n个结点的无向图,要使该图是彻底的,要求有n(n-1)/ 2个边。
    • 对有n个结点的有向图,要使该图是彻底的,要求有n(n-1)个边。
  • 无向图(undirected graph) oop

  • 无向图是一种边为无序结点对的图。学习

    • <font color = olive>无序结点(undirected vertice)</font>:A、B、C、D
    • <font color = olive>边(edge)(注:因为无序,因此<a,b>和<b,a>同样)</font>:(A,B) (B,D) (A,D) (B,C) (C,D)
    • <font color = olive>邻接(adjacent)</font>:若是图中两个顶点之间有一条连通边,则称这两个顶点是邻接的。如图,A和B邻接,A和C不邻接。
    • <font color = olive>自循环(self-loop)或环(sling)</font>:连通一个顶点及其自身的边称为自循环,如图,边(A,A)表示是A链接自身的一个环。
    • <font color = olive>连通(connected)</font>:若是无向图中的任意两个顶点之间都存在一条路径,则认为这个无向图连通。
    • <font color = olive>无向树是一种连通的无环无向图,其中一个元素被指定为树根。</font>
  • 有向图(directed graph)

  • 边为有序顶点对的图。也称为双向图(digraph)。

    • <font color = olive>有序结点(directed vertice)</font>:A、B、C、D
    • <font color = olive>边(edge)(注:因为有序,因此<a,b>和<b,a>不一样)</font>:(A,B) (B,D) (A,D) (B,C) (D,C)
    • <font color = olive>连通(connected)</font>:若是有向图中的任意两个顶点之间都存在一条路径且能经过一些路径遍历到全部的顶点,则认为这个有向图连通。
    • <font color = olive>拓扑序(topological order)</font>:若是有向图中没有环路,且有一条从A到B的边,则能够把顶点A安排到顶点B以前,这种排列获得的顶点次序称为拓扑序。
  • 网络(network)

  • 有向网络

  • 无向网络

  • 网络(带权图):每条边都对应一个权值(数据信息)的图。(例如:城市之间的航线票价)

    • 对于网络,咱们用三元数组来表示每条边。这个三元数组中包括起始顶点、终止顶点和权重。
    • 如上图,咱们就能够表示为: (Boston ,New York ,120)(Boston ,Philadeiphia , 199)等

  • <font size =3>经常使用的图算法 :</font>

  • 图的遍历:

    • 广度优先遍历:从一个顶点开始,辐射状地优先遍历其周围较广的区域。就如同树中的层次遍历。
    • 深度优先遍历:图的深度优先搜索,相似于树的先序遍历,所遵循的搜索策略是尽量“深”地搜索图。就如同树中的前序遍历。
  • 测试连通性:

    • <font color = green>连通性:图中的任意两个顶点之间都存在一条路径,则认为这个图是连通的。</font>
    • 测试方法:
      • 从任意结点开始的广度优先遍历中获得的顶点数等于图中所含顶点数。
  • 生成树(spanning tree):包含图中全部顶点及图中部分边的一棵树。

  • 最小生成树(minimum spanning tree):所含边权值之和小于其余生成树的边的权值之和。

  • 断定最短路径:

① 断定起始顶点和目标顶点之间是否存在最短路径(两个顶点之间边数最少的路径)。 ② 在加权图中找到最短路径。(Dijkstra算法)

  • 图的实现策略:

  • 邻接列表:用一种相似于链表的动态结点来存储每一个结点带有的边。这种链表称为邻接列表。

  • 邻接矩阵:用一种叫邻接矩阵的二维数组来表示任意两个顶点的交接状况。

  • 无向图的邻接矩阵必定是对称的,有向图的邻接矩阵不必定对称。

教材学习中的问题和解决过程 Problem and countermeasure

  • 问题1:在看课本的时候,对拓扑序没有认识清楚。
  • <table><tr><td bgcolor = lightgreen>“拓扑序(topological order):若是有向图中没有环路,且有一条从A到B的边,则能够把顶点A安排到顶点B以前,这种排列获得的顶点次序称为拓扑序。”</td></tr></table>

  • 问题1的解决:在看了相关资料并进行了理解分析后进行以下总结。
  • 首先先介绍两个概念:
    • 入度:有序图中指向该结点的边的总数。
    • 出度:有序图中该结点指向其余结点的边的总数。
  • 拓扑排序,其实就是寻找一个入度为0的顶点,该顶点是拓扑排序中的第一个顶点序列,将之标记删除,而后将与该顶点相邻接的顶点的入度减1,再继续寻找入度为0的顶点,直至全部的顶点都已经标记删除或者图中有环。

从上能够看出,关键是寻找入度为0的顶点。

一种方式是遍历整个图中的顶点,找出入度为0的顶点,而后标记删除该顶点,更新相关顶点的入度,因为图中有n个顶点,每次找出入度为0的顶点后会更新相关顶点的入度,所以下一次又要从新扫描图中全部的顶点。故时间复杂度为O(n^2)。

  • 问题2:我一直觉得pp15.1是补全graph代码便可,后来才知道是要用邻接列表来实现。邻接列表到底是什么?书上草草解释不能让我全懂,天然不能顺利的完成做业。
  • 问题2的解决:
  • 邻接表,实际上是一个顶点表,每一个顶点又拥有一个边列表。下图是图的邻接表表示:

  • 从图中能够看出,图的实现须要可以表示顶点表,可以表示边表。邻接表指是的哪部分呢?每一个顶点都有一个邻接表,一个指定顶点的邻接表中,起始顶点表示边的起点,其余顶点表示边的终点。
  • 邻接表的处理方法是这样的。

一、图中顶点用一个一维数组存储,另外,对于顶点数组中,每一个数据元素还须要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。

二、图中每一个顶点vi的全部邻接点构成一个线性表,因为邻接点的个数不定,因此用单链表存储,无向图称为顶点vi的边表,有向图称为顶点vi做为弧尾的出边表。

代码实现时的问题做答 Exercise

  • 问题1:在编写无向网络时须要写一个最便宜路径的问题,当时没有想出来怎么去写,找了一下书上关于这个问题的描述,是关于用Dijkstra算法来解决的。那么,Dijkstra算法具体如何解决问题?
  • 问题1的解决:
  • 选了一篇我认为介绍的最清楚的博客

(1) 初始时,S只包含起点s;U包含除s外的其余顶点,且U中顶点的距离为"起点s到该顶点的距离"[例如,U中顶点v的距离为(s,v)的长度,而后s和v不相邻,则v的距离为∞]。 (2) 从U中选出"距离最短的顶点k",并将顶点k加入到S中;同时,从U中移除顶点k。 (3) 更新U中各个顶点到起点s的距离。之因此更新U中顶点的距离,是因为上一步中肯定了k是求出最短路径的顶点,从而能够利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。 (4) 重复步骤(2)和(3),直到遍历完全部顶点。

经过理解及其博客里面的代码讲解,就能够明白该算法的奥妙啦。

  • 问题2:在作pp15.1的时候出现了越界的问题。

  • 问题2的解决:正在改正····

上周测试活动错题改正 Correction

  • 问题1: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 <font color = red>√</font>
  • 问题1的改正:本题应该是错误的,选B。堆是一个彻底二叉树而不是一个二叉查找树,过低级的错误了,彻底粗心所致。

码云连接

代码量(截图)

结对及互评Group Estimate

点评模板:

  • 博客中值得学习的或问题:
    • 20172301:偏序和全序咱们在离散课上还没学到,可是你已经把拓扑排序和快速排序以及离散内容联系起来了,୧(๑•̀◡•́๑)૭ Amazing!
    • 20172304:博客真的进步很大呀!图片若是小一点就太好啦。代码错题解答能够再详细一点。继续加油!

其余(感悟、思考等,可选)Else

图这一章颇有趣。不少算法实现很新颖,须要好好理解消化。 还有代码实现确实很费时间呀(绕来绕去绕不过来) 正在继续告诉本身,请对专业课更加虔诚一点。

学习进度条Learning List

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 0/0 1/1 8/8
第二周 621/621 1/2 12/20
第三周 678/1299 1/3 10/30
第四周 2734/4033 1/4 20/50
第五周 1100/5133 1/5 20/70
第六周 1574/6707 2/7 15/85
第七周 1803/8510 1/8 20/105
第八周 2855/11365 2/10 25/130
第九周 2076/13441 1/11 25/155

参考资料Reference

相关文章
相关标签/搜索