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

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

教材學習內容總結

概念

  • 圖:頂點(vertice)和邊(edge)構成。
    • 鄰接的(adjacent):圖中的兩個頂點之間有一條連通邊。
    • 鄰居:鄰接頂點。
    • 自循環(環):連通一個頂點及其自身的邊。
    • 路徑:由一個頂點到達另外一個頂點。
    • 路徑長度:路徑邊的條數(頂點數 - 1)。
    • 環路:一種首頂點和末頂點相同且沒有重邊的路徑。沒有環路則是無環的(acyclic)。
  • 無向圖:是一種邊爲無序結點對的圖。
    • 徹底的:無向圖擁有最大數目的連通頂點的邊。
      對於n個頂點的無向圖,要是徹底的,要有n(n-1)/2條邊,假設沒有邊是自循環的。
    • 連通的:無向圖中任意兩個頂點之間都存在一條路徑。
  • 無向樹:一種連通的無環無向圖,其中一個元素被指定爲樹根。
  • 有向圖:也稱雙向圖,一種邊爲有序頂點對的圖。
    • 有向圖的路徑不是雙向的,反方向路徑不成立。
  • 有向樹:指定一個元素做爲樹根。
    • 不存在其餘頂點到樹根的鏈接。
    • 每一個非樹根元素剛好有一個鏈接。
    • 樹根到每一個其餘頂點都有一條路徑。
  • 網絡:一種每條邊都帶有權重或代價的圖。路徑權重是該路徑中各條邊權重的和。

常見的圖算法

  • 遍歷
    • 廣度優先遍歷:相似樹中的層次遍歷。把圖的每一鄰接的橫向依次遍歷。
    • 深度優先遍歷:顧名思義,把圖的每一鄰接的縱向遍歷,相似樹的前序遍歷。
    • 深度優先遍歷和廣度優先遍歷的惟一不一樣是使用的是棧而不是隊列來管理。
  • 測試連通性:
    從任意結點開始的廣度優先遍歷中獲得的頂點數等於圖中所含頂點數,則是連通的。
  • 最小生成樹(minimum spanning tree):邊的權值之和小於或等於其餘任意一棵生成樹的邊的權值之和。
  • 圖的實現策略:用鄰接列表或者鄰接矩陣等。有向圖和無向圖是不一樣的。

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

  • 問題1:書P309 介紹了拓撲序的概念(topplogical order)html

    有向圖沒有環路,且有一條從A到B的邊,則能夠把頂點A安排在頂點B以前。這種排列獲得的頂點次序成爲拓撲序。git

  • 問題1解決方案:算法

    首先,瞭解一下拓撲排序的概念。網絡

  • 維基百科中:
    在圖論中,由一個有向無環圖的頂點組成的序列,當且僅當知足下列條件時,稱爲該圖的一個拓撲排序(英語:Topological sorting)。
    (1)每一個頂點出現且只出現一次;
    (2)若A在序列中排在B的前面,則在圖中不存在從B到A的路徑。
    也能夠定義爲:拓撲排序是對有向無環圖的頂點的一種排序,它使得若是存在一條從頂點A到頂點B的路徑,那麼在排序中B出如今A的後面。數據結構

  • 還有一個關於拓撲序的定義:
    學習

對於拓撲排序,即找到起始點,即入度等於0 ,的狀況下到 最終的點的檢索過程,可是其中圖中不能有環路,若是有環路的狀況下,將會出現入度都相互相等的狀況,這樣就會有點沒法輸出。測試

存在一個新的名詞,入度優化

  • 圖中的度:所謂頂點的度(degree),就是指和該頂點相關聯的邊數。
    在有向圖中,度又分爲入度和出度。
  • 入度 (in-degree):以某頂點爲弧頭,終止於該頂點的弧的數目稱爲該頂點的入度。
  • 出度 (out-degree):以某頂點爲弧尾,起始於該頂點的弧的數目稱爲該頂點的出度。
  • 如圖

以咱們書上的有向圖爲例:
D頂點入度爲2,出度爲1,度爲3。spa

因此拓撲排序也能夠用來檢驗有向圖中那個是否有環.net

拓撲排序的做用

  • 咱們說快速排序是不穩定的,這是由於最後的快排結果中相同元素的出現順序和排序前不一致了。若是用偏序的概念能夠這樣解釋這一現象:相同值的元素之間的關係是沒法肯定的。所以它們在最終的結果中的出現順序能夠是任意的。
  • 而對於諸如插入排序這種穩定性排序,它們對於值相同的元素,還有一個潛在的比較方式,即比較它們的出現順序,出現靠前的元素大於出現後出現的元素。所以經過這一潛在的比較,將偏序關係轉換爲了全序關係,從而保證告終果的惟一性。而拓撲排序就是一種將偏序轉換爲全序的一種算法。

