1. 程式人生 > >圖的鄰接矩陣和鄰接表的比較

圖的鄰接矩陣和鄰接表的比較

圖的儲存結構主要分兩種,一種是鄰接矩陣,一種是鄰接表。
1.鄰接矩陣
圖的鄰接矩陣儲存方式是用兩個陣列來表示圖。一個一維陣列儲存圖中頂點資訊,一個二維陣列(鄰接矩陣)儲存圖中的邊或弧的資訊。
設圖G有n個頂點,則鄰接矩陣是一個n*n的方陣,定義為:
這裡寫圖片描述
看一個例項,下圖左就是一個無向圖。
這裡寫圖片描述
從上面可以看出,無向圖的邊陣列是一個對稱矩陣。所謂對稱矩陣就是n階矩陣的元滿足aij = aji。即從矩陣的左上角到右下角的主對角線為軸,右上角的元和左下角相對應的元全都是相等的。
從上面可以看出,無向圖的邊陣列是一個對稱矩陣。所謂對稱矩陣就是n階矩陣的元滿足aij = aji。即從矩陣的左上角到右下角的主對角線為軸,右上角的元和左下角相對應的元全都是相等的。
從這個矩陣中,很容易知道圖中的資訊。
(1)要判斷任意兩頂點是否有邊無邊就很容易了;
(2)要知道某個頂點的度,其實就是這個頂點vi在鄰接矩陣中第i行或(第i列)的元素之和;
(3)求頂點vi的所有鄰接點就是將矩陣中第i行元素掃描一遍,arc[i][j]為1就是鄰接點;
而有向圖講究入度和出度,頂點vi的入度為1,正好是第i列各數之和。頂點vi的出度為2,即第i行的各數之和。
若圖G是網圖,有n個頂點,則鄰接矩陣是一個n*n的方陣,定義為:這裡寫圖片描述

1.2 鄰接表
鄰接矩陣是不錯的一種圖儲存結構,但是,對於邊數相對頂點較少的圖,這種結構存在對儲存空間的極大浪費。因此,找到一種陣列與連結串列相結合的儲存方法稱為鄰接表。
鄰接表的處理方法是這樣的:
(1)圖中頂點用一個一維陣列儲存,當然,頂點也可以用單鏈表來儲存,不過,陣列可以較容易的讀取頂點的資訊,更加方便。
(2)圖中每個頂點vi的所有鄰接點構成一個線性表,由於鄰接點的個數不定,所以,用單鏈表儲存,無向圖稱為頂點vi的邊表,有向圖則稱為頂點vi作為弧尾的出邊表。
例如,下圖就是一個無向圖的鄰接表的結構。
這裡寫圖片描述
從圖中可以看出,頂點表的各個結點由data和firstedge兩個域表示,data是資料域,儲存頂點的資訊,firstedge是指標域,指向邊表的第一個結點,即此頂點的第一個鄰接點。邊表結點由adjvex和next兩個域組成。adjvex是鄰接點域,儲存某頂點的鄰接點在頂點表中的下標,next則儲存指向邊表中下一個結點的指標。
對於帶權值的網圖,可以在邊表結點定義中再增加一個weight的資料域,儲存權值資訊即可。如下圖所示。
這裡寫圖片描述


3.兩者區別
對於一個具有n個頂點e條邊的無向圖
它的鄰接表表示有n個頂點表結點2e個邊表結點
對於一個具有n個頂點e條邊的有向圖
它的鄰接表表示有n個頂點表結點e個邊表結點
如果圖中邊的數目遠遠小於n2稱作稀疏圖,這是用鄰接表表示比用鄰接矩陣表示節省空間;
如果圖中邊的數目接近於n2,對於無向圖接近於n*(n-1)稱作稠密圖,考慮到鄰接表中要附加鏈域,採用鄰接矩陣表示法為宜。