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 相关文章推荐
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
Sep 08 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
Nov 09 Javascript
Bootstrap的Refresh Icon也spin起来
Jul 13 Javascript
微信js-sdk上传与下载图片接口用法示例
Oct 12 Javascript
最全的JavaScript开发工具列表 总有一款适合你
Jun 29 Javascript
Vue单文件组件基础模板小结
Aug 10 Javascript
EasyUI在Panel上动态添加LinkButton按钮
Aug 11 Javascript
BACKBONE.JS 简单入门范例
Oct 17 Javascript
用JavaScript做简易的购物车的代码示例
Oct 20 Javascript
使用vue重构资讯页面的实例代码解析
Nov 26 Javascript
Vue+Java+Base64实现条码解析的示例
Sep 23 Javascript
用React Native制作一个简单的游戏引擎
May 27 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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
php 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
PHP缓存技术的多种方法小结
2012/08/14 PHP
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
推荐40款强大的 jQuery 导航插件和教程(上篇)
2012/09/14 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
2019/03/07 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
Python数据类型学习笔记
2016/01/13 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
详解Python对JSON中的特殊类型进行Encoder
2019/07/15 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
HTML5 canvas实现的静态循环滚动播放弹幕
2021/01/05 HTML / CSS
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
2014年反洗钱工作总结
2014/11/22 职场文书
银行资信证明
2015/06/17 职场文书
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python