今天看书看到了迪克斯特拉算法,大概用js实现一下呢,计算最短路径。

首先,迪克斯特拉算法只适用于有向无环图,且没有负权重,本例关系图如下哦,数字为权重,emmmm,画得稍微有点丑~

     //大概用js实现一下迪克斯特拉算法,计算最短路径
// (6)→ A → (1)
// ↑ ↑ ↓
// 起点 (3) 终点
// ↓ ↑ ↑
// (2) → B → (5)
//迪克斯特拉算法只适用于有向无环图,且没有负权重
//上图()内为权重
//散列表在js中表示为对象
var graph = {};//记录节点
graph.start = {};
graph.start.a = 6;//起点到达A点权重为6
graph.start.b = 2; graph.a = {};
graph.a.end = 1;
graph.b = {};
graph.b.end = 5;
graph.b.a = 3; graph.end = {}; var costs = {};//记录起点到各点权重
costs.a = 6;
costs.b = 2;
costs.end = '';//暂时不知道 var parents = {};//记录最短路径中各节点的父节点
parents.a = 'start';
parents.b = 'start';
parents.end = ''; var processed = {};//记录已处理过的节点 //找出开销最小的节点(方法比较多呢,随便写了一个)
function findLowestCostNode(costs) {
var value = '';
var node = '';
for(var key in costs) {
if(processed[key]) {
continue;
}
if(!value) {
value = costs[key];
node = key;
}else {
if(costs[key] && costs[key]<value) {
value = costs[key];
node = key;
}
}
}
return node;
} var node = findLowestCostNode(costs);//找出开销最小节点
while(node) {
var cost = costs[node];//当前最小开销
var neighbors = graph[node];//当前节点相邻节点
for(var n in neighbors) {
var newCost = cost + neighbors[n];//到达相邻节点的开销数
if (!costs[n]) {
costs[n] = newCost;
parents[n] = node;
}else {
if (costs[n] > newCost) {//检查相应节点开销数是否小于已知开销数
costs[n] = newCost;//更新相应节点开销数
parents[n] = node;//更新相应节点父节点
}
}
}
processed[node] = 1;;//记录已处理过节点
node = findLowestCostNode(costs);//更新最小节点继续循环
} console.log(costs['end']);//6 此处为最短路径开销
var line = [];
line.unshift('end');
printLine(parents['end']);
console.log(line);//["start", "b", "a", "end"] //使用递归打印出完整路径
function printLine(node) {
if( node != 'start') {
line.unshift(node);
printLine(parents[node]);
}else {
line.unshift('start');
}
}

看过的东西不使用就容易忘记,稍微记录一下,写法比较小白,大神们就自动忽略吧~

知道了新东西还真是一件有意思的事情~

用js简单实现一下迪克斯特拉算法的更多相关文章

  1. 广度优先搜索(BreadthFirstSearch)& 迪克斯特拉算法 (Dijkstra's algorithm)

    BFS可回答两类问题: 1.从节点A出发,有前往节点B的路径吗? 2.从节点A出发,前往节点B的哪条路径经过的节点最少? BFS中会用到"队列"的概念.队列是一种先进先出(FIFO ...

  2. [算法导论]迪克斯特拉算法 @ Python

    class Graph: def __init__(self): self.V = [] self.w = {} class Vertex: def __init__(self, x): self.k ...

  3. Dijkstra Algorithm 迪克特斯拉算法--Python

    迪克斯拉特算法: 1.找出代价最小的节点,即可在最短时间内到达的节点: 2.更新节点的邻居的开销: 3.重复这个过程,直到图中的每个节点都这样做了: 4.计算最终路径. ''' 迪克斯特拉算法: 1. ...

  4. <经验杂谈>介绍Js简单的递归排列组合

    最近在开发SKU模块的时候,遇到这样一个需求,某种商品有N(用未知数N来表示是因为规格的数组由用户制定且随时可以编辑的,所以对程序来说,它是一个未知数)类规格,每一类规格又有M个规格值,各种规格值的组 ...

  5. 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)

    上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...

  6. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  7. 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)

    Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...

  8. JS实现最短路径之弗洛伊德(Floyd)算法

    弗洛伊德算法是实现最小生成树的一个很精妙的算法,也是求所有顶点至所有顶点的最短路径问题的不二之选.时间复杂度为O(n3),n为顶点数. 精妙之处在于:一个二重初始化,加一个三重循环权值修正,完成了所有 ...

  9. Java 迪杰斯特拉算法实现查找最短距离

    迪杰斯特拉算法 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是 ...

随机推荐

  1. 转载: http状态码

    消息   这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在 ...

  2. participation remain wide

    Equal access to universities stagnates Image copyright Getty Images The most advantaged teens have t ...

  3. unigui的页面布局使用

    (unigui的页面布局还是很强大的,基本什么的排版都能搞好.前面部分为原文章翻译,翻译不一定很准确,就能看吧,后面有使用说明,有什么不明白的欢迎加我QQ(910300653)一起交流学习) 一.布局 ...

  4. 0x80070522:客户端没有所需的特权的解决方法(win7,win10通过)

    往C盘上粘贴文件的时候提示错误0x80070522:客户端没有所需的特权,解决方法如下: 一般情况下,我们思考的方向肯定是往用户权限方向的,但增加的用户是最高权限的管理员还是不可以..   暂时还没有 ...

  5. 自学python之路(day2)

    1. 格式化输出 %表示占位符 ,s表示字符串 ,d表示数字,%s就是代表字符串占位符,%d,是数字占位符 示例1:输入用户的姓名.性别.年龄.爱好的通用模板 name = input("请 ...

  6. L342 Air Pollution Is Doing More Than Just Slowly Killing Us

    Air Pollution Is Doing More Than Just Slowly Killing Us In the future, the authorities might need to ...

  7. Spark笔记

    Spark基础 第一节:什么是Spark?Spark的特点和结构 1.什么是Spark? Spark是一个针对大规模数据处理的快速通用引擎. 类似MapReduce,都进行数据的处理 2.Spark的 ...

  8. IP通信基础课堂笔记----简答题

    1.局域网优点:局域网特点(5) 2.10BASE-T技术特性(8) 3.网桥/交换机的优点(3):缺点(3) 4.虚拟局域网特点(4) *转发表或原MAC地址规则:记录源MAC地址 *VLAN帧格式 ...

  9. python笔记2——关于列表的使用

      一.列表的一些基本用法 names=["XiaoNaiyou", "XiaoNan", "WeiZhen", "WuCheng ...

  10. 如何快速判断一个key是否存在在亿级数据中(bloomFilters)

    面试题 现在有一个非常庞大的数据(亿级),假设全是 int 类型.现在我给你一个数,你需要告诉我它是否存在其中(尽量高效) 分析 采用bloomFilters进行实现(时间&空间尽可能的有效) ...