Dijkstra演算法探索及優化

2021-05-26 21:25:06 字數 1873 閱讀 3072

(前幾天並多少時間,現在補充一下!)下面是原始的dijkstra演算法:

public static void dijkstra(int v,float a, flaot dist,int prev)

//此處開始遍歷

dist[v]=0; s[v]=true;

//該迴圈是求的所有節點到源節點的路徑,每迴圈一次求的乙個節點到源節點的距離

for(int i=1; i

以前看過dijkstra演算法,但是一直沒有深入的研究它!最近由於專案的需要,所以今天研究了一下!下面介紹一下這個演算法幾個重要的幾點!

其實這個演算法有兩個比較重要的地方!在書上開始有乙個迴圈,是對引數初始化。這個就沒必要研究了!主要的是第二個迴圈裡面的兩個迴圈,第二個迴圈要進行n-1次(也就是迴圈節點個數減去源節點),這就是要取得其他節點到源節點的距離,一次迴圈就是取得乙個節點到源節點的距離。那麼在第二個迴圈裡面的第乙個迴圈(這裡叫該迴圈為shortestpath)就是取得當前能夠到達源節點最短的節點,並且該節點是未被訪問過的節點。取得在未被訪問的節點裡面到源節點最短路徑的節點u後,最乙個迴圈就是修改和u節點相連的節點到源節點的距離(這裡稱該迴圈為updatedist),我這裡稱這一步為更新u的鄰接節點到源節點的距離。再回到shortestpath迴圈,就有可能取到u的鄰接節點。下面我談談對這個演算法的改進。

我們知道在shortestpath迴圈中,在書上的原始碼都是要遍歷圖中所有的節點,這樣我覺得存在極大的浪費,我們知道該步是取得在dis陣列中到源節點最短的節點,並且該節點是未被訪問過的,所以這裡根本沒必要遍歷圖中所有的節點,只需遍歷dis陣列中的節點,而且我們知道dist的新的距離都是通過updatedist迴圈得到的,所以我們完全可以將dist陣列裡的距離儲存到乙個集合中,我們可以自定義乙個集合,當我們每次想該集合新增元素(也就是到源節點的距離)的時候自動對該集合中進行排序,進行遞增排序,我們取該集合的第乙個元素就是當前到源節點最短的節點,並且該節點是未被訪問的,取出時並將該節點從該集合中移出。這樣我們就省掉了shortestpath這個迴圈了,這樣對演算法的執行將有極大的提高!還有就是後面的updatedist迴圈,在書上的原始碼中也是對圖中的所有節點進行遍歷,其實也沒必要,只需對u的領結節點遍歷即使!這樣有省掉了沒必要的迴圈,這樣的dijkstra演算法,我相信應該不會很慢!

注意的是這種優化也需要對你的圖結構進行優化,具體的優化可以見本部落格的《新穎的圖儲存結構【看來之後你會對圖的結構有新的想法】》文章,裡面有詳細講解一種圖的儲存結構!

下面貼出我改進的演算法:

public class shortestpathiterator_3

public shortestpathiterator_3(graph graph,int source)

{ visited = new boolean[graph.getnode_count()];

this.visitable = new hashmap();

prev = new int[graph.getnode_count()];

this.graph = graph;

this.source = source;

this.pathcost = new float[this.graph.getnode_count()];

for(int i=0; ikeyiterator = this.visitable.keyset().iterator();

int next;

//取得未被訪問並且,到源點最短的節點,並賦值給u,同時將和u相連的節點到源點的距離進行更新

while(keyiterator.hasnext())

{next= keyiterator.next();

if(this.visitable.get(next)

這個優化我已經實現了!需要深入**的可以和我聯絡。希望能夠幫助和我以前一樣的人!謝謝瀏覽!

dijkstra演算法及優化

dijkstra 迪傑斯特拉 演算法是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有權圖中最短路徑問題。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。int n,m n是點的個數,m是邊的個數 int map maxn maxn 鄰接矩陣,初始化inf 較大值 int dis...

ACM 演算法 堆優化Dijkstra演算法

對於乙個邊權為正的圖,我們可以利用dijkstra演算法求出單源最短路徑 sssp 對於常規的dijkstra演算法,其複雜度為 o n 2 o n 2 o n2 顯然在 n nn 較大的時候,可能導致耗時過長,通過優化我們可以獲得一種更加快速的dijkstra演算法,時間複雜度為 o m logn...

優化階乘演算法的探索

優化階乘演算法的探索 中國地質大學 武漢 陳海豐 階乘 factorial 是基斯頓 卡曼 christian kramp,1760 1826 於1808年發明的運算符號。階乘,也是數學裡的一種術語,是指從1乘以2乘以3乘以4一直乘到所要求的數。例如所要求的數是4,則階乘式是1 2 3 4,得到的積...