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 相关文章推荐
js表格分页实现代码
Sep 18 Javascript
javascript对select标签的控制(option选项/select)
Jan 31 Javascript
js 用CreateElement动态创建标签示例
Nov 20 Javascript
JSONP跨域的原理解析及其实现介绍
Mar 22 Javascript
javascript字母大小写转换的4个函数详解
May 09 Javascript
jQuery的几个我们必须了解的特点
May 03 Javascript
javascript实现简单的分页特效
Aug 12 Javascript
基于jquery实现动态竖向柱状条特效
Feb 12 Javascript
JavaScript实现替换字符串中最后一个字符的方法
Mar 07 Javascript
javascript将url解析为json格式的两种方法
Aug 18 Javascript
微信小程序新手教程之页面打开数量限制
Mar 03 Javascript
JavaScript实现图片合成下载的示例
Nov 19 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定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
JavaScript 题型问答有答案参考
2010/02/17 Javascript
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
JS定时器实例详细分析
2013/10/11 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
jQuery的层级查找方式分析
2016/06/16 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
简单的通用表达式求10乘阶示例
2014/03/03 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
Django Form常用功能及代码示例
2020/10/13 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
完美的中文自荐信
2014/05/24 职场文书
银行贷款收入证明
2014/10/17 职场文书
司法局2014法制宣传日活动总结
2014/11/01 职场文书
公司规章制度范本
2015/08/03 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python