天天看點

資料結構之圖

1. 圖的定義

圖(graph) 是由一些點(vertex) 和這些點之間的連線(edge) 所組成的;其中,點通常稱為頂點(vertex),而點到點之間的連線通常稱之為邊或者弧(edge)。通常記為G=(V,E);

要注意的是:線性表可以是空表,樹可以是空樹,圖不可以是空圖,圖可以沒有邊,但是至少要有一個頂點。

2. 圖的組成

圖由兩種類型的元素組成,頂點和邊,有時候,有向圖的邊也稱為弧。

資料結構之圖
  • 頂點代表對象,邊則建立起對象之間的關系或關聯。
  • 入度就是進入該頂點邊的數目,出度就是離開這個頂點邊的數目,有向圖的度就是入度加出度。
  • 邊是頂點之間的邏輯關系表示,邊集可以是空的

3. 圖的分類

  • 有向圖和無向圖。
    資料結構之圖
    • 有向圖中,邊是由兩個頂點組成的有序對,具有特定的方向。形象地說,有向圖可以由頂點和帶方向的箭頭所組成的圈繪制出來。
    • 無向圖中,邊是沒有方向的,是以,無向圖的邊就直接用線段來代替箭頭表示
  • 完全圖
    資料結構之圖
    • 完全圖如果任意兩個頂點之間都存在邊叫完全圖,而有向的邊叫有向完全圖。
    • 當一個圖接近完全圖時,則稱它為稠密圖(Dense Graph),而當一個圖含有較少的邊時,則稱它為稀疏圖。
  • 連通圖
    資料結構之圖
    • 無向圖中,兩頂點有路徑存在,就稱為連通的。若圖中任意兩頂點都連通,同此圖為連通圖。
  • 無權圖和帶權圖
    資料結構之圖
    • 對圖中的邊賦予具有一定意義的數值(路程、費用等等)的圖稱為帶權圖

4. 圖的存儲結構

資料結構之圖
  • 鄰接矩陣
    資料結構之圖
    • 鄰接矩陣用兩個數組儲存資料。一個一維數組存儲圖中頂點資訊,一個二維數組(鄰接矩陣)存儲圖中邊的資訊。
    • 頂點v1 和頂點v3 之間存在一條邊, 則稱頂點v1 和3 互為鄰接點。
    • 有向圖鄰接矩陣
      資料結構之圖
    • 無向圖鄰接矩陣
      資料結構之圖
    • 0 表示這兩個頂點之間沒有邊,1 表示有邊
    • 對應行非0元素的個數是出度;對應列非0元素的個數是入度
    • 優點: 可以快速判斷兩個頂點之間是否存在邊,可以快速添加邊或者删除邊。
    • 缺點: 由于存在n個頂點的圖需要n*n個數組元素進行存儲,當圖為稀疏圖時,使用鄰接矩陣存儲方法将會出現大量0元素,這會造成極大的空間浪費。
    • 實作代碼

5. 深度優先搜尋

資料結構之圖
  • 深度優先搜尋在搜尋過程中每當通路到某一個頂點後,需要遞歸地通路此頂點的所有未通路過的相鄰頂點。因而,這種搜尋将盡可能深地持續探索,直到無法繼續為止。

6. 廣度優先搜尋

資料結構之圖
  • 廣度優先搜尋在進一步探索圖中的頂點之前,先通路目前頂點的所有鄰接頂點。

最小生成樹

  • Kruskal 算法
    資料結構之圖
    • 此算法可以稱為“加邊法”,初始最小生成樹邊數為0,每疊代一次就選擇一條滿足條件的最小代價邊,加入到最小生成樹的邊集合裡。
  • Prim 算法
    資料結構之圖
    • 此算法可以稱為“加點法”,每次疊代選擇代價最小的邊對應的點,加入到最小生成樹中。算法從某一個頂點A開始,逐漸長大覆寫整個連通網的所有頂點。

繼續閱讀