20172312 2018-2019-1 《程序設計與數據結構》第九周學習總結

教材學習內容總結

第十五章

無向圖算法

1.圖是由結點和這些結點之間的鏈接所構成,結點叫作頂點,結點之間的鏈接是邊,樹是圖的一種。數組

2.無序圖是一種邊爲無序結點對的圖,若是圖中的兩個頂點之間有一條連通邊,則稱爲這兩個頂點是鄰接的,鄰接頂點有時也稱爲鄰居,連通一個頂點及其自身的邊稱爲自循環或環。網絡

3.路徑是圖中的一系列邊,路徑的長度是該路徑中邊的條數(或頂點數減1)。數據結構

4.若一個無向圖含有最多條邊,那麼它爲徹底圖。對於有n個頂點的無向圖,第x個頂點,須要(n-x)條邊將其與其餘頂點聯通,有n(n-1)/2條邊。學習

5.若無向圖中任意兩個頂點之間都存在一條路徑,那麼認爲這個無向圖是連通的。測試

有向圖

1.有向圖也稱爲雙向圖,它是一種邊爲有序頂點對的圖,有向圖中的路徑是圖中連通兩個頂點的有向邊序列。字體

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

3.可使用某一隊列列表(其中每一隊列都表示了給定優先級的項目)來實現一個優先級隊列.net

4.按照優先級對堆排序完成了第一次排序(高優先級的項目在先)。可是,咱們必須對具備相同優先級項目的先進先出排序進行操縱:
解決方案是建立一個 PriorityQueueNode對象,它存儲的是將被放置在隊列中的元素,該元素的優先級,以及元素放進隊列的順序
而後,咱們只需爲 PriorityNode類定義個 compareTo方法,以便先對優先級進行比較,而後在優先級同樣的時候再對階進行比較指針

網絡

1.網絡或稱加權圖,是一種每條邊都帶有權重或代價的圖,加權圖中的路徑權重是該路徑中各條邊權重的和。

2.對於網絡,咱們將用一個三元組來表示每條邊,這個三元組中包括起始頂點、終止頂點和權重。

3.對於無向網絡來講,起始頂點與終止頂點能夠互換。

經常使用圖算法

遍歷

1.廣度優先遍歷(隊列實現):首先,從圖的某個頂點v0出發,訪問了v0以後,依次訪問與v0相鄰的未被訪問的頂點,而後分別從這些頂點出發,廣度優先遍歷,直至全部的頂點都被訪問完。

 

  • (1)從一個未走到過的頂點做爲起始頂點,好比元素0頂點做爲起點。
  • (2)沿0頂點的邊去嘗試訪問其它未走到過的頂點,首先發現2頂點尚未走到過,因而來到了2頂點。
  • (3)返回到0頂點,再以0頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,這樣來到了1頂點。
  • (4)返回到0頂點,再以0頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,這樣來到了5頂點。
  • (5)此時沿0頂點的邊,已經不能訪問到其它未走到過的頂點了,因此須要返回到2頂點。
  • (6)沿2頂點的邊去嘗試訪問其它未走到過的頂點,(由於1頂點已經走過了)首先發現3頂點尚未走到過,因而來到了3頂點。
  • (7)返回到2頂點,再以2頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,這樣來到了4頂點。
  • (8)此時沿4頂點的邊,已經不能訪問到其它未走到過的頂點了,至此,全部頂點咱們都走到過了,遍歷結束。

2.深度優先遍歷(棧實現):首先從圖中某個頂點v0出發,訪問此頂點,而後依次從v相鄰的頂點出發深度優先遍歷,直至圖中全部與v路徑相通的頂點都被訪問了;若此時尚有頂點未被訪問,則從中選一個頂點做爲起始點,重複上述過程,直到全部的頂點都被訪問。在訪問某一個頂點時:將它標爲已訪問,遞歸的訪問它的全部未被標記過的鄰接點

 

  • (1)首先從一個未走到過的頂點做爲起始頂點,好比元素0頂點做爲起點。
  • (2)沿0頂點的邊去嘗試訪問其它未走到過的頂點,首先發現2頂點尚未走到過,因而來到了2頂點。
  • (3)再以2頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,這樣又來到了1頂點。
  • (4)再以1號頂點做爲出發點繼續嘗試訪問其它未走到過的頂點。
  • (5)此時沿1頂點的邊,已經不能訪問到其它未走到過的頂點了,因此須要返回到2頂點。
  • (6)返回到2號頂點後,以2頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,此時又會來到3頂點,再以3號頂點做爲出發點繼續訪問其它未走到過的頂點,因而又來到了5號頂點。
  • (7)此時沿5頂點的邊,已經不能訪問到其它未走到過的頂點了,因此須要返回到3頂點。
  • (8)返回到3頂點後,以3頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,此時會來到4頂點,再以4頂點做爲出發點繼續訪問其它未走到過的頂點。
  • (9)此時沿4頂點的邊,已經不能訪問到其它未走到過的頂點了,至此,全部頂點咱們都走到過了,遍歷結束。

