20172303 2018-2019-1《程序设计与数据结构》第9周学习总结

Posted pframe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172303 2018-2019-1《程序设计与数据结构》第9周学习总结相关的知识,希望对你有一定的参考价值。

20172303 2018-2019-1《程序设计与数据结构》第9周学习总结

教材学习内容总结

常见的非线性结构有两种——树和图,在经过了三周对树的学习之后,本周我们接触了另一种非线性结构图的相关内容,包括图的概念、图的分类、图的实现方法等。

一、图的概述

  • 概念:树中的每个结点都只有一个父结点,如果我们允许一个结点连通多个其他结点,树就变成了图。
  • 相关术语:
    • 顶点(Vertex):图中的数据元素。
    • 边(Edge):图中各个顶点之间的连接。
    • 邻接/邻居:两个顶点之间有一条边,则称这两个顶点是邻接的。
    • 路径:连接两个顶点之间的一系列边称为两个顶点间的路径,边的条数称为路径长度(路径长度=顶点数-1)。
    • 环路:首顶点与末顶点相同且路径中没有边重复的路径。
  • 例:
    【图】
    • 顶点:A,B,C,D
    • 边:(A,B)(A,C)(B,C)(B,D)(C,D)
    • 邻接:A与B是邻接结点,A与D不是邻接结点
    • 路径:A→D——(A,B)(B,C)(C,D) 路径长度为3
    • 环路:A→A——(A,B)(B,C)(C,A)
  • 分类:
    • 【是否有方向】无向图和有向图
    • 【每条边带有权重或代价】加权图/网络(加权图可以是有向的也可以是无向的)
    • 【特殊的图】生成树

1.无向图

【图】

  • 无向图是一种边为无序结点对的图。在无向图中,(A,B)(B,A)指的是一条边,表示A与B之间有一条两个方向都连通的边。
  • 完全:一个无向图是完全的,说明对于有n个顶点的无向图,图中有n(n-1)/2条边。
  • 连通:如果无向图中的任何两个顶点之间都存在一条路径,则认为该无向图是连通的。
    • 同时连通还分为强连通和弱连通(非强连通),强连通图中,任何两个顶点之间都是连通的,就是说任何两个顶点之间都至少有一条路径。
    • 完全图一定是连通图,连通图不一定是完全图。
  • 无向树:一种连通的没有环路的,其中一个元素被指定为树根的图。

2.有向图

  • 有向图/双向图是一种边为有序顶点对的图。在无向图中,(A,B)(B,A)指的不是一条边,(A,B)表示从A到B有一条连通的边,但B到A没有。
  • 拓扑序:书上的说法是:“如果有向图中没有环路,且有一条从A到B的边,则可以把顶点A安排在顶点B之前,这种排列得到的顶点次序称为拓扑序”。说实话我看了七八遍也没看懂这句话说的是什么意思,后来上百度搜了一下,有了下面这张图就很好理解了。【图】
  • 有向树:其中一个元素被指定为树根的有向图称为有向树。

3.加权图

  • 加权图/网络:是一种每条边都带有权重或代价的图。加权图中,某一条路径的权重等于该路径中所有边权重的总和。【图】
  • 加权图中边的表示:在普通的图中,我们表示边时只需要起始顶点和终止顶点即可,但是在加权图中,除了上面的两项外还需要增加一个表示权重的元素。例如在有向图中,从A到B之间有一条边,权重为3,那么它的表示就为(A,B,3)

4.生成树

  • 概念:一颗含有图中所有顶点和部分边的树。一个图的生成树不一定是唯一的
  • 最小/大生成树:树中的路径权重总和小于/大于它所来源的图中的任何一颗生成树的权重总和。

二、图的算法

