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