讀古今文學網 > 學習JavaScript數據結構與算法(第2版) > 9.2 圖的表示 >

9.2 圖的表示

從數據結構的角度來說,我們有多種方式來表示圖。在所有的表示法中,不存在絕對正確的方式。圖的正確表示法取決於待解決的問題和圖的類型。

9.2.1 鄰接矩陣

圖最常見的實現是鄰接矩陣。每個節點都和一個整數相關聯,該整數將作為數組的索引。我們用一個二維數組來表示頂點之間的連接。如果索引為i 的節點和索引為j 的節點相鄰,則array[i][j] === 1,否則array[i][j] === 0,如下圖所示:

不是強連通的圖(稀疏圖)如果用鄰接矩陣來表示,則矩陣中將會有很多0,這意味著我們浪費了計算機存儲空間來表示根本不存在的邊。例如,找給定頂點的相鄰頂點,即使該頂點只有一個相鄰頂點,我們也不得不迭代一整行。鄰接矩陣表示法不夠好的另一個理由是,圖中頂點的數量可能會改變,而2維數組不太靈活。

9.2.2 鄰接表

我們也可以使用一種叫作鄰接表的動態數據結構來表示圖。鄰接表由圖中每個頂點的相鄰頂點列表所組成。存在好幾種方式來表示這種數據結構。我們可以用列表(數組)、鏈表,甚至是散列表或是字典來表示相鄰頂點列表。下面的示意圖展示了鄰接表數據結構。

儘管鄰接表可能對大多數問題來說都是更好的選擇,但以上兩種表示法都很有用,且它們有著不同的性質(例如,要找出頂點vw 是否相鄰,使用鄰接矩陣會比較快)。在本書的示例中,我們將會使用鄰接表表示法。

9.2.3 關聯矩陣

我們還可以用關聯矩陣來表示圖。在關聯矩陣中,矩陣的行表示頂點,列表示邊。如下圖所示,我們使用二維數組來表示兩者之間的連通性,如果頂點v是邊e的入射點,則array[v][e] === 1;否則,array[v][e] === 0。

關聯矩陣通常用於邊的數量比頂點多的情況下,以節省空間和內存。