日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【zz】如何去理解 拓扑排序算法

發(fā)布時間:2025/4/16 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【zz】如何去理解 拓扑排序算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

from http://www.cnblogs.com/shanyou/archive/2006/11/16/562861.html

?

查看Castle的代碼,在Castle.Core中內(nèi)部的數(shù)據(jù)結(jié)構(gòu)采用圖,排序使用的拓撲排序算法:
?????? 對于一條有向邊(u,v),定義u?<?v;滿足所有這樣條件的結(jié)點序列稱為拓撲序列。拓撲排序就是求一個有向圖的拓撲序列的算法。
一個有向圖頂點的拓撲序列不是惟一的。并不是任何有向圖的頂點都可以排成拓撲序列,有環(huán)圖是不能排的。
例子:比如排課問題,比如士兵排隊問題等。
???????拓撲排序在實際生活中和算法中都有很大的應用。比如要排一下幾門課程的先后次序,我們可以把課程抽象成結(jié)點,把什么課是什么課的基礎(chǔ)抽象成邊,那么該圖的一個拓撲序列就是這些課的一個可行的先后次序。各種語言的編譯器都用到了拓撲排序。
??? 數(shù)學基礎(chǔ):
??? 什么是拓撲排序(Topological Sort)?簡單地說,由某個集合上的一個偏序得到該集合上的一個全序,這個操作稱之為拓撲排序。
??? 回顧離散數(shù)學中關(guān)于偏序和全序的定義:
??????? 若集合X上的關(guān)系R是自反的、反對稱的和傳遞的,則稱只是集合X上的偏序關(guān)系。
??????? 設R是集合X上的偏序(Partial Order),如果對每個x,y∈X必有xRy或yRx,則稱R是集合X上的全序關(guān)系。
??? 直觀地看,偏序指集合中僅有部分成員之間可比較,而全序指集合中全體成員之間均可比較。[例如],圖7.25所示的兩個有向圖,圖中弧(x,y)表示x≤y,則(a)表示偏序,(b)表示全序。若在(a)的有向圖上人為地加一個表示v2≤v3的弧(符號“≤”表示v2領(lǐng)先于v3),則(a)表示的亦為全序,且這個全序稱為拓撲有序(Topological Order),而由偏序定義得到拓撲有序的操作便是拓撲排序。

??????
AOV-網(wǎng)及其拓撲有序序列產(chǎn)生的過程
(a)AOV-網(wǎng);(b)輸出v6之后;(c)輸出v1之后;(d)輸出v4之后;(e)輸出v3之后;(f)輸出v2之后

????[思想]:
????一、從有向圖中選取一個沒有前驅(qū)的頂點,并輸出之;
????二、從有向圖中刪去此頂點以及所有以它為尾的弧;
????重復上述兩步,直至圖空,或者圖不空但找不到無前驅(qū)的頂點為止。沒有前驅(qū) -- 入度為零,刪除頂點及以它為尾的弧-- 弧頭頂點的入度減1。

????[人度為零的頂點拓撲排序算法]:
????Status Topological Sort(ALGraph G){
????//有向圖G采用鄰接表存儲結(jié)構(gòu)。
????//若G無回路,則輸出G的頂點的1個拓撲序列并返回OK,否則ERROR。
?????????FindInDegree(G,indegree); //對各頂點求入度indegree[0..vernum-1]
????????InitStack(S);
????????for(i=0;i<G.vexnum; ++i)
????????if(!indegree[i])Push(S,i) //建零入度頂點棧,s入度為0者進棧
????????count=0; //對輸出頂點計數(shù)
????????while (!StackEmpty(S)) {
????????????Pop(S,i);
????????????printf(i,G.vertices[i].data); ++count; //輸出i號頂點并計數(shù)
????????????for(p=G.vertices[i].firstarc;p; p=p—>nextarc) {
????????????????k=p—>adivex; //對i號頂點的每個鄰接點的入度減1
????????????????if(!(--indegree[k]))Push(S,k);//若入度減為0,則入棧
????????????}//for
????????}//while
????????if(count<G.vexnum) return ERROR; //該有向圖有回路
????????else return OK;
????}//TopologicalSort?
?? 算法 ,總的時間復雜度為O(n+e)。

作者: 自由、創(chuàng)新、研究、探索……
出處:http://shanyou.cnblogs.com/
版權(quán):本文版權(quán)歸作者和博客園共有

轉(zhuǎn)載于:https://www.cnblogs.com/eric-blog/archive/2011/01/04/1925659.html

總結(jié)

以上是生活随笔為你收集整理的【zz】如何去理解 拓扑排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。