2017-2018-20172309 《程序设计与数据结构》第九周学习总结

2017-2018-20172309 《程序设计与数据结构》第九周学习总结

一、教材学习内容总结

一些概念:

  • : 是一种复杂的非线性数据结构。
  • 图的二元组定义:
    • 图 G 由两个集合 V 和 E 组成,记为:
      G=(V, E) 其中: V 是顶点的有穷非空集合,
      E 是 V 中顶点偶对(称为边)的有穷集。
    • 通常,也将图 G 的顶点集和边集分别记为 V(G) 和 E(G) 。 E(G) 可以是空集。若 E(G) 为空,则图 G 只有顶点而没有边。
  • 有向图: 若图 G中的每条边都是有方向的,则称 G 为有向图 (Digraph) 。
  • 无向图: 若图G中的每条边都是没有方向的,则称 G 为无向图 (Undigraph) 。
  • 完全图:
    • 无向图中的每个顶点之间存在着一条边,那么这个图是无向完全图
    • 有向图中的每两个定点之间都存在着方向相反的两条边,则称此图为有向完全图
  • 带权图:边上具有权值的图。
  • 最小生成树:指的是有一个无向图,根据这个图构造一个包含所有顶点的树,使得包含的边的权值的和最小。
  • 最小路径长度
    见下面教材中的问题!

图的储存:

  • 邻接矩阵储存法:采用2个数组来表示图;一个是存储所有顶点信息的一维数组(vetices[])、一个是存储图中顶点之间关联关系的二维数组(adjMatrix[][]),这个二维数组称为邻接矩阵。

  1. 对于无向图a,邻接矩阵是一个对称矩阵adjMatrix[i][j]==1,说明定点i与定点j是联通的。
  2. 对于有向图b,当a能到达b时,二维数组adjMatrix[a][b]=1;
    • 邻接矩阵的缺点:

      1. 闲置的单元浪费大量的空间:由n个顶点构成的图中最多可以有n2条边,但大多数情况下,边的数目远远达不到这个量级,因此大多数单元都是闲置的.
      2. 矩阵结构是静态的,大小N需要预先估计,然后创建N*N的矩阵,而图的规模往往是动态变化的,N估计过大会造成空间浪费,过小则造成空间不够用。
  • 邻接列表储存法:对于n个顶点、m条边的无向图,采用邻接表,需要n个表头节点和2m个边表节点。在边数少的情况下,要比使用邻接矩阵节省空间。
  • 图的遍历:分为广度优先遍历深度优先遍历

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

  • 问题1:书中有关integer的代码什么意思?

  • 问题1解决方案:如图:


    因为队列中储存的数据是Integer类型的,而numVerticesint类型的,因此应该转化为Integer型,对应的方法为:

    那么新的问题又来了:为什么一定要Integer,直接用int不好吗?
    答案:Integer是其包装类,注意是一个类。而int 是基本数据类型.我们使用integer是为了在各种类型间转化,通过各种方法的调用

  • 问题2:如何理解广度、深度优先遍历?
  • 问题2解决方案:
    • 广度优先遍历:左看看、又看看,雨露均沾

      • 伪代码:
      1. 初始化队列:visited[n] = 0
      2. 访问顶点:visited[v] = 1
      3. 顶点v加入队列
      4. 循环:
        while(队列是否为空)
            v = 队列头元素
            w = v的第一个邻接点
            while(w存在)
                if(如果w未访问)
                    visited[w] = 1;
                    顶点w加入队列
                    w = 顶点v的下一个邻接点
    • 深度优先遍历:一条路走到底。
      • 伪代码:
      1. 访问数组初始化:visited[n] = 0
      2. 访问顶点:visited[v] = 1
      3. 取v的第一个邻接点w;
      4. 循环递归:
           while(w存在)
               if(w未被访问过)
               从顶点w出发递归执行;
             w = v的下一个邻接点;
  • 问题三:如何理解迪杰斯特拉算法
  • 解决方法:
    • 感觉这里讲的非常好.
    • 所以我还是自己简单总结下吧。
      • 这个算法是用来计算两点之间的最短路径的,生活中多用来计算两地之间的来往的最少车费。
      • 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
      • 举个例子吧:

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

  • 问题1:如何判断图的的一个图是否连通?
  • 问题1解决方案:
    • 如果是连通的,当且仅当使用广度优先遍历中的定点数等于图中的顶点数。
    • 因此,我们只要定义一个int值,当每遍历一个顶点,就加一。遍历完成后,看该值是否等于顶点数就OK啦。
    • 代码实现
    public boolean isConnected()
     {
         boolean result = true;
         for(int i=0;i<numVertices;i++){
             int temp=0;
             temp=getSizeOfIterator(this.iteratorBFS(vertices[i]));
             if(temp!=numVertices)
             {
                 result = false;
                 break;
             }
         }
         return result;
     }
  • 问题2:完成pp15.1过程中 出现 边不显示空指针两个问题!

  • 问题2解决方案:首先 肯定是 输出方法出现了问题,解决后发现应该这样:

    然后出现的问题是:

    经分析:肯定是哪句代码错了:导致全部连在一起了!

    值得注意的是 在无向图中添加边,应该两边的联系都要考虑:

 public void addEdge(int index10 , int index20){
       int  index1 =index10-1;
       int  index2 =index20-1;
        if (indexIsValid(index1)&&indexIsValid(index2)){
            GraphNode temp = vertices[index1];//得到首结点

            while (temp.getNext()!=null){
                if (temp.getNext().getElement() == vertices[index2].getElement()) {
                    System.out.println("已存在该边!");
                    break;
                }
                    temp = temp.next;
            }
            temp.next = new GraphNode(vertices[index2].getElement());//有index10--》index20

            GraphNode temp2 = vertices[index2];

            while (temp2.getNext()!=null){
                if (temp2.getNext().getElement() == vertices[index1].getElement()) {
                    System.out.println("已存在该边!");
                    break;
                }
                temp2 = temp2.next;
            }
            temp2.next = new GraphNode(vertices[index1].getElement());//有index20--》index10
        }

        modCount++;
    }

