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 相关文章推荐
基于Web标准的UI组件 — 树状菜单(2)
Sep 18 Javascript
使用js+jquery实现无限极联动
May 23 Javascript
jquery获得option的值和对option进行操作
Dec 13 Javascript
JQuery中Ajax()的data参数类型实例分析
Dec 15 Javascript
JS匿名函数类生成方式实例分析
Nov 26 Javascript
解决easyui日期时间框ie的兼容的问题
Mar 01 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
Mar 05 Javascript
layer弹出层父子页面事件相互调用方法
Aug 17 Javascript
聊聊Vue 中 title 的动态修改问题
Jun 11 Javascript
Vue.js计算机属性computed和methods方法详解
Oct 12 Javascript
如何使用jQuery操作Cookies方法解析
Sep 08 jQuery
jQuery实现图片切换效果
Oct 19 jQuery
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
8个必备的PHP功能实例代码
2013/10/27 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
2015/11/05 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
HTML颜色选择器实现代码
2010/11/23 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
2015/03/04 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
Python正则表达式常用函数总结
2017/06/24 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
python3.6编写的单元测试示例
2019/08/17 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
解决Pymongo insert时会自动添加_id的问题
2020/12/05 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
保险专业大专生求职信
2013/10/26 职场文书
贷款委托书范本
2014/04/08 职场文书
爱国演讲稿400字
2014/05/07 职场文书
行政管理专业求职信
2014/07/06 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
2015年党性分析材料
2014/12/19 职场文书
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL