20182305 2019-2020-1 《數據結構與面向對象程序設計》第十週學習總結

20182305 2019-2020-1 《數據結構與面向對象程序設計》第十週學習總結

教材學習內容總結

課本第十九章主要學習無向圖、有向圖、帶權圖、經常使用圖的算法、圖的實現。git

  • 若是圖中的兩個頂點之間有邊鏈接,則稱他們是鄰接的。
  • 若是無向圖中鏈接頂點的邊數達到最大,則這個圖是徹底圖。
  • 圖中兩個頂點鏈接的邊的序列叫作序列。即從一個頂點到達另外一個頂點要走過的邊。
  • 通過一系列不重複的邊回到出發的頂點就能夠造成一個環。
  • 遍歷:
    • 廣度優先遍歷:相似樹中的層次遍歷。把圖的每一鄰接的橫向依次遍歷。
    • 深度優先遍歷:顧名思義,把圖的每一鄰接的縱向遍歷,相似樹的前序遍歷。
    • 深度優先遍歷和廣度優先遍歷的惟一不一樣是使用的是棧而不是隊列來管理。
  • 最小生成樹(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
第2、三週 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 因爲大做業的存在,我已經不知道本身在這門課上花了多少時間了
相關文章
相關標籤/搜索