A1(3,2) = min { A0(3,2) , A0(3,1) + A0(1,2) } = min {∞,7}
A1(2,3) = min { A0(2,3) , A0(2,1) + A0(1,3) } = min {2 , 6+11}
使用的是 dynamic programming 策略,
就是採用建構式的方法:先建出 A0→ 再建出A1→ ... →An
其中 A0 就是最原始的 cost 矩陣。而 A1 則表示中間點可以經過 節點1
而 A2 則表示中間點可以經過 節點1 ~ 節點2
重點提示:
for i=1 to n
for j=1 to n
a[i,j] = cost[i,j]; /* 先把 cost 抄到 A0 之中*/
/* k 放最外面,控制可用的中間點,逐一建構 A0→A1→ ... →An */
for k=1 to n
{ for i=1 to n O(n^3)
{ for j=1 to n
{
/* 引入 k 當中間點,如果比較近,就改用這條路*/
if ( a[i,j] > a[i, k] + a[k, j] )
a[i,j] = a[i, k] + a[k, j];
}
}
}
1. 在 A2 的圖中, (i,j) 項的值怎麼算?
不要忘記,A2 的資料是由 A1 為藍本建構而來。
A2(i,j) = min { 原本 A1(i,j) , A1(i,2) + A1(2,j) }
在 A2 中,開放使用節點2,所以要考量,當選擇節點2為中繼時,是否較短路徑。
2. 複雜度與迴圈的設計為何?
迴圈用了 O(n^3) 而最外的計數器是 k 表是當前在建構 Ak 矩陣,
所謂 Ak 矩陣表示目前「中繼節點可用 A1~Ak」
而建構方式是由 A0→A1→...→An 所以 k 會放最外面。
3. 考試的速解法
解題時 A3 矩陣的 (2,1) 欄資料來源會是 (2,3) + (3,1)
不要再傻傻一個一個算了。
沒有留言:
張貼留言