20172311《程序设计与数据结构》第九周学习总结
教材学习内容总结
第十五章 图
- 允许树的每个结点连通多个其他结点,不再有父亲、孩子之说,那么就得到了图的概念。
- 无向图
- 无向图是一种边为无序结点对的图
- 如果图中的两个顶点之间有一条连通边,则称两个顶点是邻接的
- 连通一个顶点及其自身的边称为自循环
- 对有n个顶点的无向图,要使该图为完全的,要有n(n-1)/2条边(此处假设没有自循环)
- 路径长度是该路径中边的条数
- 如果无向图中任意两个顶点之间都存在一条路径,则认为这个无向图是连通的
- 环路是一种首末顶点相同且没有重边的路径
- 有向图
- 有向图是一种边为有序顶点对的图
- 网络
- 网络是一种每条边都带有权重或代价的图
- 网络可以是无向的也可以是有向的
- 常用的图算法
- 图的遍历主要分为广度优先遍历和深度优先遍历
- 广度优先遍历可使用一个 队列和无序列表实现,深度优先遍历可使用一个栈和无序列表实现
- 广度优先遍历栈和队列变化过程
1.示例从9开始遍历
2.遍历过程中栈和队列的变化过程
- 测试连通性方法:在一个含n个顶点的图中,当且仅当对每个顶点v,从v开始的广度优先遍历的resultList大小都是n(即广度优先便利中的顶点数目等于图中顶点数目)时,该图时连通的
- 最小生成树是相对于网络而言,其边的权重总和小鱼或等于同一个图中其他任何一颗生成树的权重总和
- 生成最小生成树过程中最小堆和生成树的变化过程
1.示例从5开始生成最小生成树
2.生成过程中最小堆和生成树的变化过程
- 判定最短路径一种是判断两顶点间的最小边数,另一种是寻找加权图的最便宜路径
- 可通过邻接列表和邻接矩阵的方法实现图
教材学习中的问题和解决过程
- 问题1:深度优先遍历无序列表和栈的变化过程是怎样的?
- 问题1解决方案:通过与同学讨论得出如下总结:
1.深度优先遍历的算法表述如下:
1.访问初始结点v,并标记结点v为已访问。
2.查找结点v的第一个邻接结点w。
3.若w存在,则继续执行4,否则算法结束。
4.若w未被访问,对w进行深度优先遍历递归(即把w当做另一个v,然后进行步骤123)。
5.查找结点v的w邻接结点的下一个邻接结点,转到步骤3。
2.遍历过程分析如下:
过程分析:
(1)、首先节点 1 进栈,节点1在栈顶;
(2)、然后节点1出栈,访问节点1,节点1的孩子节点3进栈,节点2进栈;
(3)、节点2在栈顶,然后节点2出栈,访问节点2
(4)、节点2的孩子节点5进栈,节点4进栈
(5)、节点4在栈顶,节点4出栈,访问节点4,
(6)、节点4左右孩子为空,然后节点5在栈顶,节点5出栈,访问节点5;
(7)、节点5左右孩子为空,然后节点3在站顶,节点3出栈,访问节点3;
(8)、节点3的孩子节点7进栈,节点6进栈
(9)、节点6在栈顶,节点6出栈,访问节点6;
(10)、节点6的孩子为空,这个时候节点7在栈顶,节点7出栈,访问节点7
(11)、节点7的左右孩子为空,此时栈为空,遍历结束。
- 问题2:用邻接列表实现图的整体思路应该是怎样的?
- 问题2解决方:通过与同学讨论并查阅资料得出如下总结:
(一)无向图邻接表
(二)有向图邻接表
(三)带权邻接表
**(四)邻接表的数据结构 **
代码调试中的问题和解决过程
- 问题1:
用邻接矩阵实现的图在测试广度优先遍历时出现错误如下:
起初我以为是遍历方法有错,但是经过调试后发现是之前的链式队列的enqueue方法有问题
错误的enqueue方法代码如下:
public void enqueue(T element)
{
LinearNode<T> node = new LinearNode<T>(element);
if (isEmpty())
head = node;
else
tail = node;
count++;
}
修改后的enqueue方法如下:
public void enqueue(T element)
{
LinearNode<T> node = new LinearNode<T>(element);
if (isEmpty())
head = node;
else
tail.setNext(node);
tail = node;
count++;
}
修改后运行结果如下:
- 问题1解决方案:
代码托管
上周考试错题总结
本周无错题!
结对及互评
- 本周结对学习情况
本周主要对图进行了学习,刚开始的时候非常懵,经过对课本的深入学习以及与同学们的讨论还有老师的指点才算是理解了图。同时与结对伙伴对图的实现进行了较为深入的讨论,收获很多,希望继续加油,一起努力取得更大的进步!
感想
努力,努力再努力吧!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 4/4 | |
第二周 | 464/464 | 1/2 | 10/14 | 理解掌握了用数组和链表实现栈的方法 |
第三周 | 494/958 | 1/3 | 10/24 | 理解掌握了用数组和链表实现队列的方法 |
第四周 | 1629/2587 | 2/5 | 20/44 | 对用链表和数组实现列表进行了学习 |
第五周 | 856/3443 | 2/7 | 15/59 | 较为深入的学习了查找和排序方法的实现 |
第六周 | 668/4111 | 1/8 | 20/79 | 学习了链式二叉树的实现 |
第七周 | 900/5011 | 1/9 | 15/99 | 对二叉查找树进行了较为深入的学习 |
第八周 | 1378/6389 | 2/10 | 16/115 | 较为深入的学习理解了堆 |
第九周 | 1700/8089 | 1/11 | 12/127 | 图的理解和实现 |
-
计划学习时间:16小时
-
实际学习时间:12小时
-
改进情况:进一步提高学习效率,遇到问题努力去解决!