1. 程式人生 > >【資料結構】圖的儲存結構

【資料結構】圖的儲存結構

是否可以採用順序儲存結構儲存圖?

圖的特點:頂點之間的關係是m:n,即任何兩個頂點之間都可能存在關係(邊),無法通過儲存位置表示這種任意的邏輯關係,所以,圖無法採用順序儲存結構。

如何儲存圖?

考慮圖的定義,圖是由頂點和邊組成的,分別考慮如何儲存頂點、如何儲存邊。

鄰接矩陣(陣列)表示法

基本思想:用一個一維陣列儲存圖中頂點的資訊,用一個二維陣列(稱為鄰接矩陣)儲存圖中各頂點之間的鄰接關係。

假設圖A=(V,E)有n個頂點,則鄰接矩陣是一個n×n的方陣,定義為:

圖示

圖示

分析1:無向圖的鄰接矩陣是對稱的;
分析2:頂點i 的度=第 i 行 (列) 中1 的個數;
特別:完全圖的鄰接矩陣中,對角元素為0,其餘全1。

圖示

注:在有向圖的鄰接矩陣中,
第i行含義:以結點vi為尾的弧(即出度邊);
第i列含義:以結點vi為頭的弧(即入度邊)。

圖示

特別討論 :網(即有權圖)的鄰接矩陣

圖示

鄰接矩陣的優點:容易實現圖的操作,如:求某頂點的度、判斷頂點之間是否有邊(弧)、找頂點的鄰接點等等。

鄰接矩陣的缺點:n個頂點需要n*n個單元儲存邊(弧);空間效率為O(n^2)。 對稀疏圖而言尤其浪費空間。

鄰接表(鏈式)表示法

對每個頂點vi 建立一個單鏈表,把與vi有關聯的邊的資訊(即度或出度邊)連結起來,表中每個結點都設為3個域;

圖示

圖示

鄰接表儲存法的特點:—它其實是對鄰接矩陣法的一種改進

對於n個頂點e條邊的無向圖,鄰接表中除了n個頭結點外,只有2e個表結點,儲存規模為n+2e,空間複雜度為O(n+e)。若是稀疏圖(e<<n^2),則比鄰接矩陣表示法O(n^2)省空間。

怎樣計算無向圖頂點的度?TD(Vi)=單鏈表中連結的結點個數

在有向圖中,鄰接表中除了n個頭結點外,只有e個表結點,儲存規模為n+e,空間複雜度為O(n+e)。若是稀疏圖,則比鄰接矩陣表示法合適。

圖示

鄰接表的優點:

空間效率高;容易尋找頂點的鄰接點;

鄰接表的缺點:

判斷任意兩頂點間是否有弧或邊,需搜尋兩結點(或之一)對應的單鏈表,沒有鄰接矩陣方便。

討論:鄰接表與鄰接矩陣有什麼異同之處?

  1. 聯絡:鄰接表中每個連結串列對應於鄰接矩陣中的一行,連結串列中結點個數等於一行中非零元素的個數。
  2. 區別:
    ① 對於任一確定的圖,鄰接矩陣是唯一的(行列號與頂點編號一致),但鄰接表不唯一(連結次序與頂點編號無關)。
    ② 鄰接矩陣的空間複雜度為O(n^2),而鄰接表的空間複雜度為O(n+e)。
  3. 用途:鄰接矩陣多用於稠密圖的儲存(e接近n(n-1)/2);而鄰接表多用於稀疏圖的儲存(e<<n^2)

十字連結串列

它是有向圖的另一種鏈式結構。

思路:將鄰接矩陣用連結串列儲存,是鄰接表、逆鄰接表的結合。

1、每條弧對應一個結點(稱為弧結點,設5個域)
2、每個頂點也對應一個結點(稱為頂點結點,設3個域)

圖示

圖示

鄰接多重表

這是無向圖的另一種儲存結構,當對邊操作時,無向圖應採用此種結構儲存。

1、每條邊只對應一個結點(稱為邊結點),設立6個域;
2、每個頂點也對應一個結點(頂點結點),設立2個域;

圖示

圖示