js圖數(shù)據(jù)結(jié)構(gòu)處理 迪杰斯特拉算法代碼實(shí)例
這篇文章主要介紹了js圖數(shù)據(jù)結(jié)構(gòu)處理 迪杰斯特拉算法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

/*//1、確定數(shù)據(jù)結(jié)構(gòu), mapf[i][j] 為點(diǎn)i到點(diǎn)j的距離
[
Infinity 2 5 Infinity Infinity
Infinity Infinity 2 6 Infinity
Infinity Infinity Infinity 7 1
Infinity Infinity 2 Infinity 4
Infinity Infinity Infinity Infinity Infinity
];
//2、如果源點(diǎn)為1,則 s = {1}, 則 v-s = {2,3,4,5}; s為已經(jīng)規(guī)劃好的點(diǎn),v-s是需要規(guī)劃的點(diǎn)
var dist = []; //dist[i] = mapf[1][i];dist[1] = 0;
//源點(diǎn)1到i有邊相連,初始化前驅(qū)為1(源點(diǎn)為前驅(qū)),否則初始化為-1
var p = [-1,1,1,-1,-1];
//3、找到 v-s = {2,3,4,5}集合里面,到源點(diǎn)1,最近的點(diǎn)
//得出結(jié)果為2,節(jié)點(diǎn)為 t = 2,則 v-s={3、4、5},s={1、2};
//4、借道t=2,所有t的相鄰點(diǎn),借道t;例如相鄰點(diǎn)3,則 a = dist[2] + maf[2][3]; b = dist[3];
//兩個(gè)取較小值,得a < b; 2-3為捷徑,則記錄下dist[3] = a;記錄下3的前驅(qū)點(diǎn) p[3] = 2;
//經(jīng)過(guò)第4步,計(jì)算了2的相鄰點(diǎn),3、4;
//5、比較v-s={3、4、5}的到源點(diǎn)的最近距離,即是 v-s={3、4、5}時(shí),執(zhí)行第3步,此時(shí)相當(dāng)于源點(diǎn)為2會(huì)再次得出最小 t
//6、重復(fù) 3、4、5步*/
function Dijkstra(){
//初始化構(gòu)造一個(gè)集合,mapt[i][j]為點(diǎn)i到j(luò)的距離,不通的為無(wú)窮大
var mapt = [
[undefined,undefined,undefined,undefined,undefined,undefined],
[undefined,Infinity,2,5,Infinity,Infinity],
[undefined,Infinity,Infinity,2,6,Infinity],
[undefined,Infinity,Infinity,Infinity,7,1],
[undefined,Infinity,Infinity,2,Infinity,4],
[undefined,Infinity,Infinity,Infinity,Infinity,Infinity],
];
var n = mapt.length - 1;
//開始計(jì)算
this.dijkstra = function(u){ //u為源點(diǎn)
var dist = []; //dist[i]為點(diǎn)i到y(tǒng)的最短距離
var p = []; //p[i] 為點(diǎn)i的前溯點(diǎn)
var flag = []; //flag[i] 是否已經(jīng)加入 s集合
//初始化數(shù)據(jù) dist,p,flag
for(var i = 1; i <= n; i++){
dist[i] = mapt[u][i]; //從源點(diǎn)到i的距離
if(dist[i] == Infinity){ //前溯點(diǎn)如果不通過(guò)為-1
p[i] = -1;
}else{
p[i] = u;
}
flag[i] = false; //都沒(méi)有選中
}
flag[u] = true; //選擇了源點(diǎn),s集合只有 u
for(var i = 1; i <= n; i++){
var t = u; var temp = Infinity;
for(var j = 1; j <= n ; j++){ //獲取dist里面,v-s集合的最短距離
if(!flag[j] && dist[j] <= temp){
temp = dist[j];
t = j;
}
}
//查看是否找到最短的距離
if(t == u){
return {
dist:dist,
p:p
};
}
//找到了,將t加入集合 s
flag[t] = true;
for(var k = 1 ; k <= n; k++){ //以t為捷徑點(diǎn)(t為前溯點(diǎn)),尋找所有滿足條件的點(diǎn)
if(!flag[k] && mapt[t][k] < Infinity ){
if(dist[k] > (dist[t] + mapt[t][k])){
dist[k] = dist[t] + mapt[t][k]; //源點(diǎn)到k的距離 > 源點(diǎn)到t的距離 + t到k的距離
p[k] = t;
}
}
}
}
return {
dist:dist,
p:p
}
}
this.getpath = function(u){
var process = this.dijkstra(u);
var dist = process.dist;
var p = process.p;
for(var i = 1; i <= n; i++){
var start = i;
var str = i;
while(start != -1){
start = p[start]; //迭代出路徑
if(start != -1){
str = str + '、' + start;
}
}
console.log(str);
}
}
}
var Dijk = new Dijkstra();
//console.log(Dijk.dijkstra(1));
console.log(Dijk.getpath(1));
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之棧詳解
- javascript將扁平的數(shù)據(jù)轉(zhuǎn)為樹形結(jié)構(gòu)的高效率算法
- js實(shí)現(xiàn)無(wú)限層級(jí)樹形數(shù)據(jù)結(jié)構(gòu)(創(chuàng)新算法)
- JS中的算法與數(shù)據(jù)結(jié)構(gòu)之集合(Set)實(shí)例詳解
- JS中的算法與數(shù)據(jù)結(jié)構(gòu)之字典(Dictionary)實(shí)例詳解
- JS中的算法與數(shù)據(jù)結(jié)構(gòu)之鏈表(Linked-list)實(shí)例詳解
- JS中的算法與數(shù)據(jù)結(jié)構(gòu)之隊(duì)列(Queue)實(shí)例詳解
- JavaScript數(shù)據(jù)結(jié)構(gòu)與算法
相關(guān)文章
JavaScript如何將偽數(shù)組轉(zhuǎn)換成數(shù)組?
這篇文章主要介紹了JavaScript如何將偽數(shù)組轉(zhuǎn)換成數(shù)組,?偽數(shù)組的主要特征是一個(gè)對(duì)象,并且該對(duì)象有l(wèi)ength屬性,更多參考內(nèi)容,需要的小伙伴可以參考一下2022-07-07
JavaScript數(shù)組去重的五種方法及其他細(xì)節(jié)和拓展
JavaScript數(shù)組去重這個(gè)問(wèn)題,經(jīng)常出現(xiàn)在面試題中,下面這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)組去重的五種方法及其他細(xì)節(jié)和拓展的相關(guān)資料,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
更改BootStrap popover的默認(rèn)樣式及popover簡(jiǎn)單用法
這篇文章主要介紹了更改BootStrap popover的默認(rèn)樣式及popover簡(jiǎn)單用法,需要的朋友可以參考下2018-09-09
絕對(duì)經(jīng)典的滑輪新聞顯示(javascript+css)實(shí)現(xiàn)
這篇文章主要介紹了絕對(duì)經(jīng)典的滑輪新聞顯示(javascript+css)實(shí)現(xiàn),需要的朋友可以參考下2007-03-03
js提示框替代系統(tǒng)alert,自動(dòng)關(guān)閉alert對(duì)話框的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇js提示框替代系統(tǒng)alert,自動(dòng)關(guān)閉alert對(duì)話框的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
js讀取被點(diǎn)擊次數(shù)的簡(jiǎn)單實(shí)例(從數(shù)據(jù)庫(kù)中讀取)
這篇文章主要介紹了js讀取被點(diǎn)擊次數(shù)的簡(jiǎn)單實(shí)例(從數(shù)據(jù)庫(kù)中讀取)。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-03-03

