20172301 《程序设计与数据结构》第九周学习总结

20172301 《程序设计与数据结构》第九周学习总结

教材学习内容总结

概念

  • 图:顶点(vertice)和边(edge)构成。
    • 邻接的(adjacent):图中的两个顶点之间有一条连通边。
    • 邻居:邻接顶点。
    • 自循环(环):连通一个顶点及其自身的边。
    • 路径:由一个顶点到达另外一个顶点。
    • 路径长度:路径边的条数(顶点数 - 1)。
    • 环路:一种首顶点和末顶点相同且没有重边的路径。没有环路则是无环的(acyclic)。
  • 无向图:是一种边为无序结点对的图。
    • 彻底的:无向图拥有最大数目的连通顶点的边。
      对于n个顶点的无向图,要是彻底的,要有n(n-1)/2条边,假设没有边是自循环的。
    • 连通的:无向图中任意两个顶点之间都存在一条路径。
  • 无向树:一种连通的无环无向图,其中一个元素被指定为树根。
  • 有向图:也称双向图,一种边为有序顶点对的图。
    • 有向图的路径不是双向的,反方向路径不成立。
  • 有向树:指定一个元素做为树根。
    • 不存在其余顶点到树根的链接。
    • 每一个非树根元素刚好有一个链接。
    • 树根到每一个其余顶点都有一条路径。
  • 网络:一种每条边都带有权重或代价的图。路径权重是该路径中各条边权重的和。

常见的图算法

  • 遍历
    • 广度优先遍历:相似树中的层次遍历。把图的每一邻接的横向依次遍历。
    • 深度优先遍历:顾名思义,把图的每一邻接的纵向遍历,相似树的前序遍历。
    • 深度优先遍历和广度优先遍历的惟一不一样是使用的是栈而不是队列来管理。
  • 测试连通性:
    从任意结点开始的广度优先遍历中获得的顶点数等于图中所含顶点数,则是连通的。
  • 最小生成树(minimum spanning tree):边的权值之和小于或等于其余任意一棵生成树的边的权值之和。
  • 图的实现策略:用邻接列表或者邻接矩阵等。有向图和无向图是不一样的。

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

  • 问题1:书P309 介绍了拓扑序的概念(topplogical order)html

    有向图没有环路,且有一条从A到B的边,则能够把顶点A安排在顶点B以前。这种排列获得的顶点次序成为拓扑序。git

  • 问题1解决方案:算法

    首先,了解一下拓扑排序的概念。网络

  • 维基百科中:
    在图论中,由一个有向无环图的顶点组成的序列,当且仅当知足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting)。
    (1)每一个顶点出现且只出现一次;
    (2)若A在序列中排在B的前面,则在图中不存在从B到A的路径。
    也能够定义为:拓扑排序是对有向无环图的顶点的一种排序,它使得若是存在一条从顶点A到顶点B的路径,那么在排序中B出如今A的后面。数据结构

  • 还有一个关于拓扑序的定义:
    学习

对于拓扑排序,即找到起始点,即入度等于0 ,的状况下到 最终的点的检索过程,可是其中图中不能有环路,若是有环路的状况下,将会出现入度都相互相等的状况,这样就会有点没法输出。测试

存在一个新的名词,入度优化

  • 图中的度:所谓顶点的度(degree),就是指和该顶点相关联的边数。
    在有向图中,度又分为入度和出度。
  • 入度 (in-degree):以某顶点为弧头,终止于该顶点的弧的数目称为该顶点的入度。
  • 出度 (out-degree):以某顶点为弧尾,起始于该顶点的弧的数目称为该顶点的出度。
  • 如图

以咱们书上的有向图为例:
D顶点入度为2,出度为1,度为3。spa

因此拓扑排序也能够用来检验有向图中那个是否有环.net

拓扑排序的做用

  • 咱们说快速排序是不稳定的,这是由于最后的快排结果中相同元素的出现顺序和排序前不一致了。若是用偏序的概念能够这样解释这一现象:相同值的元素之间的关系是没法肯定的。所以它们在最终的结果中的出现顺序能够是任意的。
  • 而对于诸如插入排序这种稳定性排序,它们对于值相同的元素,还有一个潜在的比较方式,即比较它们的出现顺序,出现靠前的元素大于出现后出现的元素。所以经过这一潜在的比较,将偏序关系转换为了全序关系,从而保证告终果的惟一性。而拓扑排序就是一种将偏序转换为全序的一种算法。

