關係傳遞閉包Warshall演算法之思想的一種解說

2021-04-12 16:14:51 字數 2598 閱讀 1510

關係傳遞閉包warshall演算法之思想的一種解說

周曉煒

(西安郵電學院計算機系網路0407班  西安  710121)

注:本文已發表在「中國科技**網」(http://www.kjlw.cn),**為http://www.kjlw.cn/show2.asp?newsid=763(需註冊成為會員才能瀏覽)

1、引言

warshall在2023年提出了乙個求關係的傳遞閉包的有效演算法。其具體過程如下,設在n個元素的有限集上關係r的關係矩陣為m:

(1)置新矩陣a=m;

(2)置k=1;

(3)對所有i如果a[i,k]=1,則對j=1..n執行:

a[i,j]←a[i,j]∨a[k,j];

(4)k增1;

(5)如果k≤n,則轉到步驟(3),否則停止。

所得的矩陣a即為關係r的傳遞閉包t(r)的關係矩陣。

在左孝凌等編著的《離散數學》中提到了該演算法,但並未對此演算法作出解釋。下面本文將對該演算法的思想作出一種比較通俗的解說。

2、對warshall演算法的解說

設關係r的關係圖為g,設圖g的所有頂點為v1,v2,…,vn,則t(r)的關係圖可用該方法得到:若g中任意兩頂點vi和vj之間有一條路徑且沒有vi到vj的弧,則在圖g中增加一條從vi到vj的弧,將這樣改造後的圖記為g』,則g』即為t(r)的關係圖。g』的鄰接矩陣a應滿足:若圖g中存在從vi到vj路徑,即vi與vj連通,則a[i,j]=1,否則a[i,j]=0。

這樣,求t(r)的問題就變為求圖g中每一對頂點間是否連通的問題。

定義乙個n階方陣序列a(0),a(1),a(2),…,a(n),每個方陣中的元素值只能取0或1。a(m)[i,j]=1表示存在從vi到vj且中間頂點序號不大於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)的關係矩陣。

那麼應如何計算方陣序列a(0),a(1),a(2),…,a(n)呢?

很顯然,a(0)=m(m為r的關係矩陣)。

若a(0)[i,1]=1且a(0)[1,j]=1,或a(0)[i,j]=1,當且僅當存在從vi到vj且中間頂點序號不大於1的路徑,此時應將a(1)[i,j]置為1,否則置為0。

一般地,若a(k-1)[i,k]=1且a(k-1)[k,j]=1,或a(k-1)[i,j]=1,當且僅當存在從vi到vj且中間頂點序號不大於k的路徑,此時應將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

這樣,就可得計算a(k)的方法:先將a(k)賦為a(k-1);再對所有i=1..n,若a(k)[i,k]=1(即a(k-1)[i,k]=1),則對所有j=1..n,執行:

(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])

就可將上標k去掉,式子就可進一步變為:

a[i,j]←a[i,j]∨a[k,j]

這樣可以只用儲存乙個n階方陣的空間完成計算,且與前述warshall演算法中第(3)步的式子一致。那麼,可不可以把a(k-1)[k,j]改為a(k)[k,j]呢?答案是肯定的。下面將證明在計算a(k)的過程中a(k-1)[k,j]與a(k)[k,j]相等(a(k)被賦初值a(k-1)後)。考察計算a(k)的方法 只有當i=k時a(k)[k,j]的值才有可能改變,此時將式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],對某一j,執行該式的賦值操作前a(k)[k,j]=a(k-1)[k,j],因為計算a(k)開始時a(k)被賦為a(k-1),故它們相或的結果等於a(k-1)[k,j],故賦值操作不改變a(k)[k,j]的值。這樣,就沒有操作會改變a(k)[k,j]的值,故a(k-1)[k,j]與a(k)[k,j]相等。

綜上,就可得到計算a(n)的演算法,且該演算法與前述的warshall演算法完全一致。

由上面的分析,不難看出,warshall演算法類似於求圖中每對頂點間最短路徑的floyd演算法。其實,用floyd演算法也能求關係的傳遞閉包,方法為令關係r的關係圖g中的每條弧的權值都為1,這樣得一有向網g1,設g1的鄰接矩陣為d(-1)(若vi無自迴路,則d(-1)(i,i)=∞),對g1用floyd演算法求其每對頂點間最短路徑,得結果矩陣d(n-1)。因若g中vi與vj連通,當且僅當d(n-1)[i,j]≠∞,故將矩陣d中的∞都改為0,其它值都改為1,得矩陣a,則矩陣a即為t(r)的關係矩陣。floyd演算法和warshall演算法的時間複雜度都為o(n3),但明顯用floyd演算法求關係的傳遞閉包繞了彎子。

[1]左孝凌,李為鑑,劉永才,《離散數學》,上海:上海科學技術文獻出版社,1982

[2]嚴蔚敏,吳偉民,《資料結構 c語言版》,北京:清華大學出版社,1997

傳遞閉包的計算 Warshall

o n 3 的高效閉包演算法 演算法內容 1.做出關係r的矩陣m 2.列舉每一列,以這一列對應的元素為中間元素去創造新的關係 一行一行來做,如果當前行對應的元素與列對應的元素有關係,例如arb,則考慮有無關係,若有關係則ar 具體實現就是m a m b 有點類似於多源最短路演算法,也是一種動態規劃的...

Warshall傳遞閉包演算法的學習與實現

warshall傳遞閉包演算法的學習與實現 1 問題引入 乙個有n個頂點的有向圖的傳遞閉包為 有向圖中的初始路徑可達情況可以參見其鄰接矩陣a,鄰接矩陣中a i,j 表示i到j是否直接可達,若直接可達,則a i,j 記為1,否則記為0 兩個有向圖中i到j有路徑表示從i點開始經過其他點 或者不經過其他點...

warShall演算法實現傳遞閉包的計算(C 版)

warshall通俗的講就是計算有向圖的傳遞閉包,進而轉化為乙個圖結構中任意兩點的可達情況 該演算法的時間複雜度為o n 3 include using namespace std int count 用來計算判斷次數 const int n 10 二維陣列可以沒有行,但必須有列,這裡假定最大階為1...