(一)遍历

  • 图的遍历分为两种:广度优先遍历(简称BFS,与树中的层序遍历类似)深度优先遍历(简称DFS,与树中的前序遍历类似)。
  • 广度优先遍历——使用一个队列和一个无序列表来实现,队列用于管理遍历,无序列表用于存储遍历结果。
    • 第一步:起始顶点进入队列,标记为已访问。
    • 第二步:从队列中取出起始顶点加入无序列表的末端,让与该顶点相连的还未被标记为已访问的顶点加入队列中,把它们都标记为已访问。
    • 第三步:重复第二步的操作,每次取出队列中的首个顶点加入无序列表,直至队列为空。
  • 深度优先遍历——使用一个栈和一个无序列表来实现,栈的作用与广度优先遍历中队列的作用相同。
    • 第一步:起始顶点进入栈。
    • 第二步:从栈中取出起始顶点加入无序列表的末端,标记为已访问,让与该顶点相连的顶点加入栈中。
    • 第三步:重复第二步的操作,每次取出栈顶元素加入无序列表,把顶点标记为已访问,直至栈为空。
  • 实例【图】
    • 广度优先遍历(书上有详细过程,就不在此详列了):9、6、7、8、3、4、5、1、2
    • 深度优先遍历:9、8、5、1、4、2、3、7、6【图】

(二)测试连通性

  • 要判断一个图的连通性,需要确定图中的任意两个顶点之间都有一条路径,如果直接判断的话时间复杂度会很大。书上给出了一种简单的判断方法:在一个含n个顶点的图中,当且仅当图中的每个顶点的广度优先遍历的无序列表长度都为n时,证明该图就是连通的。

(三)最小生成树

  • 推衍算法(以最小生成树为例):在寻找最小树的过程中需要一个最小堆用于每次寻找最小边
    • (1)从图中任选一个起始顶点,将它添加到最下生成树中
    • (2)将所有含起始顶点的边按照权重由小到大的顺序加入到最小堆中
    • (3)从最小堆中选出权重最小的边,将该边和与该边连接的最小生成树中没有的顶点加入最小生成树中,加入的顶点成为新的起始顶点。
    • (4)重复第二和第三步直至最小生成树中含有图的所有顶点或最小堆为空时。

(四)判断最短路径

  • 情况一:最短路径为两个顶点之间的最小边数
    • 这种情况下将广度优先遍历进行修改即可实现,修改方式为在遍历的过程中增加两个信息:从起始顶点到遍历到该顶点的路径长度,以及路径中该顶点的前驱结点。
    • **

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

  • 问题1:
  • 问题1解决方案:
  • 问题2:
  • 问题2解决方法:
  • 问题3:
  • 问题3解决方法:

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

  • 问题1:
  • 问题1解决方法:
  • 问题2:
  • 问题2解决方法:

代码托管

上周考试错题总结(正确为绿色,错误为红色)

上周没有测试。

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • 优点:本周的博客大有长进!内容丰富了很多,终于做到了图文并茂,值得夸奖!
    • 问题:图片的排版还需加强。
  • 代码中值得学习的或问题:
    • 优点:提了几周的commit提交终于有所改进,感觉这周我的搭档有了质的飞跃。可能是一遍遍的吐槽起了作用,果然像马原老师说的一样,量变会引起质变!
    • 问题:本周代码的备注不是很多。

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172322
    • 结对学习内容
      • 给我讲解了课堂实验ASL计算的方法。
      • 主要探讨了归并排序的计数方法。

## 其他(感悟、思考等,可选)

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 10/10 1/1 10/10
第二周 246/366 2/3 20/30
第三周 567/903 1/4 10/40
第四周 2346/3294 2/6 20/60
第五周 2346/3294 2/8 30/90
第六周 1343/4637 2/8 20/110
第七周 654/5291 1/9 25/135
第八周 2967/8258 1/10 15/150
第九周 2967/8258 2/12 15/150
  • 计划学习时间:20小时

  • 实际学习时间:30小时

  • 改进情况:本周的大部分时间基本都花在了对于查找算法和排序算法的理解上了,感觉对时间复杂度理解和计算的应用变得更加熟练了。

参考资料

以上是关于20172303 2018-2019-1《程序设计与数据结构》第9周学习总结的主要内容,如果未能解决你的问题,请参考以下文章

20172303 2018-2019-1 《程序设计与数据结构》第5周课堂实践报告

20172303 2018-2019-1 《程序设计与数据结构》第3周学习总结

20172303 2018-2019-1 《程序设计与数据结构》第2周学习总结

20172303 2018-2019-1《程序设计与数据结构》第4周学习总结

20172303 2018-2019-1 《程序设计与数据结构》第2周课堂实践修改报告

20172303 2018-2019-1 《程序设计与数据结构》第一周学习总结