鏈式前向星理解

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

    這種存圖方式的最大弊端在於,它雖然查找兩點之間是否有邊是O(1)的,但無論是從一個點開始走它所連的邊的O(n)的時間複雜度,還是存圖的n^{2}空間複雜度,都無法滿足我們的更高要求。我們不妨思考一下,倘若我們的目的是能夠更優地遍歷整張圖,那我們需要哪些關鍵信息?

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

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

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

    接下來考慮一個問題,邊的編號如何指引方向?我們應該建立一個ver數組,讓它來負責記錄編號爲i的邊會將我導向哪裏。

    概括說來,現在我們的方案是:到達一個點,通過head知道該走的邊,通過ver知道下一個點的位置,一直走下去。

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

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

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

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