关系传递闭包Warshall算法之思想的一种解说
關(guān)系傳遞閉包Warshall算法之思想的一種解說
周曉煒
(西安郵電學(xué)院計(jì)算機(jī)系網(wǎng)絡(luò)0407班? 西安? 710121)
注:本文已發(fā)表在“中國(guó)科技論文網(wǎng)”(http://www.kjlw.cn),網(wǎng)址為http://www.kjlw.cn/show2.asp?newsid=763(需注冊(cè)成為會(huì)員才能瀏覽)
摘要:Warshall算法是求二元關(guān)系傳遞閉包的一種高效的算法。在左孝凌等編著的《離散數(shù)學(xué)》中提到了該算法,但并未對(duì)此算法作出解釋,本文對(duì)該算法的思想作出一種比較通俗的解說。
關(guān)鍵詞:Warshall算法;矩陣;Floyd算法
1、引言
??? Warshall在1962年提出了一個(gè)求關(guān)系的傳遞閉包的有效算法。其具體過程如下,設(shè)在n個(gè)元素的有限集上關(guān)系R的關(guān)系矩陣為M:
??? (1)置新矩陣A=M;
??? (2)置k=1;
??? (3)對(duì)所有i如果A[i,k]=1,則對(duì)j=1..n執(zhí)行:
????????????????????? A[i,j]←A[i,j]∨A[k,j];
??? (4)k增1;
??? (5)如果k≤n,則轉(zhuǎn)到步驟(3),否則停止。
??? 所得的矩陣A即為關(guān)系R的傳遞閉包t(R)的關(guān)系矩陣。
??? 在左孝凌等編著的《離散數(shù)學(xué)》中提到了該算法,但并未對(duì)此算法作出解釋。下面本文將對(duì)該算法的思想作出一種比較通俗的解說。
2、對(duì)Warshall算法的解說
??? 設(shè)關(guān)系R的關(guān)系圖為G,設(shè)圖G的所有頂點(diǎn)為v1,v2,…,vn,則t(R)的關(guān)系圖可用該方法得到:若G中任意兩頂點(diǎn)vi和vj之間有一條路徑且沒有vi到vj的弧,則在圖G中增加一條從vi到vj的弧,將這樣改造后的圖記為G’,則G’即為t(R)的關(guān)系圖。G’的鄰接矩陣A應(yīng)滿足:若圖G中存在從vi到vj路徑,即vi與vj連通,則A[i,j]=1,否則A[i,j]=0。
???
??? 這樣,求t(R)的問題就變?yōu)榍髨DG中每一對(duì)頂點(diǎn)間是否連通的問題。
???
??? 定義一個(gè)n階方陣序列A(0),A(1),A(2),…,A(n),每個(gè)方陣中的元素值只能取0或1。A(m)[i,j]=1表示存在從vi到vj且中間頂點(diǎn)序號(hào)不大于m的路徑(m=1..n),A(m)[i,j]=0表示不存在這樣的路徑。而A(0)[i,j]=1表示存在從vi到vj的弧,A(0)[i,j]=0表示不存在從vi到vj的弧。
???
??? 這樣,A(n)[i,j]=1表示vi與vj連通,A(n)[i,j]=0表示vi與vj不連通。故A(n)即為t(R)的關(guān)系矩陣。
???
??? 那么應(yīng)如何計(jì)算方陣序列A(0),A(1),A(2),…,A(n)呢?
???
??? 很顯然,A(0)=M(M為R的關(guān)系矩陣)。
???
??? 若A(0)[i,1]=1且A(0)[1,j]=1,或A(0)[i,j]=1,當(dāng)且僅當(dāng)存在從vi到vj且中間頂點(diǎn)序號(hào)不大于1的路徑,此時(shí)應(yīng)將A(1)[i,j]置為1,否則置為0。
???
??? 一般地,若A(k-1)[i,k]=1且A(k-1)[k,j]=1,或A(k-1)[i,j]=1,當(dāng)且僅當(dāng)存在從vi到vj且中間頂點(diǎn)序號(hào)不大于k的路徑,此時(shí)應(yīng)將A(k)[i,j]置為1,否則置為0(k=1..n)。用公式表示即為:
??? (k)[i,j]=(A(k-1)[i,k]∧A(k-1)[k,j])∨A(k-1)[i,j]? i,j,k=1..n
???
??? 這樣,就可得計(jì)算A(k)的方法:先將A(k)賦為A(k-1);再對(duì)所有i=1..n,若A(k)[i,k]=1(即A(k-1)[i,k]=1),則對(duì)所有j=1..n,執(zhí)行:
??? (k)[i,j]←A(k)[i,j]∨A(k-1)[k,j]
???
??? 但這與前述Warshall算法中的第(3)步還有一定距離。若將上式改為:
??? A(k)[i,j]←A(k)[i,j]∨A(k)[k,j]? (即把A(k-1)[k,j]改為A(k)[k,j])
???
??? 就可將上標(biāo)k去掉,式子就可進(jìn)一步變?yōu)?#xff1a;
??? A[i,j]←A[i,j]∨A[k,j]
???
??? 這樣可以只用存儲(chǔ)一個(gè)n階方陣的空間完成計(jì)算,且與前述Warshall算法中第(3)步的式子一致。那么,可不可以把A(k-1)[k,j]改為A(k)[k,j]呢?答案是肯定的。下面將證明在計(jì)算A(k)的過程中A(k-1)[k,j]與A(k)[k,j]相等(A(k)被賦初值A(chǔ)(k-1)后)??疾煊?jì)算A(k)的方法 只有當(dāng)i=k時(shí)A(k)[k,j]的值才有可能改變,此時(shí)將式A(k)[i,j]←A(k)[i,j]∨A(k-1)[k,j]中的i換為k,得A(k)[k,j]←A(k)[k,j]∨A(k-1)[k,j],對(duì)某一j,執(zhí)行該式的賦值操作前A(k)[k,j]=A(k-1)[k,j],因?yàn)橛?jì)算A(k)開始時(shí)A(k)被賦為A(k-1),故它們相或的結(jié)果等于A(k-1)[k,j],故賦值操作不改變A(k)[k,j]的值。這樣,就沒有操作會(huì)改變A(k)[k,j]的值,故A(k-1)[k,j]與A(k)[k,j]相等。
???
??? 綜上,就可得到計(jì)算A(n)的算法,且該算法與前述的Warshall算法完全一致。
???
??? 由上面的分析,不難看出,Warshall算法類似于求圖中每對(duì)頂點(diǎn)間最短路徑的Floyd算法。其實(shí),用Floyd算法也能求關(guān)系的傳遞閉包,方法為令關(guān)系R的關(guān)系圖G中的每條弧的權(quán)值都為1,這樣得一有向網(wǎng)G1,設(shè)G1的鄰接矩陣為D(-1)(若vi無自回路,則D(-1)(i,i)=∞),對(duì)G1用Floyd算法求其每對(duì)頂點(diǎn)間最短路徑,得結(jié)果矩陣D(n-1)。因若G中vi與vj連通,當(dāng)且僅當(dāng)D(n-1)[i,j]≠∞,故將矩陣D中的∞都改為0,其它值都改為1,得矩陣A,則矩陣A即為t(R)的關(guān)系矩陣。Floyd算法和Warshall算法的時(shí)間復(fù)雜度都為O(n3),但明顯用Floyd算法求關(guān)系的傳遞閉包繞了彎子。
?
參考文獻(xiàn):
[1]左孝凌,李為鑑,劉永才,《離散數(shù)學(xué)》,上海:上??茖W(xué)技術(shù)文獻(xiàn)出版社,1982
[2]嚴(yán)蔚敏,吳偉民,《數(shù)據(jù)結(jié)構(gòu) C語(yǔ)言版》,北京:清華大學(xué)出版社,1997
總結(jié)
以上是生活随笔為你收集整理的关系传递闭包Warshall算法之思想的一种解说的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot 闪退。falli
- 下一篇: Cordova 插件详解