鏈式前向星

2021-10-03 09:53:04 字數 1750 閱讀 8141

參考資料

無論是樹,無向圖,有向圖,我們都需要使用一種資料結構來儲存「圖」(我們的樹可以看作是特殊的圖~)的結構,這種結構就是我們的鏈式前向星

如上圖,使用鄰接矩陣非常直觀,但是它的空間複雜度達到了 o(n

2)o(n^2)

o(n2

) 了。

這種方法相比於鄰接矩陣,它節約了很大的空間複雜度。實現鄰接表常用的是使用vector陣列,但是用時候vector陣列的長度又會特別大。

若圖是稀疏圖,邊很少,開二維陣列a很浪費;

若點很多(如10000個點),a[10000][10000]又會爆,只能用前向星做(之前看過32m空間限制不要開超過1000w的int變數(c++))。

前向星的效率不是很高,優化後為鏈式前向星,直接介紹鏈式前向星。

所以,鄰接表,鄰接矩陣都不太好,大佬們就開發了乙個新的儲存圖的資料結構——鏈式前向星。

其實,鏈式前向星就是乙個鄰接表。我們來對照看一下。

鏈式前向星在儲存方面有兩個部分組成。

struct eedge[maxm]

;int tot,head[maxn]

;

有三個變數:

這三個變數,在前面的圖中有體現,與鄰接表進行了對應。

建立乙個記憶體池edge[maxm],有乙個計數器變數tot指向記憶體池edge[maxm]最近的沒有被使用的結點,它是乙個空結點。

head陣列是什麼呢?

顧名思義,就是「頭」(「首」),它在這個**裡面是edge陣列的下標,代表位置,初始化全部為-1(或者其他自定義也行)

我們來看一下如何遍歷乙個結點u所連向的所有的邊的:

for

(int i=head[u]

;~i;i=edge[i]

.next)

鏈式前向星還有乙個非常重要的加邊函式addedge,那麼它是如何運作的呢?

它不是在「鍊錶」的最後插入的,而是在最前面插入的。

【agohの資料結構】你真的了解鏈式前向星嗎?

深度理解鏈式前向星

前向星和鏈式前向星

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

前向星和鏈式前向星

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

前向星和鏈式前向星

1 前向星 前向星是以儲存邊的方式來儲存圖,先將邊讀入並儲存在連續的陣列中,然後按照邊的起點進行排序,這樣陣列中起點相等的邊就能夠在陣列中進行連續訪問了。它的優點是實現簡單,容易理解,缺點是需要在所有邊都讀入完畢的情況下對所有邊進行一次排序,帶來了時間開銷,實用性也較差,只適合離線演算法。圖一 2 ...