圖的存儲結構(十字鏈表、鄰接多重表、邊集數組)

原文:http://blog.fishc.com/2535.html

十字鏈表

 

鄰接表固然優秀,但也有不足,例如對有向圖的處理上,有時候需要再建立一個逆鄰接表~

那我們思考了:有沒有可能把鄰接表和逆鄰接表結合起來呢?

 

答案是肯定的,這就是我們現在要談的十字鏈表(Orthogonal List)

爲此我們重新定義頂點表結點結構:

十字鏈表

十字鏈表

 

接着重新定義邊表結點結構:

十字鏈表

十字鏈表

十字鏈表

十字鏈表

 

十字鏈表的好處就是因爲把鄰接表和逆鄰接表整合在了一起,這樣既容易找到以Vi爲尾的弧,也容易找到以Vi爲頭的弧,因而容易求得頂點的出度和入度。

十字鏈表除了結構複雜一點外,其實創建圖算法的時間複雜度是和鄰接表相同的,因此,在有向圖的應用中,十字鏈表也是非常好的數據結構模型。

 

鄰接多重表

 

講了有向圖的優化存儲結構,對於無向圖的鄰接表,有沒有問題呢?

如果我們在無向圖的應用中,關注的重點是頂點的話,那麼鄰接表是不錯的選擇,但如果我們更關注的是邊的操作,比如對已經訪問過的邊做標記,或者刪除某一條邊等操作,鄰接表就顯得不那麼方便了。

 

到底有多煩?小甲魚用圖片告訴你:

若要刪除(V0,V2)這條邊,就需要對鄰接表結構中邊表的兩個結點進行刪除操作。

鄰接多重表

鄰接多重表

 

因此,我們也仿照十字鏈表的方式,對邊表結構進行改裝,重新定義的邊表結構如下:

鄰接多重表

 

其中iVex和jVex是與某條邊依附的兩個頂點在頂點表中的下標。iLink指向依附頂點iVex的下一條邊,jLink指向依附頂點jVex的下一條邊。

也就是說在鄰接多重表裏邊,邊表存放的是一條邊,而不是一個頂點。

 

不急,馬上進入No pic you say a J8!環節~

鄰接多重表

鄰接多重表

 

邊集數組

 

邊集數組是由兩個一維數組構成,一個是存儲頂點的信息,另一個是存儲邊的信息,這個邊數組每個數據元素由一條邊的起點下標(begin)、終點下標(end)和權(weight)組成。

邊集數組
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章