【資料結構】圖的儲存結構
是否可以採用順序儲存結構儲存圖?
圖的特點:頂點之間的關係是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)。若是稀疏圖,則比鄰接矩陣表示法合適。
鄰接表的優點:
空間效率高;容易尋找頂點的鄰接點;
鄰接表的缺點:
判斷任意兩頂點間是否有弧或邊,需搜尋兩結點(或之一)對應的單鏈表,沒有鄰接矩陣方便。
討論:鄰接表與鄰接矩陣有什麼異同之處?
- 聯絡:鄰接表中每個連結串列對應於鄰接矩陣中的一行,連結串列中結點個數等於一行中非零元素的個數。
- 區別:
① 對於任一確定的圖,鄰接矩陣是唯一的(行列號與頂點編號一致),但鄰接表不唯一(連結次序與頂點編號無關)。
② 鄰接矩陣的空間複雜度為O(n^2),而鄰接表的空間複雜度為O(n+e)。 - 用途:鄰接矩陣多用於稠密圖的儲存(e接近n(n-1)/2);而鄰接表多用於稀疏圖的儲存(
e<<n^2
)
十字連結串列
它是有向圖的另一種鏈式結構。
思路:將鄰接矩陣用連結串列儲存,是鄰接表、逆鄰接表的結合。
1、每條弧對應一個結點(稱為弧結點,設5個域)
2、每個頂點也對應一個結點(稱為頂點結點,設3個域)
鄰接多重表
這是無向圖的另一種儲存結構,當對邊操作時,無向圖應採用此種結構儲存。
1、每條邊只對應一個結點(稱為邊結點),設立6個域;
2、每個頂點也對應一個結點(頂點結點),設立2個域;