js图数据结构处理 迪杰斯特拉算法代码实例


Posted in Javascript onSeptember 11, 2019

这篇文章主要介绍了js图数据结构处理 迪杰斯特拉算法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

js图数据结构处理 迪杰斯特拉算法代码实例

/*//1、确定数据结构, mapf[i][j] 为点i到点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、如果源点为1,则 s = {1}, 则 v-s = {2,3,4,5}; s为已经规划好的点,v-s是需要规划的点 
    var dist = []; //dist[i] = mapf[1][i];dist[1] = 0;
    //源点1到i有边相连,初始化前驱为1(源点为前驱),否则初始化为-1
    var p = [-1,1,1,-1,-1];
     
     
    //3、找到 v-s = {2,3,4,5}集合里面,到源点1,最近的点
      //得出结果为2,节点为 t = 2,则 v-s={3、4、5},s={1、2};
       
    //4、借道t=2,所有t的相邻点,借道t;例如相邻点3,则 a = dist[2] + maf[2][3]; b = dist[3];
    //两个取较小值,得a < b; 2-3为捷径,则记录下dist[3] = a;记录下3的前驱点 p[3] = 2;
    //经过第4步,计算了2的相邻点,3、4;
     
    //5、比较v-s={3、4、5}的到源点的最近距离,即是 v-s={3、4、5}时,执行第3步,此时相当于源点为2会再次得出最小 t
     
    //6、重复 3、4、5步*/
     
     
     
    function Dijkstra(){
       //初始化构造一个集合,mapt[i][j]为点i到j的距离,不通的为无穷大
      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;
      //开始计算
      this.dijkstra = function(u){ //u为源点
        var dist = []; //dist[i]为点i到y的最短距离
        var p = [];  //p[i] 为点i的前溯点
        var flag = []; //flag[i] 是否已经加入 s集合
       
        //初始化数据 dist,p,flag
        for(var i = 1; i <= n; i++){
          dist[i] = mapt[u][i]; //从源点到i的距离 
          if(dist[i] == Infinity){ //前溯点如果不通过为-1
            p[i] = -1;
          }else{
            p[i] = u;
          }
           
          flag[i] = false; //都没有选中
        }
         
        flag[u] = true; //选择了源点,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为捷径点(t为前溯点),寻找所有满足条件的点
            if(!flag[k] && mapt[t][k] < Infinity ){
              if(dist[k] > (dist[t] + mapt[t][k])){
                dist[k] = dist[t] + mapt[t][k]; //源点到k的距离 > 源点到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));

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
Feb 22 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
Aug 14 Javascript
jquery数组之存放checkbox全选值示例代码
Dec 20 Javascript
利用jquery写的左右轮播图特效
Feb 12 Javascript
常见的jQuery选择器汇总
Nov 24 Javascript
javascript实现带下拉子菜单的导航菜单效果
May 14 Javascript
Bootstrap每天必学之面板
Nov 30 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
Dec 14 Javascript
基于JavaScript实现数码时钟效果
Mar 30 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
简单分析js中的this的原理
Aug 31 Javascript
Python机器学习之决策树和随机森林
Jul 15 Javascript
js简单的分页器插件代码实例
Sep 11 #Javascript
解决在layer.open中使用时间控件laydate失败的问题
Sep 11 #Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
Sep 11 #Javascript
layer弹出层扩展主题的方法
Sep 11 #Javascript
手写Vue弹窗Modal的实现代码
Sep 11 #Javascript
js回溯法计算最佳旅行线路代码实例
Sep 11 #Javascript
layer更改皮肤的实现方法
Sep 11 #Javascript
You might like
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
JavaScript运算符小结
2015/06/03 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
python3+PyQt5泛型委托详解
2018/04/24 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
pandas数据拼接的实现示例
2020/04/16 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
弘扬雷锋精神演讲稿
2014/05/10 职场文书
刑事代理授权委托书
2014/09/17 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
学前班学生评语
2014/12/29 职场文书
初二英语教学反思
2016/02/15 职场文书