如何去理解 拓撲排序演算法

2021-09-21 23:40:43 字數 1259 閱讀 6007

檢視castle的**,在castle.core中內部的資料結構採用圖,排序使用的拓撲排序演算法:

對於一條有向邊(u,v),定義u 

乙個有向圖頂點的拓撲序列不是惟一的。並不是任何有向圖的頂點都可以排成拓撲序列,有環圖是不能排的。

例子:比如排課問題,比如士兵排隊問題等。

拓撲排序在實際生活中和演算法中都有很大的應用。比如要排一下幾門課程的先後次序,我們可以把課程抽象成結點,把什麼課是什麼課的基礎抽象成邊,那麼該圖的乙個拓撲序列就是這些課的乙個可行的先後次序。各種語言的編譯器都用到了拓撲排序。

數學基礎:

什麼是拓撲排序(topological sort)?簡單地說,由某個集合上的乙個偏序得到該集合上的乙個全序,這個操作稱之為拓撲排序。 

回顧離散數學中關於偏序和全序的定義:

若集合x上的關係r是自反的、反對稱的和傳遞的,則稱只是集合x上的偏序關係。

設r是集合x上的偏序(partial order),如果對每個x,y∈x必有xry或yrx,則稱r是集合x上的全序關係。

直觀地看,偏序指集合中僅有部分成員之間可比較,而全序指集合中全體成員之間均可比較。[例如],圖7.25所示的兩個有向圖,圖中弧(x,y)表示x≤y,則(a)表示偏序,(b)表示全序。若在(a)的有向圖上人為地加乙個表示v2≤v3的弧(符號「≤」表示v2領先於v3),則(a)表示的亦為全序,且這個全序稱為拓撲有序(topological order),而由偏序定義得到拓撲有序的操作便是拓撲排序。

aov-網及其拓撲有序序列產生的過程

(a)aov-網;(b)輸出v6之後;(c)輸出v1之後;(d)輸出v4之後;(e)輸出v3之後;(f)輸出v2之後 

[思想]:

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

二、從有向圖中刪去此頂點以及所有以它為尾的弧;

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

[人度為零的頂點拓撲排序演算法]:

status topological sort(algraph g)//for

}//while

if(count

else return ok;

}//topologicalsort 

演算法 ,總的時間複雜度為o(n+e)。

如何去理解 拓撲排序演算法

檢視castle的 在castle.core中內部的資料結構採用圖,排序使用的拓撲排序演算法 對於一條有向邊 u,v 定義u 乙個有向圖頂點的拓撲序列不是惟一的。並不是任何有向圖的頂點都可以排成拓撲序列,有環圖是不能排的。例子 比如排課問題,比如士兵排隊問題等。拓撲排序在實際生活中和演算法中都有很大...

如何去理解 拓撲排序演算法

檢視castle的 在castle.core中內部的資料結構採用圖,排序使用的拓撲排序演算法 對於一條有向邊 u,v 定義u 乙個有向圖頂點的拓撲序列不是惟一的。並不是任何有向圖的頂點都可以排成拓撲序列,有環圖是不能排的。例子 比如排課問題,比如士兵排隊問題等。拓撲排序在實際生活中和演算法中都有很大...

如何去理解 拓撲排序演算法

檢視castle的 在castle.core中內部的資料結構採用圖,排序使用的拓撲排序演算法 對於一條有向邊 u,v 定義u 乙個有向圖頂點的拓撲序列不是惟一的。並不是任何有向圖的頂點都可以排成拓撲序列,有環圖是不能排的。例子 比如排課問題,比如士兵排隊問題等。拓撲排序在實際生活中和演算法中都有很大...