waeshall演算法原理和實現
傳遞閉包Warshall方法簡要介紹
① 在集合X上的二元關係R的傳遞閉包是包含R的X上的最小的傳遞關係。R的傳遞閉包在數字影像處理的影像和視覺基礎、圖的連通性描述等方面都是基本概念。一般用B表示定義在具有n個元素的集合X上關係R的n×n二值矩陣,則傳遞閉包的矩陣B+可如下計算: B+ = B + B2 + B3 + ……+ (B)n
② 式中矩陣運算時所有乘法都用邏輯與代替,所有加法都用邏輯或代替。上式中的操作次序為B,B(B),B(BB),B(BBB),……,所以在運算的每一步我們只需簡單地把現有結果乘以B。
warshall演算法的運算規則
其具體過程如下,設在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)的關係矩陣。
warshall演算法的實現
public class Warshall {
static int[][] warshall={
{0,1,1,0},
{0,0,1,0},
{0,0,0,1},
{0,0,1,0}
};
public static void main(String[] args) {
display(warshall);
setWarshell(warshall);
System.out.println("經過演算法閉包之後輸出");
display(warshall);
}
//列印矩陣
public static void display(int[][] warshall){
for (int i = 0; i < warshall.length; i++) {
for (int j=0;j<warshall.length;j++){
System.out.print(warshall[i][j]+" ");
}
System.out.println();
}
}
//warshall演算法實現
public static void setWarshell(int[][]warshall){
for (int k = 0; k < warshall.length; k++) {
for (int i = 0; i < warshall.length; i++) {
for (int j = 0; j < warshall.length; j++) {
warshall[i][j]|=warshall[i][k]*warshall[k][j];
}
}
}
}
}