迪傑斯特拉演算法感悟

鴨脖發表於2012-06-11
今天又看了一便迪傑斯特拉演算法,從非程式設計的角度上把這個演算法又理解了一遍。其實這樣來看的話,迪傑斯特拉演算法和普利姆演算法以及側路斯卡爾演算法剛開始的操作都是將點集分為U和V-U,這樣的話便是在兩個點集之間進行操作。迪傑斯特拉演算法主要是這麼做的:它不斷的從d中找出邊權值最小,而且尚未加入U的點,加入之後,再重新計算d和path的值,注意這裡只計算那些V-U中的點,因為已經加入U的點和源點之間的距離已經是最小的了,而且必定是不會改變的。這個我們要重點理解一下,因為第一次的時候U集合中只用源點一個點,下一個加進去的是和U直接距離最短的點。那麼下一次再加進去的那個點,和源點的直接距離一定比第一次加進去的那個點要大,所以你沒必要計算從源點到該點再加上從該點到第一次加進去的那個點的距離的和,因為這肯定是比從源點到第一次加進去的那個點之間的距離要大的。所以我們可以看到其實迪傑斯特拉演算法根基其實也是落在第一次加進去的那個點的。這樣的話我們不需要再下一步中去考慮U集合中的點,因為他們必定已經是最小的了。

相關文章