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 相关文章推荐
ext监听事件方法[初级篇]
Apr 27 Javascript
js 颜色选择器(兼容firefox)
Mar 05 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
Oct 27 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
Dec 26 Javascript
js文件缓存之版本管理详解
Jul 05 Javascript
3种js实现string的substring方法
Nov 09 Javascript
JQuery fileupload插件实现文件上传功能
Mar 18 Javascript
React-Native中禁用Navigator手势返回的示例代码
Sep 09 Javascript
JS求1到任意数之间的所有质数的方法详解
May 20 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
Oct 15 Javascript
Vue.directive 实现元素scroll逻辑复用
Nov 29 Javascript
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
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/12/06 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
js创建元素(节点)示例
2014/01/02 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
js中对函数设置默认参数值的3种方法
2015/10/23 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
在Python中进行自动化单元测试的教程
2015/04/15 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
python3 xpath和requests应用详解
2020/03/06 Python
宝宝周岁宴答谢词
2014/01/26 职场文书
村创先争优活动总结
2014/08/28 职场文书
创先争优活动心得体会
2014/09/04 职场文书
幼儿园见习报告
2014/10/30 职场文书
护理医院见习报告
2014/11/03 职场文书
汽车转让协议书
2015/01/29 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
交通安全月活动总结
2015/05/08 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python