拓撲排序概念

2021-09-10 05:05:46 字數 1674 閱讀 4577

拓撲排序,顧名思義,就是一種排序方法。這是一種什麼排序?這種排序的作用?然後怎麼去實現這種排序演算法?現在就讓我們仔細研究下。

1、什麼是拓撲排序,也就是拓撲排序的概念

實際上,拓撲排序是一種圖論演算法,該演算法在《資料結構與演算法》一書中有涉獵。引用維基百科的定義:

在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序(英語:topological sorting)。

(1)每個頂點出現且只出現一次;

(2)若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。

也可以定義為:拓撲排序是對有向無環圖的頂點的一種排序,它使得如果存在一條從頂點a到頂點b的路徑,那麼在排序中b出現在a的後面。

是不是覺得看完概念還是很暈的感覺,下面就用乙個例項來講具體的拓撲排序樣例。

(a)有向圖網(aov)  (b)輸出v6後       (c)輸出v1後    (d)輸出v4後 (e)輸出v3後 (f)輸出v2後

輸出排序結果:v6-v1-v4-v3-v2-v5

此拓撲排序的思想是:

(1)從有向圖中選取乙個沒有前驅的頂點,並輸出之;

(2)從有向圖中刪去此頂點以及所有以它為尾的弧;

重複上述兩步,直至圖空,或者圖不空但找不到無前驅的頂點為止。沒有前驅 -- 入度為零,刪除頂點及以它為尾的弧-- 弧頭頂點的入度減1。

何謂入度?

入度:對於有向圖來說,乙個頂點的度可細分為入度和出度。乙個頂點的入度是指與其關聯的各邊之中,以其為終點的邊數。

出度:出度則是相對的概念,指以該頂點為起點的邊數。

以v6這個頂點為例,它的入度為0,出度為2。

以v5這個頂點為例,它的入度為3,出度為0。

以v4這個頂點為例,它的入度為2,出度為1。

以v3這個頂點為例,它的入度為1,出度為2。

以v2這個頂點為例,它的入度為2,出度為0。

以v1這個頂點為例,它的入度為0,出度為3。

經驗證,乙個有向五環圖中所有頂點的入度之和(0+3+2+1+2+0=8)等於所有頂點的出度之和(2+0+1+2+0+3=8)。

2、拓撲排序的作用

不禁有人就問了,有很多排序演算法啊,快速排序,插值排序,這個排序到底有什麼優點呢?平常這種排序又用於哪種場景呢?

我們說快速排序是不穩定的,這是因為最後的快排結果中相同元素的出現順序和排序前不一致了。如果用偏序的概念可以這樣解釋這一現象:相同值的元素之間的關係是無法確定的。因此它們在最終的結果中的出現順序可以是任意的。而對於諸如插入排序這種穩定性排序,它們對於值相同的元素,還有乙個潛在的比較方式,即比較它們的出現順序,出現靠前的元素大於出現後出現的元素。因此通過這一潛在的比較,將偏序關係轉換為了全序關係,從而保證了結果的唯一性。而拓撲排序就是一種將偏序轉換為全序的一種演算法。

這裡要補充兩個概念,偏序和全序?

偏序:有向圖中兩個頂點之間不存在環路,至於連通與否,是無所謂的。

全序:就是在偏序的基礎之上,有向無環圖中的任意一對頂點還需要有明確的關係(反映在圖中,就是單向連通的關係,注意不能雙向連通,那就成環了)。

意思就是講,乙個不確定的偏序關係經全序後就有一種確定的先後順序了。

既然有先後,那麼在實際生活中的選課問題,比如大一時一定要修完這門課,大二才學第二門課,這種排課問題就是拓撲排序問題。

python 拓撲排序 Python 拓撲排序

python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...

python 排序 拓撲排序

在電腦科學領域中,有向圖的拓撲排序是其頂點的先行排序,對於每個從頂點u到頂點v的有向邊uv,在排序的結果中u都在v之前。如果圖是有向無環圖,則拓撲排序是可能的 為什麼不說一定呢?圖論 是組合數學的乙個分支,它和其他分支比如 群論 拓撲學 矩陣論有著密切的關係。圖是圖論的主要研究物件。圖是由若干給定的...

拓撲排序演算法

對許多資料結構教材實在不滿意,至少我是看不懂 至於拓撲排序演算法,教材上那些偽 真真教人頭暈。只寫了幾個struct結構,我根本看不出這是鄰接表。如果給出乙個清晰明了的圖,一切不就簡單了?總之,關鍵就是建立乙個鄰接表。然後利用這個表進行拓撲排序。邊表結點宣告 typedef struct edgen...