數據結構與算法-圖(十字鏈表 鄰接多重表 邊集數組 )

前兩天我們介紹的鄰接矩陣和鄰接表是最常用的圖的存儲結構,可是呢,對於一些算法需要更爲精巧的存儲方法,哪怕空間複雜度稍微低一點也沒關係。今天介紹十字鏈表和鄰接多重表還有邊集數組。
首先我們回想一下鄰接表,對於有向圖的鄰接表,由於對於頂點出度的入度分別儲存在鄰接表和逆鄰接表中,對於頻繁訪問出度的入度的算法很不方便,於是前輩們將鄰接表和逆鄰接表結合在一起,組成了十字鏈表,就可以方便的讀取出度和入度啦。
對於頂點表的結點,除了他作爲弧尾指向弧頭的指針,再加一個儲存他作爲弧頭指向弧尾的指針,對於邊表結點,我們設置tailvex,headvex,headlink,tailink四個域tailvex弧的起點,headvex存儲弧的終點也就是弧頭,headlink指向弧頭都是該頂點的下一條弧,taillink指向弧尾都是該頂點的下一條弧。如果是網圖,在每一個邊表結點加上一個數值域weight存儲權重就歐克啦。兩個表完美結合,十字鏈表的建立時間複雜度和鄰接表相同,是用空間換取時間的典型,對於有向圖,是非常好的存儲結構。
使用十字鏈表優化了有向圖的存儲,那無向圖呢?不太公平哦,沒關係,下面的鄰接多重表就是優化無向圖的存儲的,對於無向圖的鄰接表,關注的重點在頂點上,對於邊的操作是很複雜的,例如要刪除一條邊,需要找到兩個這個邊的邊表進行操作,而且是成對操作,很不樂觀,所以:仿照十字鏈表,前輩們發明了鄰接多重表,頂點表不變,參照十字鏈表的邊表頂點,設置ivex,ilink,jvex,jlink四個域,ivex和jvex存儲邊的兩個頂點的下標,我們規定,頂點表指向的是ivex,目的是讓表更加規範,至於ilink的jlink依然是兩個指針域,ilink指向以ivex頂點相連的下一條邊,類似的,link指向與lvex相連的下一邊,無形中就將所有邊聯繫起來了,指針域若沒有指向,就指向null即可。
終於到最後一個啦~,最後一個邊集數組,它關注的是邊,雖然效率不高,但是應用在克魯斯卡爾算法十分精妙,思想很簡單,用一個一維數組儲存頂點信息,用一個二維數組儲存邊信息,邊數組每個元素包含起點下標,終點下標和權三部分組成,想了解更多邊集數組點這裏:鄰接矩陣轉化邊集數組

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