關於拓撲排序的進一步說明

2022-01-11 13:27:27 字數 1315 閱讀 2421

之前在

上已經介紹了拓撲排序,我這裡再根據圖論書上的內容對拓撲排序進行一下補充,和進一步的說明。

主要摘自《圖論演算法理論、實現及應用》

拓撲排序在實現時,還需建立乙個存放入度為 0 的頂點的棧,供選擇和輸出無前驅的頂點。只要出現入度為 0 的頂點,就將它壓入棧中。使用這種棧的拓撲排序演算法可以描述如下:

(1) 建立入度為 0 的頂點棧,初始時將所有入度為 0 的頂點依次入棧;

(2) 當入度為 0 的頂點棧不為空時,重複執行

(3) 如果輸出頂點個數少於 aov 網路中的頂點個數,則報告網路中存在有向環。//在有向環中的點不會入棧

那麼思考:是否可以採用佇列來儲存入度為 0 的頂點?

其實這是可以的!在演算法執行過程中,如果同時存在多個入度為 0 的頂點,則首先選擇刪除哪個頂點不會影響演算法的正確性。所以,在拓撲排序演算法中,可以使用佇列或棧來儲存入度為 0 的頂點

與用鄰接表實現 bfs 演算法的偽**相比,拓撲排序與其有相似之處也有不同之處。

相同點:拓撲排序實質上就是一種廣度優先搜尋,在演算法執行過程中,通過棧頂頂點訪問它的每個鄰接點,整個演算法執行過程中,每個頂點訪問一次且僅一次,每條邊掃瞄一次且僅一次。

不同點:bfs 演算法在掃瞄每條邊時,如果邊的終點沒有訪問過,則入佇列;而拓撲排序演算法在掃瞄每條邊時,終點的入度要減 1,當減至 0 時才將該終點入棧。

請注意,在bfs 演算法中是用佇列來儲存待擴充套件的頂點,在 拓撲排序演算法中是用棧來儲存入度為 0 的頂點。那麼,在 bfs 演算法中是否可以用棧來儲存待擴充套件的頂點?在拓撲排序演算法中是否可以用佇列來儲存入度為 0 的頂點?佇列和棧的區別在於頂點出佇列(或棧)的順序,佇列是先進先出,棧是後進先出。所以,能否用佇列(或棧)關鍵要看這種順序是否會影響演算法的正確性。

bfs 演算法:如果用棧儲存待擴充套件的頂點,如圖所示,其中圖(a)為正確的搜尋過程,圖(b)為用棧儲存待擴充套件頂點時各頂點入棧和出棧的過程。在圖(b)中,依次出棧的頂點是 a→e→d→f→h→i→b→c→g,很明顯,這與 bfs 演算法的實現過程和頂點訪問順序大相徑庭。因此,在 bfs演算法中不能用棧來儲存待擴充套件的頂點。

序在實現拓撲排序過程中,搜尋入度為 0 的頂點,建立鏈式棧所需時間為 o(n)。當有向圖中不存在有向環時,每個頂點要進一次棧,出一次棧,每條邊掃瞄一次且僅一次,其複雜度為 o(m)。所以,總的時間複雜度為 o(n+m)

微軟關於XP退役的進一步說明。

以下是微軟中國發布的宣告原文 感謝大家對微軟xp退休的關注。針對大家關係的問題,我們在這裡做四點進一步的說明 首先,已經安裝xp的電腦仍然可以在4月8日以後使用。第三,資料顯示,70 的中國xp使用者,在過去13年中沒有選擇使用微軟定期推送的安全保護服務,對於大部分使用者來說,xp退休帶來的影響有限...

微軟關於XP退役的進一步說明。

以下是微軟中國發布的宣告原文 感謝大家對微軟xp退休的關注。針對大家關係的問題,我們在這裡做四點進一步的說明 首先,已經安裝xp的電腦仍然可以在4月8日以後使用。第三,資料顯示,70 的中國xp使用者,在過去13年中沒有選擇使用微軟定期推送的安全保護服務,對於大部分使用者來說,xp退休帶來的影響有限...

關於DOMAIN TESTING的進一步理解

在cem kaner的 中有這樣一句話 domain testing is a type of functional testing 13,14 we view the program as a function and test it by feeding it interesting input...