鏈式前向星理解

2021-09-29 18:32:28 字數 952 閱讀 4922

在初學資料結構時,「如何存邊」或許是大部分oier關注的事情。我在最初學時,常常使用鄰接矩陣存圖,8000*8000已經是極限,這意味著我所能處理的圖,點的最大規模也只能在10000左右。

這種存圖方式的最大弊端在於,它雖然查詢兩點之間是否有邊是o(1)的,但無論是從乙個點開始走它所連的邊的o(n)的時間複雜度,還是存圖的

事實上,我們只需要知道,我在哪兒?我可以往**走?(我會到哪?)。鄰接矩陣在某種程度上達到了這種要求,但顯然浪費較大(對於這個單一目的而言)。

接下來,我們開始面向需求設計所需的結構。

對於一條邊,它能給我們提供的訊息有它的起點、終點,可能還有它的權值等等一些資料。我們不妨模擬一下,倘若我現在就站在乙個點上,我此刻必然需要一條邊,乙個方向的指引。我們用head陣列來儲存它,具體來說,head[u]存放的是:如果你在u點,你該向哪走,顯然,他所儲存的是乙個邊的編號。

接下來考慮乙個問題,邊的編號如何指引方向?我們應該建立乙個ver陣列,讓它來負責記錄編號為i的邊會將我導向**。

如果我們面對的是一條鏈,那我們的問題已經宣告解決,但是,乙個節點倘若連有好幾條邊,那我們的head陣列便力不從心了。大家可能會想到用乙個vector存放每個點作為起點時出邊的編號,但鏈式前向星提供了乙個更好的解決方案。

鏈式前向星為何是「鏈式」?我個人以為,就是對其存邊方式的一種暗示。head陣列只能存一條邊,那就讓它存乙個「端點邊」,同一起點的邊環環相扣,訪問head陣列就猶如提起了乙個端點,也就拎起了所有以u為起點的出邊。具體來說,我們讓head[u]存放從u節點出來的最後一條邊,這條邊可不簡單,它一方面要提供出去的方案,另一方面,還得連著另一條兄弟邊(從u出來的邊)。我們用next陣列來描述這個關係,next[i]就是i這條邊的兄弟,具體來說,就是從u出去的邊i的上一條邊。這樣,我們的方案就可以愉快地加上「走完head[u]直接告訴我們的這條邊i後,走這條邊連著的兄弟邊next[i]」。

至此,我們便順利的建立了一種更優的資料結構,來處理我們的問題。

理解鏈式前向星

我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...

前向星和鏈式前向星

我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...

前向星和鏈式前向星

前向星 前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置。鏈式前向星 鏈式前向星其實就是靜態建立的鄰接表,時間效率為o m 空間效率也為o m 遍歷效率也為o m next表示當前結點的下...