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语法着色引擎(demo及打包文件下载)
Jun 13 Javascript
JavaScript 用cloneNode方法克隆节点的代码
Oct 15 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
Apr 02 Javascript
js图片向右一张张滚动效果实例代码
Nov 23 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
Dec 13 Javascript
JS+CSS实现的经典tab选项卡效果代码
Sep 16 Javascript
微信小程序 登录的简单实现
Apr 19 Javascript
vue bootstrap小例子一枚
Jun 09 Javascript
Bootstrap Table从零开始
Jun 30 Javascript
JavaScript中递归实现的方法及其区别
Sep 12 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
Sep 20 Javascript
vue组件之间通信实例总结(点赞功能)
Dec 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
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
php中使用url传递数组的方法
2015/02/11 PHP
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
python随机生成指定长度密码的方法
2015/04/04 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
python虚拟环境迁移方法
2019/01/03 Python
使用Python 统计高频字数的方法
2019/01/31 Python
在pytorch中查看可训练参数的例子
2019/08/18 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
数据库笔试题
2013/05/09 面试题
毕业生自荐书
2014/02/03 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
杭白菊导游词
2015/02/10 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL