20172322 《程序設計與數據結構》第九周學習總結

20172322 《程序設計與數據結構》第九周學習總結

教材學習內容總結

本章的內容主要講圖的知識,圖與樹的定義相似,讓樹容許在其每一個結點連通多個其餘節點,再也不有父親孩子之說時就成了圖。圖由頂點構成,頂點通常由A,B,C,D等表示,相應的邊能夠表示成(A,B),(B,C)等。圖分爲兩種:有向圖和無向圖。java

  • 無向圖:邊爲無序結點的圖。在無向圖中邊(A,B)和邊(B,A)所蘊含的意義是相同的。
    • 鄰接的頂點:若是兩個頂點之間有一條邊連通,這兩個頂點就是連通的。
    • 徹底的無向圖:對於有n個頂點的無向圖來講,若是有n(n-1)/2條邊,該無向圖就是徹底的。
    • 路徑的長度:路徑是圖中全部的邊的總和,路徑的長度是路徑中邊的條數。
    • 連通的無向圖:若是無向圖中任意兩個頂點之間都存在一條路徑,則認爲該無向圖是連通的。git

    • 環路:首末頂點相同且沒有重邊的路徑。
    • 無向樹:連通的、無環無向的圖,其中一個元素被指定爲樹根。
  • 有向圖:邊爲有序結點的圖。在有向圖中邊(A,B)和邊(B,A)所蘊含的意義是不一樣的。
    • 路徑:圖中連通兩個頂點的有向邊序列。
    • 拓撲序:在有向圖中,有一條邊從A到B,則把A安排在B以前,這種排列順序成爲拓撲序。
  • 網絡(加權圖):每一條邊都有相應的價值或者代價。
  • 圖的遍歷:
    • 廣度優先遍歷:相似於樹的層序遍歷,例如:
    從 A 開始的遍歷順序爲(鄰接的遍歷順序爲字母升序):ABCEDF。
    • 深度優先遍歷:相似於樹的前序遍歷,例如:
    從 A 開始的遍歷順序爲(鄰接的遍歷順序爲字母升序):ABCEDF。
    • 深度優先遍歷和廣度優先遍歷的惟一不一樣是:深度優先遍歷使用棧而非隊列來管理遍歷。
  • 連通性測試:當且僅當廣度優先遍歷中的頂點數目等於圖中的頂點數目時,該圖纔是連通的。
  • 最小生成樹:首先明確生成樹的概念,包含圖的所有頂點和全部邊。最小生成樹,其邊的權重之和小於或等於同一個圖中其餘任何一個生成樹。例如,普利姆算法求最小生成樹:

    算法

  • 最小路徑的判斷:兩種狀況
    • 兩個頂點之間的最小邊數。
    • 加權圖的最便宜路徑。
  • 圖的實現策略:書上講到了兩種實現策略,鄰接列表和鄰接矩陣,而所謂鄰接指的就是實現圖的兩個相鄰的頂點鏈接起來。數組

圖的實現策略

鄰接列表實現

  • 首先,讓咱們來了解什麼是鄰接列表。鄰接列表:存儲方法跟樹的孩子鏈表示法相相似,是一種順序分配和鏈式分配相結合的存儲結構。如這個表頭結點所對應的頂點存在相鄰頂點,則把相鄰頂點依次存放於表頭結點所指向的單向鏈表中。

