20182305 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结

20182305 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结

教材学习内容总结

课本第十九章主要学习无向图、有向图、带权图、常用图的算法、图的实现。

  • 如果图中的两个顶点之间有边连接,则称他们是邻接的。
  • 如果无向图中连接顶点的边数达到最大,则这个图是完全图。
  • 图中两个顶点连接的边的序列叫做序列。即从一个顶点到达另一个顶点要走过的边。
  • 经过一系列不重复的边回到出发的顶点就可以形成一个环。
  • 遍历:
    • 广度优先遍历:类似树中的层次遍历。把图的每一邻接的横向依次遍历。
    • 深度优先遍历:顾名思义,把图的每一邻接的纵向遍历,类似树的前序遍历。
    • 深度优先遍历和广度优先遍历的唯一不同是使用的是栈而不是队列来管理。
  • 最小生成树(minimum spanning tree):边的权值之和小于或等于其他任意一棵生成树的边的权值之和。

图的实现策略:用邻接列表或者邻接矩阵等。有向图和无向图是不同的。

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

  • 问题一:广度遍历搜索和深度遍历搜索的区别不是很明白。
  • 问题一解决方法:经过老师上课讲解,外加加分作业的尝试。让我对广度遍历有更深的理解。
    具体细节在代码调试部分说明。

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

  • 问题一:关于广度优先遍历算法的代码实现。
  • 问题一解决办法:
public void createGraph(int num, Graph2 adj) {
        Vexs = new Node[num];
        vexnum = num;
        for (int i = 0; i < num; i++) {
            Vexs[i] = new Node();
            Vexs[i].name = "V" + "" + (i+1);
            for (int j = 0; j < num; j++) {
                if (adj.adjMatrix[i][j] != 0) {
                    Node temp1 = new Node();
                    temp1.name = "V" + "" + (j+1);

                    Node  temp2 = Vexs[i];
                    while (temp2.next != null) {
                        temp2 = temp2.next;
                    }
                    temp2.next = temp1;
                }
            }
        }
    }

// 邻接表的BFS
    public void Graph1BFS() {
        int[] visited = new int[vexnum];// 判断是否访问
        System.out.println("想要从哪个节点开始遍历:");
        int v_num = input.nextInt();
        while (v_num < 1 || v_num > vexnum) {
            System.out.println("范围不符合,请重新输入:");
            v_num = input.nextInt();
        }

        //
        Queue Q = new Queue();// 辅助队列初始化
        Q.push(v_num);// 开始节点入队
        System.out.print("V" + v_num);
        visited[v_num - 1] = 1;
        Node temp;
        while (Q.top != 1) {
            v_num = Q.pop();
            temp = Vexs[v_num - 1];
            while (temp.next != null) {
                temp = temp.next;
                String s = temp.name.substring(1);  //获取结点名字的数字序号
                if(visited[Integer.parseInt(s) - 1]==0)
                {
                    Q.push(Integer.parseInt(s));// 该节点入队
                    System.out.print(" --> " + temp.name);
                    visited[Integer.parseInt(s) - 1] = 1;
                }
            }
        }
        System.out.println();
    }
  • 问题二:如何用合适的方法创建图、并建立结点之间的连接关系。
  • 问题二的解决方法:使用邻接矩阵的方法表示结点之间相连的关系。虽然有些麻烦,但是比较实用。
public void createGraph2() {
            System.out.println("请输入结点数:");
            num1 = input.nextInt();
            System.out.println("请输入边数:");
            num2 = input.nextInt();
            adjMatrix = new int[num1][num1];
            int i = 0;
            int vexA, vexB;
            while (i < num2) {
                System.out.println("请输入相连接的结点");
                vexA = input.nextInt();
                while (vexA < 1 || vexA > num1)
                {
                    System.out.println("范围不符合,请重新输入:");
                    vexA = input.nextInt();
                }
                vexB = input.nextInt();
                while (vexB < 1 || vexB > num1)
                {
                    System.out.println("范围不符合,请重新输入:");
                    vexB = input.nextInt();
                }
                adjMatrix[vexA - 1][vexB - 1] = 1;
                adjMatrix[vexB - 1][vexA - 1] = 1;

                if (i == num2 - 1)
                {
                    System.out.println("Ending!");
                }
                else
                {
                    System.out.println("Continue!");
                }
                i++;
            }
        }

代码托管

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

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 6000行 30篇 400小时
第一周 200/200 2/2 17/17
第二、三周 556/756 3/5 31/48 明白了类与方法的关系,对Java编程的思想的了解有了一些进步
第四周 673/1429 2/7 12/60 对两段代码之间的关系了解了一些
第五周 1308/2737 2/9 25/85
第六周 800/3537 2/11 18/103
第七周 4195/7732 2/13 27/130
第八周 489/8221 1/14 6/136
第九周 2893/11114 3/17 30/166
第十周 1405/12519 1/18 由于大作业的存在,我已经不知道自己在这门课上花了多少时间了
posted @ 2019-11-26 23:14  20182305孙铭泽  阅读(164)  评论(0编辑  收藏  举报