1. 程式人生 > >資料結構——圖(2)——圖的儲存和表示方式.md

資料結構——圖(2)——圖的儲存和表示方式.md

圖的儲存方式

在實踐中,圖最常見的策略是:

  • 將每個節點的連線儲存在鄰接列表中。
  • 將整個圖形的連線儲存在鄰接矩陣中。

用鄰接連結串列來表示圖之間的關係

在圖中表示連線的最簡單方法是在每個節點的資料結構中儲存與其連線的節點的列表。該結構稱為鄰接列表。 例如,在航空公司圖表中
在這裡插入圖片描述
每一個節點連線的相鄰節點構成一個鄰接表,就像這樣:
在這裡插入圖片描述

使用鄰接矩陣表示節點間的關係

雖然臨接表提供了一種表示圖形中連線的便捷方式,但是當操作需要搜尋與節點關聯的節點時,它的效率可能會低下。 例如,如果使用鄰接列表表示,則確定是兩個節點是否相互連線需要O(D)時間,其中D表示節點之間的度。 如果圖中的節點都具有少量鄰居,則搜尋該列表的成本很小。 但是,如果圖中的節點往往具有大量鄰居,則此成本變得很高。
如果效率成為一個很關心的問題,那麼我們可以通過在稱為鄰接矩陣的二維陣列中表示節點之間的花費(即權重),該陣列顯示哪些節點已連線。 航空公司圖的鄰接矩陣如下所示:

在這裡插入圖片描述
通常X部分我們用∝表示,意思是兩個節點之間沒有直接關聯。
特別的,當圖為無向圖是,鄰接矩陣是對稱的(如上圖所示),因為每個相鄰節點之間有相互的關係。(這個時候,如果矩陣很大,可以採取壓縮矩陣的方式將矩陣壓縮。矩陣的壓縮後面會提到)
要使用鄰接矩陣,必須將每個節點與其索引號相關聯,該索引號指定該表中與該節點對應的列或行號。 作為圖的具體結構的一部分,實現需要為圖中的每個節點分配一行和一列的二維陣列。 陣列的元素是布林值。 如果matrix [start] [finish]中的條目為真,則圖中就有表示 start→finish的節點間的關係。

兩種表示方式的空間複雜度

就執行時間而言,使用鄰接矩陣比使用鄰接列表快得多。 但另一方面,矩陣需要O(N^2)儲存空間(如果不壓縮),其中N是節點的數量。 對於大多數圖形,鄰接列表表示在空間方面往往更有效。 在鄰接列表表示中,每個節點都有一個連線列表,在最壞的情況下,它的長度將是Dmax,其中Dmax是圖中任一節點的最大度數,即從單個節點出發的最大連線數。 因此,鄰接列表的空間成本是O(N×Dmax)。 如果大多數節點彼此連線,則Dmax將相對接近N,這意味著表示連線的成本對於兩種方法是相近的的。 另一方面,如果圖形包含許多節點但相對較少的互連(稱為稀疏矩陣

),則鄰接列表表示可以節省相當大的空間。

除此之外,圖的儲存方式還有鄰接多重表和十字連結串列法。