最近在學演算法,沉迷於js的我,就想用js敲一敲這個prim演算法,至於prim演算法具體是什麼,怎麼回事,大家可以自行搜尋,這裡只貼上**和部分註解
資料是從檔案裡讀出來的所以用了一下node.js,資料格式如下
7 9
1 2 28
1 6 10
2 7 14
2 3 16
6 5 25
7 5 24
7 4 18
3 4 12
5 4 22
var fs = require('fs')
var path = require('path');
var q = require("q");
var max = 100000;
var dingdian;//頂點數
var bian;//邊數
var edge = ;//矩陣
var node = // 記錄節點
var addnew = ; //設定頂點是否加入到集合
// 優先佇列資料結構
function
priorityqueue
() this.element = element;
this.priority = priority;
}this.enqueue = function
(element, priority)
items.splice(i,0,queueelement); //
added = true;
break; // }}
if (!added)}};
this.dequeue = function
(); this.front = function
(); this.isempty = function
(); this.size = function
(); }
var q = new priorityqueue(); //建立優先佇列
//初始化輸入矩陣
function
initrect
(length)
}}//讀取資料
function
preadfile
(file)else
});return deferred.promise;
}var filein = path.resolve('input.txt')
preadfile(filein).then(function
(data)else
if(_arr.length === 3) else
}//求值
var result = prim(dingdian, edge);
var _arr = ;
for(key in result)
_arr.splice(0,1);
console.log(max)//結果是25
});// 開始prim演算法 prim([頂點數],[矩陣])
function
prim
(dingdian, edge)
node[i].element = i;
node[i].priority = max;
addnew[i] = false; //把所有點都設定成沒有放入
}// console.log('node',node[1])
node[1].priority = 0; //從起始點開始找
q.enqueue(node[1].element, node[1].priority)//把權最小的放入佇列
while(!q.isempty())
addnew[flag] = true;
for(var j=1; j1; j++) }}
return node
}
Prim最小生成樹 優先佇列優化
處理何種問題 求解無向連通圖的最小生成樹,適合於稠密圖,即點少邊多的無向圖。效能 時間複雜度為 o v loge v為點的個數,e為邊的個數 原理 貪心策略。實現步驟 正向模擬找連線點。即取任意一點,放入集合,找此點集合內最短的邊且邊的另一端點不在該集合內的點,將改點放入點集合內,重複此操作,直至所...
JS實現佇列
佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列是遵循fifo first in first out,先進先出,也稱為先來先服務 原...
js實現佇列
佇列是一種列表,不同的是佇列只能在隊尾插入元素,在隊首刪除元素。可以將佇列想象成在銀行前排隊的人群,排在最前面的人第乙個辦理業務,新來的人只能在後面排隊,直到輪到他們為止。push 向隊尾插入元素 queue 在隊首移除元素 peek 檢視隊首的元素 datestore 使用陣列儲存 var que...