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 相关文章推荐
javascript延时重复执行函数 lLoopRun.js
Jun 29 Javascript
一个XML格式数据转换为图表的例子
Feb 09 Javascript
js window.onload 加载多个函数和追加函数详解
Jan 08 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
Aug 07 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
Dec 21 Javascript
js实现华丽的九九乘法表效果
Mar 29 Javascript
Vue.js如何实现路由懒加载浅析
Aug 14 Javascript
微信小程序网络封装(简单高效)
Aug 06 Javascript
Vue动态面包屑功能的实现方法
Jul 01 Javascript
ES6 Promise对象概念及用法实例详解
Oct 15 Javascript
vue3.0中使用postcss-pxtorem的具体方法
Nov 20 Javascript
关于Vue中$refs的探索浅析
Nov 05 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
php中try catch捕获异常实例详解
2014/11/21 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
前端性能优化及技巧
2016/05/06 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
微信小程序 wxapp导航 navigator详解
2016/10/31 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
详解Python中的变量及其命名和打印
2016/03/11 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
连锁经营管理专业大学生求职信
2013/10/30 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
2014年仓库工作总结
2014/11/20 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
沈阳故宫导游词
2015/01/31 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书