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 相关文章推荐
jQuery使用一个按钮控制图片的伸缩实现思路
Apr 19 Javascript
document.execCommand()的用法小结
Jan 08 Javascript
js原型继承的两种方法对比介绍
Mar 30 Javascript
JavaScript中的apply和call函数详解
Jul 20 Javascript
JS实现简易图片轮播效果的方法
Mar 25 Javascript
javascript插件开发的一些感想和心得
Feb 28 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
Jan 19 Javascript
JavaScript面向对象精要(下部)
Sep 12 Javascript
JavaScript 中的 this 简单规则
Sep 19 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
Jan 11 Javascript
vue踩坑记录之数组定义和赋值问题
Mar 20 Javascript
JavaScript缺少insertAfter解决方案
Jul 03 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
一个简洁的多级别论坛
2006/10/09 PHP
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
犀利的js 函数集合
2009/06/11 Javascript
javascript window对象属性整理
2009/10/24 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
JS实现DIV高度自适应窗口示例
2017/02/16 Javascript
js实现一键复制功能
2017/03/16 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
vue生命周期的探索
2019/04/03 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
python分析网页上所有超链接的方法
2015/05/08 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
文职个人求职信范文
2013/09/23 职场文书
三年级科学教学反思
2014/01/29 职场文书
学生会竞聘书范文
2014/03/31 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
小学国庆节活动总结
2015/03/23 职场文书
会计岗位职责范本
2015/04/02 职场文书
员工安全责任协议书
2016/03/22 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript