js实现prim+优先队列
来源:互联网 发布:移动和网络怎么没信号 编辑:程序博客网 时间:2024/06/05 07:06
最近在学算法,沉迷于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() { var items = []; function QueueElement (element, priority){ // {1} this.element = element; this.priority = priority; } this.enqueue = function(element, priority){ var queueElement = new QueueElement(element, priority); var added = false; for (var i=0; i< items.length; i++){ if (queueElement.priority < items[i].priority){ // {2} items.splice(i,0,queueElement); // {3} added = true; break; // {4} } } if (!added){ items.push(queueElement); //{5} } }; this.dequeue = function(){ return items.shift(); }; this.front = function(){ return items[0]; }; this.isEmpty = function(){ return items.length == 0; }; this.size = function(){ return items.length; }; }var q = new PriorityQueue(); //创建优先队列//初始化输入矩阵function initRect(length) { for(var i = 1; i<length+1; i++) { edge[i] = []; for(var j=1; j<length+1;j++) { edge[i][j] = MAX; } }}//读取数据function preadFile (file){ var deferred = Q.defer(); fs.readFile(file,'utf-8', function(err,data){ if(!err){ deferred.resolve(data); }else{ deferred.reject(err); } }); return deferred.promise; }var filein = path.resolve('input.txt')preadFile(filein).then(function(data){ var arr = data.split(/\r\n/) //回车空行分割读取 // console.log(arr) for(var i=0;i<arr.length;i++) { var _arr = arr[i].split(' '); if(_arr.length === 2) { dingdian = parseInt(_arr[0]); bian = parseInt(_arr[1]) initRect(dingdian);//进行初始化 }else if(_arr.length === 3) { //添加数据到矩阵 edge[_arr[0]][_arr[1]] = parseInt(_arr[2]); edge[_arr[1]][_arr[0]] = parseInt(_arr[2]); }else { return; } } //求值 var result = prim(dingdian, edge); var _arr = []; for(key in result) { _arr[key] = result[key].priority } _arr.splice(0,1); var max = Math.max.apply(Math, _arr) console.log(max)//结果是25});// 开始prim算法 prim([顶点数],[矩阵])function prim(dingdian, edge) { for(var i=1; i<dingdian+1; i++) { node[i] = {} 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()) { var _q = q.front(); q.dequeue(); var flag = _q.element;// if(addNew[flag]) { continue; } addNew[flag] = true; for(var j=1; j<dingdian+1; j++) { if(j!=flag && !addNew[j] && node[j].priority > edge[flag][j]){ node[j].priority = edge[flag][j]; q.enqueue(node[j].element, node[j].priority) } } } return node}
阅读全文
0 0
- js实现prim+优先队列
- 利用优先队列PriorityQueue实现Prim算法
- 最小优先队列+prim
- 优先队列优化prim算法
- POJ 1251 优先队列 Prim
- 优先队列+prim(待完善)
- 还是畅通工程(Prim+优先队列)
- Python实现优先队列
- 优先队列实现堆
- 优先队列的实现
- 优先队列实现栈
- Python实现优先队列
- 优先队列实现
- 优先队列(堆实现)
- 实现一个优先队列
- 优先队列 C实现
- C++实现优先队列
- 优先队列初级实现
- 学生成绩学籍管理系统(链表)
- Tomcat vhost 配置教程
- JAVA正则表达式 Pattern和Matcher
- 阿里云Linux服务器Tomcat80端口无法访问问题
- 多线程的实现方式及其区别
- js实现prim+优先队列
- Leetcode(11)
- 【seuoj】90: 进制转换(正数)
- File的用法
- 微信开发 40001 invalid credential 的解决方案
- Android之屏幕适配
- File文件
- ubuntu网站服务器环境搭建
- Shell脚本基础10-基本的数学运算