鄰接矩陣實現

  • 鄰接矩陣:利用一個二維數組實現的矩陣,行列的元素表明頂點,而矩陣中的元素表明邊。
  • 在無權圖中,矩陣中的元素爲1則表明有邊,而爲0時表明無邊。
  • 如圖:網絡

  • 在網絡中,矩陣中的元素爲非0則表明有邊,而爲0時表明無邊。
  • 如圖:數據結構

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

  • 問題一:最早看到書上的鄰接列表時比較懵逼,並且書上所述很是簡單,不知道鄰接列表的結構如何。
  • 問題一解決方案:先在網上查閱了部分資料後仍是不太明白,僅僅是發現它的結構跟鏈地址法有些相似,可是如何實現的邊不清楚,隨後向王志強老師求助,王老師說的確跟鏈地址法比較相似,可是還有一個更加生動的例子就是糖葫蘆串,每一個頂點把與本身相接的頂點列在本身的後面就能夠啦。就像這一張圖:
  • 問題二:書上關於無向圖的鄰接矩陣實現中是矩陣中的元素若是爲一則是連通的,而且是對稱的,那麼對於加權圖來講如何實現?
  • 問題二解決方案:其實這個問題很是簡單,只是本身的腦子沒扭過來,直接把那個1變爲須要加上的權重就實現了加權圖。oop

代碼調試中的問題和解決過程

  • 問題一:在實現書上的Graph類補全時遇到一些困難。。
  • 問題一解決方案:參考了一些方藝雯同窗的代碼,而且對我本身的代碼進行了一些優化,例如isEmpty方法,我本來的代碼以下:
public boolean isEmpty()
    {
        if (numVertices == 0)
        {
            return true;
        }
        else {
            return false;
        }
    }
  • 可是方藝雯同窗的代碼是
public boolean isEmpty()
    {
    return (numVertices == 0)
    }

本身想了想發現這樣的確會簡單不少。這告訴咱們應該多多想一想算法的優化。學習

代碼託管「點這裏跳轉到碼雲」

  • 這周PP15.7的commit寫錯了,應該是PP15.7而不是PP15.1。

上週考試錯題總結

  • 錯題1:Heap sort is O(________).
  • A .n
  • B .log n
  • C .n log n
  • D .None of the above
  • 錯題1解析:堆排序的時間複雜度是O(nlogn)測試

  • 錯題2:Heap sort is O(n log n).
  • A .True
  • B .Flase
  • 錯題2解析:跟上題同理。優化

結對及互評

  • 博客中值得學習的或問題:
    • 範雯琪同窗的博客課本上的學習內容總結部分寫得十分詳細,值得學習。
    • 每次看到範雯琪同窗的博客本身都比較慚愧,實在是很是優秀,可想而知她在博客這一方面所作出的努力,我也很是想一想她學習。
  • 代碼中值得學習的或問題:
    • commit提交的解釋清晰明瞭,我以爲我應該學習。
    • 有許多代碼的問題都是我向她詢問,我很感謝她

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20172303

    • 結對學習內容
      • 她提醒了個人PP12.1有點問題,感謝。

其餘

  • 感悟:感受圖的知識有一些難度,特別是剛剛開始接觸的時候,鄰接列表的知識讓我無從下手。

課本單詞

(本部分用於收集本章節後的生詞)

  • graph:圖
  • vertice:頂點
  • edge:邊
  • undirected graph:無向圖
  • adjacent:鄰接的
  • self-loop:自循環
  • complete:徹底的
  • path:路徑
  • path length:路徑長度
  • connected:連通的
  • cycle:環路
  • acyclic:無環的
  • directed graph:有向圖
  • topological order:拓撲序
  • network(weighted graph):網絡(加權圖)
  • breadth-first traversal:寬度優先遍歷
  • depth-first traversal:深度優先遍歷
  • spanning tree:生成樹
  • minimun spanning tree:最小生成樹
  • adjacency list:鄰接列表
  • adjacency matrix:鄰接矩陣

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/5000 2/2 8/8 認真學習!積極向上
第二週 812/812 1/3 22/30
第三週 814/1626 1/4 20/50
第四周 1386/3012 2/6 20/70 愉快的國慶節就要結束了...
第五週 1222/3234 1/7 30/100
第六週 1327/4561 2/7 30/100 啦啦啦啦啦
第七週 1170/5631 1/8 33/133
第八週 1250/6881 2/10 30/163
第九周 2275/9156 1/11 31/194
  • 改進狀況:根據學姐的建議在借鑑代碼時放上了本身的代碼並加以說明。

參考資料

相關文章
相關標籤/搜索