代码之家

课本上的代码:

代码托管

  • pp15.7:

    • NetworkGraph
    • test测试类

(statistics.sh脚本的运行结果截图)

上周考试错题总结

第十二章错题

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

错误原因:堆是一棵完全二叉树、不是一颗二叉搜索树。自己瞎了眼!!!!

点评模板:

博客或代码中值得学习的或问题:

-
-
- 

点评过的同学博客和代码

  • 本周结对学习情况

    • 20172310
    • 结对学习内容
      • 是十五章--图
      • 了解图的运用--加权图:航线问题
      • 了解图的遍历。
  • 上周博客互评情况

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

这一章内容比较简单,或者可以说书上的内容比较简单,但是实现起来很难。也可能是书上的例子比较少的原因。还有就是发现里面的几个算法是非常有意思的,比如Dijkstra算法。它能通过实际的几个数组就能找到最短路径!!!很惊讶!!!

学习进度条(上学期截止7200)

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 260/0 1/1 05/05
第二周 300/560 1/2 13/18
第三周 212/772 1/4 21/39
第四周 330/1112 2/7 21/60
第五周 1321/2433 1/8 30/90
第六周 1024/3457 1/9 20/110
第七周 1024/3457 1/9 20/130
第八周 643/4100 2/11 30/170

参考资料

  1. 如何判断图是否完全
  2. Dijkstra 算法
  3. 迪杰斯特拉算法介绍

原文地址:https://www.cnblogs.com/dky-wzw/p/9979551.html

时间: 2024-11-08 05:09:46

2017-2018-20172309 《程序设计与数据结构》第九周学习总结的相关文章

马凯军201771010116《面向对象与程序设计Java》第九周学习总结

一.理论知识部分 异常.日志.断言和调试 1.异常:在程序的执行过程中所发生的异常事件,它中断指令的正常执行. 2.Java的异常处理机制可以控制程序从错误产生的位置转移到能够进行错误处理的位置. 3.程序中出现的常见的错误和问题有:用户输入错误.设备错误.物理限制.代码错误. 4.Java把程序运行时可能遇到的错误分为两类: (1)非致命异常:通过某种修正后程序还能继续执行.这类错误叫作异常.如:文件不存在.无效的数组下标.空引用.网络断开.打印机脱机.磁盘满等. Java中提供了一种独特的处

《JAVA程序设计》_第九周学习总结