这里又要补充两个概念:偏序和全序

  • 离散数学中关于偏序和全序的定义:
    若集合X上的关系R是自反的、反对称的和传递的,则称只是集合X上的偏序关系。
    设R是集合X上的偏序(Partial Order),若是对每一个x,y∈X必有xRy或yRx,则称R是集合X上的全序关系。
  • 偏序:集合内只有部分元素之间在这个关系下是能够比较的。
    好比:复数集中并非全部的数均可以比较大小,那么“大小”就是复数集的一个偏序关系。
  • 全序:集合内任何一对元素在在这个关系下都是相互可比较的。
    好比:有限长度的序列按字典序是全序的。最多见的是单词在字典中是全序的。

  • 偏序:有向图中两个顶点之间不存在环路,至于连通与否,是无所谓的。
    全序:就是在偏序的基础之上,有向无环图中的任意一对顶点还须要有明确的关系(反映在图中,就是单向连通的关系,注意不能双向连通,那就成环了)。
    意思就是讲,一个不肯定的偏序关系经全序后就有一种肯定的前后顺序了。

既然有前后,那么拓扑排序的应用

  • 书上说的在实际生活中的选课问题,好比大一时必定要修完这门课,大二才学第二门课,这种排课问题就是拓扑排序问题。
  • 拓扑排序经常使用来肯定一个依赖关系集中,事物发生的顺序。例如,在平常工做中,可能会将项目拆分红A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项目进行的顺序,可对这个关系集进行拓扑排序,得出一个线性的序列,则排在前面的任务就是须要先完成的任务。
    注意:这里获得的排序并非惟一的!就好像你早上穿衣服能够先穿上衣也能够先穿裤子,只要里面的衣服在外面的衣服以前穿就行。
  • 问题2:对于书P313 图15.7遍历理解问题。书上给出了广度优先遍历的步骤和结果,那么对于深度优先遍历的步骤结果是怎样的呢?

  • 问题2解决方案:
    • 我认为,若是从顶点9开始,而后是顶点6,而后依次是顶点3,顶点1,这时候,我认为,他会一直遍历下去,也就是顶点2,顶点5,顶点8,一直到起始顶点。
    • 而后,我向侯泽洋同窗请教了深度遍历的过程,他当时说,从顶点6到顶点1是没有问题的,可是,到顶点1以后,应该是从顶点9的相邻顶点开始从新遍历。
    • 在以后,我又研究了一下深度遍历的代码,书上有这样一句重要的话我忽略了。

      图的深度优先遍历和广度优先遍历的惟一不一样是,它使用的是栈而不是队列来管理遍历的。

    • 因此,在一开始我就犯了一个错误,根据栈的性质——先进后出,那么应该是从顶点8开始向下遍历,而且一直到没有邻接顶点或者顶点已经被访问过。也就是说,若是是一个环路,那么他会从头遍历到尾,一直走到黑。

  • 问题3:书P313说 测试连通性,经过比较广度优先遍历中的顶点数目和图中的顶点数目是否相等来判断。也就是说任意一个顶点都必须知足这个条件。那么,咱们为何不仅要判断出有广度优先遍历的顶点数目和图中的顶点数目不相等的时候就不连通呢,这样能够有效减小遍历次数,优化算法的效率。
  • 问题3的解决方案:
    • 虽然,图示中给的是测试无向图的连通性,可是,咱们须要考虑有向图。在有向图中,路径是不可逆的,也就是说,顶点存在有可能正向出发遍历全部的顶点,而反向却不能够。 这时,为了保证任意顶点广度优先遍历的顶点数目和图中的顶点数目相等,咱们须要从全部顶点遍历一次。
    • 可是对于无向图来讲,我认为是可行的。可是算法的复杂度并无减小,只是提升了效率。

代码调试中的问题和解决过程

  • 问题1:图中删除结点操做,可否调用删除边的操做。
  • 问题1解决方案:
    • 我认为 ,删除结点,就是把结点与其余结点的边删除,而后结点个数减1。
    • 可是这样是有缺陷的。

      如图,咱们删除结点D,依据个人想法只要删除结点D与结点C之间的边便可,可是,这个结点D依然存在于图中,只不过和其余顶点没有了联系而已。至于顶点数减一怕不是自欺欺人,掩耳盗铃罢了。

代码托管

上周考试错题总结

无错题,优秀!

结对及互评

点评过的同窗博客和代码

  • 上周博客互评状况
    • 20172304
    • 教材内容总结愈来愈丰富,图文搭配的非常恰当,博客进步很大。在代码理解方面还需努力。
    • 20172328
    • 博客仍是一如既往的优秀,借鉴和查找了不少网上的相关算法和原理理解,这样有助于本身的代码实现。有时候,一味的硬肝是不成熟的,灵活的运用才是代码实现的关键。

其余

图是数据结构中应用范围是较为普遍的,实现的方法也是多种多样。代码理解和实现的难度一样是有的。有些逻辑也较为复杂,须要潜心判断和思考。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 10/10
第二周 610/610 1/2 20/30
第三周 593/1230 1/3 18/48
第四周 2011/3241 2/5 30/78
第五周 956/4197 1/6 22/100
第六周 2294/6491 2/8 20/120
第七周 914/7405 1/9 20/140
第八周 2366/9771 2/11 22/162
第九周 1549/11320 1/12 22/184

参考资料

相关文章
相关标签/搜索