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 相关文章推荐
JQuery 风格的HTML文本转义
Jul 01 Javascript
js获取元素在浏览器中的绝对位置
Jul 24 Javascript
js封装的textarea操作方法集合(兼容很好)
Nov 16 Javascript
JavaScript获取页面上被选中文字的方法技巧
Mar 13 Javascript
jQuery处理图片加载失败的常用方法
Jun 08 Javascript
javascript实现抽奖程序的简单实例
Jun 07 Javascript
jQuery validata插件实现方法
Jun 25 jQuery
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
May 26 Javascript
深入了解响应式React Native Echarts组件
May 29 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
Oct 28 jQuery
比较node.js和Deno
Apr 27 Javascript
vue+spring boot实现校验码功能
May 27 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
PHP英文字母大小写转换函数小结
2014/05/03 PHP
ThinkPHP中的关联模型注意点
2014/06/16 PHP
php无序树实现方法
2015/07/28 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
node.js-v6新版安装具体步骤(分享)
2017/09/06 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
关于微信小程序登录的那些事
2019/01/08 Javascript
JavaScript实现背景自动切换小案例
2019/09/27 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
python用来获得图片exif信息的库实例分析
2015/03/16 Python
Python中用于计算对数的log()方法
2015/05/15 Python
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
Python实例一个类背后发生了什么
2016/02/09 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
python集合能干吗
2020/07/19 Python
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
荷兰皇家航空公司官方网站:KLM Royal Dutch Airlines
2017/12/07 全球购物
中文专业毕业生自荐信
2013/10/28 职场文书
测试工程师岗位职责
2013/11/28 职场文书
无犯罪记录证明
2014/09/19 职场文书
三严三实学习心得体会
2014/10/13 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
搞笑的婚礼主持词
2015/06/29 职场文书