一.学习内容 1.数据库的建立.配置 在官网先下载好MySQL.navicat for MySQL.XAMPP.MySQL-connecter 在XAMPP中点击start开启MySQL 在navicat for MySQL中点击连接,输入信息后确定 在连接名处右击,创建新数据库,输入数据库名,字符集和校对均选择gb2312... 在表处右击,输入表的信息 点开创建的mess表输入信息,按tab键可快速换行 将MySQL-connecter添加到IDEA的module中 输入以下代码,检测数据库

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

学号20172328<程序设计与数据结构>第九周学习总结 教材学习内容总结(异常和递归) 第11章:异常 1.[异常处理]: 一个异常:是一个定义非正式情况或错误的对象,由程序或者运行时环境抛出,可以根据需要捕获和处理. 错误:错误类似于异常,但是错误代表不可恢复的问题并且必须捕获处理. 2.[处理异常的三种方法]:①根本不处理异常②当异常发生时处理异常③在程序的某个位置集中处理异常. 3.[未捕获的异常]:如果程序中不处理异常,则程序将非正常的终止运行,并产生关于描述在何处发生什么异常的信息

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

学号 20172326 <程序设计与数据结构>第九周学习总结 教材学习内容总结 异常(exception):定义非正常情况下或错误的情况的对象,由程序或运行时环境抛出,可根据需要进行相应的捕获处理. 异常与错误的区别:错误代表不可恢复的问题并且必须捕获处理.而异常可以忽视,或者使用try语句处理,或调用更高级的方法. 可检测异常与不可检测异常:可检测异常必须由方法捕获,或者必须在可能抛出或传递异常方法的throws子句中列出来.在方法定义的声明头中追加一条throws子句.不可检测异常不需要使

20172322 2017-2018-2 《程序设计与数据结构》第九周学习总结

20172322 2017-2018-2 <程序设计与数据结构>第九周学习总结 教材学习内容总结 异常 学会了使用try-catch来实现未捕获的异常的处理.可以使得异常被捕获进而不导致程序出现错误退出.使用try写入可能产生异常的语句,使用catch来编写在捕获异常后继续执行的代码(可以为空). "未捕获的异常"指在编译过程中不会被编译软件显示异常但是在运行时会出现异常导致程序直接退出,例如:"ArithmeticException"."In

20172311 2017-2018-2 《程序设计与数据结构》第九周学习总结

20172311 2017-2018-2 <程序设计与数据结构>第九周学习总结 教材学习内容总结 本周对异常和递归进行了学习 异常的处理方式有两种:一种是直接抛出,并从异常处终止程序:另一种是捕获并处理异常,从而使程序继续运行. 捕获和处理异常主要运用try-catch语句. 通过继承Exception类可以自定义一个新的异常 处理IO异常的常用方法是抛出异常. 对于某些问题,递归是最精炼和适当的解法,但对于其他问题,递归则不如迭代方法直接. 教材学习中的问题和解决过程 问题:什么是IO操作

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

20172327 2018-2019-1 <程序设计与数据结构>第九周学习总结 教材学习内容总结 第十五章 图 无向图 1.图的概念(非线性结构):允许树中每个结点与多个结点相连,不分父子结点. 2.图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: 边由连接的定点对来表示,如:(A,B),(C,D),表示两顶点之间有一条边. 3.无向图:顶点之间无序连接. 如:边(A,B)意味着A与B之间的连接是双向的,与(B,A)的含义一样. 4.邻接(邻居):两个顶点之间有边连接. 5.自

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

学号 20172326 <程序设计与数据结构>第九周学习总结 教材学习内容总结 图:图(Graph)是一种复杂的非线性结构,在图结构中,每个元素都可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的.与树的区别在于树中的一个结点只有一个前驱,也就是说只有一个父结点.但图中的顶点(结点)是没有这种限制关系的. 无向图:边为无需结点对的图.也就是说,现有两个顶点A.B.(A,B)与(B,A)效果相同.当两个顶点之间有边连接,也就是说这两个顶点是邻接的,也称作邻居.一个顶点

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

20172333 2018-2019-1 <程序设计与数据结构>第九周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十五章-图 一.无向图 ①无向图的定义 图是由结点与结点相连接构成的,与树类似.这些结点被常常称作顶点(vertice),这些顶点的连接叫做边(edge). 无向图(undirected graph)是一种边为无序结点对的图. 两个顶点之间有一条连通边的顶点,我们称作它们为领接的(adjacent).这两个顶点也叫作邻居(neighbor),自己是自己的