2017-2018-20172309 《程序設計與數據結構》第九周學習總結

2017-2018-20172309 《程序設計與數據結構》第九周學習總結

1、教材學習內容總結

一些概念:

  • : 是一種複雜的非線性數據結構。
  • 圖的二元組定義:
    • 圖 G 由兩個集合 V 和 E 組成,記爲:
      G=(V, E) 其中: V 是頂點的有窮非空集合,
      E 是 V 中頂點偶對(稱爲邊)的有窮集。html

    • 一般,也將圖 G 的頂點集和邊集分別記爲 V(G) 和 E(G) 。 E(G) 能夠是空集。若 E(G) 爲空,則圖 G 只有頂點而沒有邊。
  • 有向圖: 若圖 G中的每條邊都是有方向的,則稱 G 爲有向圖 (Digraph) 。
  • 無向圖: 若圖G中的每條邊都是沒有方向的,則稱 G 爲無向圖 (Undigraph) 。
  • 徹底圖:
    • 無向圖中的每一個頂點之間存在着一條邊,那麼這個圖是無向徹底圖
    • 有向圖中的每兩個定點之間都存在着方向相反的兩條邊,則稱此圖爲有向徹底圖
  • 帶權圖:邊上具備權值的圖。
  • 最小生成樹:指的是有一個無向圖,根據這個圖構造一個包含全部頂點的樹,使得包含的邊的權值的和最小。
  • 最小路徑長度
    見下面教材中的問題!

圖的儲存:

  • 鄰接矩陣儲存法:採用2個數組來表示圖;一個是存儲全部頂點信息的一維數組(vetices[])、一個是存儲圖中頂點之間關聯關係的二維數組(adjMatrix[][]),這個二維數組稱爲鄰接矩陣。java

  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個邊表節點。在邊數少的狀況下,要比使用鄰接矩陣節省空間。
  • 圖的遍歷:分爲廣度優先遍歷深度優先遍歷

2、教材學習中的問題和解決過程

  • 問題1:書中有關integer的代碼什麼意思?node

  • 問題1解決方案:如圖:git


    由於隊列中儲存的數據是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++;
    }

代碼之家

課本上的代碼:

代碼託管

上週考試錯題總結

第十二章錯題

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算法。它能經過實際的幾個數組就能找到最短路徑!!!很驚訝!!!this

學習進度條(上學期截止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
第八週 2800/6900 1 /12 30/200

參考資料

  1. 如何判斷圖是否徹底
  2. Dijkstra 算法
  3. 迪傑斯特拉算法介紹
相關文章
相關標籤/搜索