圖算法

1.測試連通性:在一個圖中,不管哪一個爲起始頂點,當且僅當廣度優先遍歷中的頂點數等於圖中的頂點數目時,則該圖是連通的。

2.最小生成樹:

  • 生成樹是一棵含有圖中全部頂點和部分邊(可能不是全部邊)的樹。
  • 最小生成樹是邊的權重總和和小於或等於同一個圖中其餘任何一棵生成樹的權重總和。
  • 非連通的無向圖,不存在最小生成樹
  • 權重不必定和距離成正比
  • 權重多是0或負數
  • 若存在相等的權重,那麼最小生成樹可能不惟一 

3.判斷最短路徑:

  • 方法一:斷定起始頂點與目標頂點之間的字面意義上的最短路徑,即兩個頂點之間的最小邊數。
  • 方法二:在加權圖途中,尋找加權圖的最便宜路徑即爲最短路徑。

圖的實現

1.鄰接列表

  • 在鄰接表的表示中,無向圖的同一條邊在鄰接表中存儲的兩次。若是想要知道頂點的讀,只須要求出所對應鏈表的結點個數便可。
  • 有向圖中每條邊在鄰接表中只出現一此,求頂點的出度只須要遍歷所對應鏈表便可。求出度則須要遍歷其餘頂點的鏈表。

2.鄰接矩陣:

  • 在鄰接矩陣表示中,無向圖的鄰接矩陣是對稱的。矩陣中第 i 行或 第 i 列有效元素個數之和就是頂點的度。
  • 在有向圖中 第 i 行有效元素個數之和是頂點的出度,第 i 列有效元素個數之和是頂點的入度。

3.鄰接矩陣與鄰接表優缺點:

  • 鄰接矩陣的優勢是能夠快速判斷兩個頂點之間是否存在邊,能夠快速添加邊或者刪除邊。而其缺點是若是頂點之間的邊比較少,會比較浪費空間。由於是一個 n∗nn∗n 的矩陣。而鄰接表的優勢是節省空間,只存儲實際存在的邊。其缺點是關注頂點的度時,就可能須要遍歷一個鏈表。還有一個缺點是,對於無向圖,若是須要刪除一條邊,就須要在兩個鏈表上查找並刪除。

4.邊集數組:

  • 邊集數組由兩個一維數組構成:一個存儲頂點信息; 一個存儲邊的信息,這個邊數組每一個數據元素由一條邊的起點下標、終點下標、和權組成。
  • 邊集數組關注的是邊的集合,在邊集數組中要查找一個頂點的度須要掃描整個邊數組,效率並不高。所以它更適合對邊依次進行處理的操做,而不適合對頂點相關的操做。

5.十字鏈表:

  • 十字鏈表是爲了便於求得圖中頂點的度(出度和入度)而提出來的。用十字鏈表來存儲有向圖,能夠達到高效的存取效果。它是綜合鄰接表和逆鄰接表形式的一種鏈式存儲結構。

6.鄰接多重表:

  • 鄰接多重表主要用於存儲無向圖。若是用鄰接表存儲無向圖,每條邊的兩個邊結點分別在以該邊所依附的兩個頂點爲頭結點的鏈表中,這給圖的某些操做帶來不便。所以,在進行這一類操做的無向圖的問題中採用鄰接多重表做存儲結構更爲適宜。

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

  • 問題1:關於圖的六種實現,只看懂了鄰接列表,鄰接矩陣,對於剩下的三種則徹底沒有理解。
  • 問題1解決方案:在詢問了同窗以後,理解了剩下的三種實現策略,可後面想要編寫代碼卻徹底卡死,看書也看不懂,因而去百度了一下,發現了一片博客,裏面有詳盡的圖的各類實現方法。(https://blog.csdn.net/whuhan2013/article/details/51760211
  • 鄰接表實現無向圖
    (01) ListUDG是鄰接表對應的結構體。
    mVexNum是頂點數,mEdgNum是邊數;mVexs則是保存頂點信息的一維數組。
    (02) VNode是鄰接表頂點對應的結構體。
    data是頂點所包含的數據,而firstEdge是該頂點所包含鏈表的表頭指針。
    (03) ENode是鄰接表頂點所包含的鏈表的節點對應的結構體。
    ivex是該節點所對應的頂點在vexs中的索引,而nextEdge是指向下一個節點的

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

  • 問題1:無

碼雲連接

結對及互評

博客中值得學習的或問題:

  • 博客排版工整,界面很美觀,而且本週還對博客排版、字體作了調整,很用心
  • 問題總結作得很全面:對課本上不懂的代碼會作透徹的分析,即使能夠直接拿過來用而不用管他的含義

本週結對學習狀況

  • 20172315
  • 20172318

結對學習內容

    • 邊集數組,十字鏈表實現圖

參考資料

數據結構之圖的實現

相關文章
相關標籤/搜索