這裏又要補充兩個概念:偏序和全序

  • 離散數學中關於偏序和全序的定義:
    若集合X上的關係R是自反的、反對稱的和傳遞的,則稱只是集合X上的偏序關係。
    設R是集合X上的偏序(Partial Order),若是對每一個x,y∈X必有xRy或yRx,則稱R是集合X上的全序關係。
  • 偏序:集合內只有部分元素之間在這個關係下是能夠比較的。
    好比:複數集中並非全部的數均可以比較大小,那麼「大小」就是複數集的一個偏序關係。
  • 全序:集合內任何一對元素在在這個關係下都是相互可比較的。
    好比:有限長度的序列按字典序是全序的。最多見的是單詞在字典中是全序的。

  • 偏序:有向圖中兩個頂點之間不存在環路,至於連通與否,是無所謂的。
    全序:就是在偏序的基礎之上,有向無環圖中的任意一對頂點還須要有明確的關係(反映在圖中,就是單向連通的關係,注意不能雙向連通,那就成環了)。
    意思就是講,一個不肯定的偏序關係經全序後就有一種肯定的前後順序了。

既然有前後,那麼拓撲排序的應用

  • 書上說的在實際生活中的選課問題,好比大一時必定要修完這門課,大二才學第二門課,這種排課問題就是拓撲排序問題。
  • 拓撲排序經常使用來肯定一個依賴關係集中,事物發生的順序。例如,在平常工做中,可能會將項目拆分紅A、B、C、D四個子部分來完成,但A依賴於B和D,C依賴於D。爲了計算這個項目進行的順序,可對這個關係集進行拓撲排序,得出一個線性的序列,則排在前面的任務就是須要先完成的任務。
    注意:這裏獲得的排序並非惟一的!就好像你早上穿衣服能夠先穿上衣也能夠先穿褲子,只要裏面的衣服在外面的衣服以前穿就行。
  • 問題2:對於書P313 圖15.7遍歷理解問題。書上給出了廣度優先遍歷的步驟和結果,那麼對於深度優先遍歷的步驟結果是怎樣的呢?

  • 問題2解決方案:
    • 我認爲,若是從頂點9開始,而後是頂點6,而後依次是頂點3,頂點1,這時候,我認爲,他會一直遍歷下去,也就是頂點2,頂點5,頂點8,一直到起始頂點。
    • 而後,我向侯澤洋同窗請教了深度遍歷的過程,他當時說,從頂點6到頂點1是沒有問題的,可是,到頂點1以後,應該是從頂點9的相鄰頂點開始從新遍歷。
    • 在以後,我又研究了一下深度遍歷的代碼,書上有這樣一句重要的話我忽略了。

      圖的深度優先遍歷和廣度優先遍歷的惟一不一樣是,它使用的是棧而不是隊列來管理遍歷的。

    • 因此,在一開始我就犯了一個錯誤,根據棧的性質——先進後出,那麼應該是從頂點8開始向下遍歷,而且一直到沒有鄰接頂點或者頂點已經被訪問過。也就是說,若是是一個環路,那麼他會從頭遍歷到尾,一直走到黑。

  • 問題3:書P313說 測試連通性,經過比較廣度優先遍歷中的頂點數目和圖中的頂點數目是否相等來判斷。也就是說任意一個頂點都必須知足這個條件。那麼,咱們爲何不僅要判斷出有廣度優先遍歷的頂點數目和圖中的頂點數目不相等的時候就不連通呢,這樣能夠有效減小遍歷次數,優化算法的效率。
  • 問題3的解決方案:
    • 雖然,圖示中給的是測試無向圖的連通性,可是,咱們須要考慮有向圖。在有向圖中,路徑是不可逆的,也就是說,頂點存在有可能正向出發遍歷全部的頂點,而反向卻不能夠。 這時,爲了保證任意頂點廣度優先遍歷的頂點數目和圖中的頂點數目相等,咱們須要從全部頂點遍歷一次。
    • 可是對於無向圖來講,我認爲是可行的。可是算法的複雜度並無減小,只是提升了效率。

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

  • 問題1:圖中刪除結點操做,可否調用刪除邊的操做。
  • 問題1解決方案:
    • 我認爲 ,刪除結點,就是把結點與其餘結點的邊刪除,而後結點個數減1。
    • 可是這樣是有缺陷的。

      如圖,咱們刪除結點D,依據個人想法只要刪除結點D與結點C之間的邊便可,可是,這個結點D依然存在於圖中,只不過和其餘頂點沒有了聯繫而已。至於頂點數減一怕不是自欺欺人,掩耳盜鈴罷了。

代碼託管

上週考試錯題總結

無錯題,優秀!

結對及互評

點評過的同窗博客和代碼

  • 上週博客互評狀況
    • 20172304
    • 教材內容總結愈來愈豐富,圖文搭配的非常恰當,博客進步很大。在代碼理解方面還需努力。
    • 20172328
    • 博客仍是一如既往的優秀,借鑑和查找了不少網上的相關算法和原理理解,這樣有助於本身的代碼實現。有時候,一味的硬肝是不成熟的,靈活的運用纔是代碼實現的關鍵。

其餘

圖是數據結構中應用範圍是較爲普遍的,實現的方法也是多種多樣。代碼理解和實現的難度一樣是有的。有些邏輯也較爲複雜,須要潛心判斷和思考。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 10/10
第二週 610/610 1/2 20/30
第三週 593/1230 1/3 18/48
第四周 2011/3241 2/5 30/78
第五週 956/4197 1/6 22/100
第六週 2294/6491 2/8 20/120
第七週 914/7405 1/9 20/140
第八週 2366/9771 2/11 22/162
第九周 1549/11320 1/12 22/184

參考資料

相關文章
相關標籤/搜索