目录

  • 前言
  • 一、Dijkstra算法
    • 算法实现
  • 二、Floyd-Warshall 算法
    • 算法实现

前言

最短路问题是图问题中的经典问题,这类问题在生活中非常常见,我们(特别是生活在大城市的人)出门在外,无论是驾车还是乘坐公共交通工具,甚至步行,都会求助于高德地图、百度地图等定位和导航程序。我们可能会有其他的考虑:例如如何乘车、换乘?如何避开拥堵路段?但根本的问题仍然是:哪条路径最短?
在图问题中,这一问题对应的算法被称为最短路径算法。本文介绍其中两种非常著名算法的JavaScript实现:
Dijkstra算法和Floyd-Warshall算法
关于Dijkstra算法 和 Floyd-Warshall算法可以参考以下博文
Dijkstra算法
Floyd-Warshall算法


一、Dijkstra算法

Dijkstra算法是一种计算从单个源到所有其他源的最短路径的贪心算法,这意味着我们可以用它来计算从图的一个顶点到其余各顶点的最短路径

考虑下图:

我们来看看如何找到顶点A和其余顶点之间的最短路径。但首先,我们需要声明表示上图的邻接矩阵,如下所示:

var graph = [[0,2,4,0,0,0],[0,0,2,4,2,0],[0,0,0,0,3,0],[0,0,0,0,0,2],[0,0,0,3,0,2],[0,0,0,0,0,0]]

算法实现

下面给出Dijkstra算法的实现:

this.dijkstra = function(src){ //输入参数src为源节点索引,例如A点的索引是0,B点是1var dist = [], //最短路径距离visited = [], //已访问length = this.graph.length //最长路径距离for(var i = 0; i < length; i++){dist[i] = Infinity   //先初始化为无穷大visited[i] = false // 初始化标记均未访问}dist[src] = 0 //起点最短距离设置为0for(var i = 0; i < length-1; i++){var u = minDistance(dist, visited) //寻找最短路visited[u] = true; //标记为已访问for(var v = 0; v < length; v++){if(!visited[v] && this.graph[u][v] != 0 && dist[u] != Infinity  &&dist[u] + this.graph[u][v] < dist[v]) {dist[v] = dist[u] + this.graph[u][v] //若找到更短路,更新}}}return dist;//处理完所有节点,返回源点到其他顶点的最短路径距离向量
}

计算顶点间最短路径minDistance,需要搜索dist向量中的最小值,返回它在数组中的索引:

var minDistance = function(dist, visited){var min = Infinity, minIndex = -1for(var v = 0; v < dist.length; v++){if(visited[v] == false && dist[v] <= min){min = dist[v]minIndex = v}}return minIndex
}

若选A为源节点,对本节开始的图执行以上算法

this.dijkstra(0)

会得到如下输出:

说明:本算法实现只求得了源节点到其他节点的最短路长度,没有给出具体路径。

二、Floyd-Warshall 算法

Floyd-Warshall算法是一种计算图中所有最短路径的动态规划算法。通过该算法,我们可以找出从所有源到所有顶点的最短路径。

算法实现

