拓撲排序,顧名思義,就是一種排序方法。這是一種什麼排序?這種排序的作用?然後怎麼去實現這種排序演算法?現在就讓我們仔細研究下。
實際上,拓撲排序是一種圖論演算法,該演算法在《資料結構與演算法》一書中有涉獵。引用維基百科的定義:
在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序(英語: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)。
不禁有人就問了,有很多排序演算法啊,快速排序,插值排序,這個排序到底有什麼優點呢?平常這種排序又用於哪種場景呢?
我們說快速排序是不穩定的,這是因為最後的快排結果中相同元素的出現順序和排序前不一致了。如果用偏序的概念可以這樣解釋這一現象:相同值的元素之間的關係是無法確定的。因此它們在最終的結果中的出現順序可以是任意的。而對於諸如插入排序這種穩定性排序,它們對於值相同的元素,還有乙個潛在的比較方式,即比較它們的出現順序,出現靠前的元素大於出現後出現的元素。因此通過這一潛在的比較,將偏序關係轉換為了全序關係,從而保證了結果的唯一性。而拓撲排序就是一種將偏序轉換為全序的一種演算法。
這裡要補充兩個概念,偏序和全序?
偏序:有向圖中兩個頂點之間不存在環路,至於連通與否,是無所謂的。
全序:就是在偏序的基礎之上,有向無環圖中的任意一對頂點還需要有明確的關係(反映在圖中,就是單向連通的關係,注意不能雙向連通,那就成環了)。
意思就是講,乙個不確定的偏序關係經全序後就有一種確定的先後順序了。
既然有先後,那麼在實際生活中的選課問題,比如大一時一定要修完這門課,大二才學第二門課,這種排課問題就是拓撲排序問題。
拓撲排序分析
例如你輸入n個點,m個聯絡 4 3這四個點分別為1,2,3,4。但是這四個點輸出的順序必須是先有乙個條件後有乙個輸出。1 21 3 4 2意思就是先輸出2才能輸出1,先輸出3才能輸出1,先輸出2才能輸出4.我們就是要先建立四個陣列,分別存入不同的資料。例如建立a num b num 兩個陣列分別用來...
拓撲排序的原理與實現
拓撲排序顧名思義是一種排序演算法,它用於給有向圖排序。有向圖是由一組頂點和一組有方向的邊組成的圖,每條有方向的邊都連線著有序的一對頂點,因此a b代表a可以到達b,並不代表b就能到達a。拓撲排序的結果就是乙個有向圖的頂點序列 或稱為拓撲序列 想要學習 c 程式設計 就需要先學習 計算機導論 想要學習...
拓撲排序的原理和實現
在圖論中,由乙個有向無環圖組成的序列,只要滿足下面兩種情況則稱為拓撲排序 可以從這副圖中發現,如果按照dfs的思想,那麼其訪問結點的結果為 5,2,3,1,0,4,但是如果是拓撲排序的話,訪問結點的結果為5,4,2,0,1,3,類似於多叉樹的bfs 拓撲排序可用來解決什麼問題呢?比如說課程排序,編譯...