this.floydWarshall = function(){var dist = [],length = this.graph.length,i,j,kfor(i = 0; i < length; i++){dist[i] = []for(j = 0; j < length; j++){//录入一步直达路径if(this.graph[i][j] == 0 && i != j) {dist[i][j] = Infinity}else{dist[i][j] = this.graph[i][j]} console.log(dist[i][j])}}for(k = 0; k < length; k++){ //k是中间节点for(i = 0; i < length; i++){ //i是起点for(j = 0; j < length; j++){ //j是终点if((dist[i][k] + dist[k][j]) < dist[i][j]) //如果i经过k,到达j的路径比已有的最短路径更短dist[i][j] = dist[i][k] + dist[k][j] //则更新}}}return dist
}

this.floydWarshall()

会得到如下输出:


其中,Infinity代表顶点 i 到 j 的最短路径不存在。

【JavaScript算法实践】最短路径算法相关推荐

  1. 曼哈顿距离java实现_基于javascript实现获取最短路径算法代码实例

    这篇文章主要介绍了基于javascript实现获取最短路径算法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 //A算法 自动寻路 ...

  2. 【图论算法】最短路径算法(无权最短路径、Dijkstra算法、带负边值的图、无圈图)

    本篇博客将考察各种最短路径问题.     无权最短路径     Dijkstra 算法     具有负边值的图     无圈图     所有顶点对间的最短路径     最短路径的例子–词梯游戏 输入是 ...

  3. 数据结构与算法--图论最短路径算法应用-词阶求解

    最短路径案例 词梯应用,在一个词梯中,每个单词均由前一个单词改变一个字母而得到.例如,我们通过一系列单字母替换而得到zero转换为five,如下:five:zero,hero,here,hire,fi ...

  4. 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)

    一.基础知识   有向图   无向图 以无向图为例: 邻接矩阵: 度矩阵(对角矩阵): 二.最小生成树 应用:将网络顶点看着城市,边看着城市之间通讯网,边的权重看着成本,根据最小生成树可以构建城市之间 ...

  5. 迪杰斯特拉算法 php,最短路径算法

    从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径.解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法 ...

  6. 地图绘制和四色算法,图搜索算法,最小生成树算法,最短路径算法

    基于简易Web墨卡托计算实现地图绘制,四色染色,实现图的深度优先搜索,广度优先搜索,Kruskal算法最小生成树,Prime算法最小生成树,Dijkstra最短路径算法. 使用Java & S ...

  7. dijkstra邻接表_掌握算法-图论-最短路径算法-Dijkstra算法

    如果图是赋权图,那么问题就变得更困难了不过我们仍然可以使用来自无权情形时的想法. 我们保留所有与前面相同的信息.因此,每个顶点或者标记为Known的,或者标记为Unknown的.像之前一样,对每一个顶 ...

  8. java程序两点之间最短路径算法_java 最短路径算法 如何实现有向 任意两点的最短路径...

    展开全部 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节e68a8462616964757a686964616f31333361316131点的最短路径.主要 ...

  9. 机器学习算法实践——K-Means算法与图像分割

    一.理论准备 1.1.图像分割 图像分割是图像处理中的一种方法,图像分割是指将一幅图像分解成若干互不相交区域的集合,其实质可以看成是一种像素的聚类过程.通常使用到的图像分割的方法可以分为: 基于边缘的 ...

  10. dijkstra算法_最短路径算法—Dijkstra算法详解

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

最新文章

  1. 若兰-nvjdc 1.3新版本安装及老版本升级教程
  2. Android视图绘制逻辑与思想(一):attachToRoot到底有什么作用?
  3. 代码精进之路 码农到工匠pdf_VBA代码解决方案第065讲试看内容
  4. mysql什么级别数据库_Mysql的四种隔离级别是什么
  5. 互联网公司Java面试总结
  6. $.ajax()常用方法详解(推荐)
  7. TCP 之 RST 原因分析
  8. 【Python CheckiO 题解】Feed Pigeons
  9. linux中的信号1——信号概述
  10. linux /etc/shadow 文本结构
  11. 在使用代理的服务器上“curl: (6) Could not resolve host:“问题的解决方案
  12. 合适的大数据安全分析平台如何选择
  13. 21.TCP/IP 详解卷1 --- TCP 的超时与重传
  14. 耐用的蓝牙耳机推荐,现在比较好的蓝牙耳机点评
  15. MSN不显示头像怎么办?
  16. win7科学计算机不支持,win7“不支持的硬件,你的电脑使用的处理器专为最新版win...
  17. js 禁止鼠标菜单键及键盘快捷键
  18. 第五章 政策问题与议程设定
  19. 《指弹:The Sprinter》
  20. Illustrator 2023 Mac(Ai2023)v27.0中文版已发布,支持M1/M2/intel Mac处理器

热门文章

  1. 百度CTO王海峰:AI大生产平台再升级 助力中国科技自立自强
  2. 计算机网络体系结构:分层结构
  3. Fusion Application(FA)补丁管理工具简介
  4. 打开Github网站反应慢的问题
  5. mysql中间件培训_MySQL中间件Cetus
  6. bool型判断年份是否为闰年
  7. 新能源汽车产业链全景图
  8. Caseformer talk PPT截屏
  9. js 加快播放视频速度
  10. 【论文粗读】(NeurIPS 2020) SwAV:对比聚类结果的无监督视觉特征学习