今天看书看到了迪克斯特拉算法,大概用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. 用反射的形式将一个对象属性值赋值给另一个对象,省略点get/set方法的冗余代码

    1.本例使用的是idea 首先需要在idea中安装lombok插件,省略getter和setter方法的书写 在maven项目中加入lombok依赖 <dependency> <gr ...

  2. L1-059 敲笨钟

    微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉.为了增加敲钟的趣味性,还会糟改几句古诗词.其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”.例如唐代 ...

  3. NLog使用整理

    NLog使用中碰到的问题整理 1,日志写mysql数据库报错, 原因: 在sql语句中使用了mysql的函数now() 导致插入失败, 解决办法: 使用参数代替now(). 在nlog配置文件中设置  ...

  4. Codeforces Round #369 (Div. 2) C. Coloring Trees(简单dp)

    题目:https://codeforces.com/problemset/problem/711/C 题意:给你n,m,k,代表n个数的序列,有m种颜色可以涂,0代表未涂颜色,其他代表已经涂好了,连着 ...

  5. Linux----Github环境搭建

    前面介绍了在Windows环境上安转GitHub环境,原本以为打包成jar,发布到Linux不需要再安转Git,但是因为我们使用了Config-Server配置中心,远程配置来启动,所以需要在Linu ...

  6. 责任链模式(Chain of Responsibility)

    定义:为一个请求定义含有链状关系的接受对象,基于请求的类型,松耦合发送者和接受者之间的关系. 实现方式: 首先定义一个抽象类,包括一个公共抽象行为和决定子类链状关系的属性,然后创建一系列对象继承这个抽 ...

  7. Django中Form验证

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一,Form验证 第一种操作:主要是这三个函数 ...

  8. python并发_进程_multiprocessing

    多进程基础, 主要是用了 multiprocessing模块 : 在一个python进程中开启子进程,start方法和并发效果. import time from multiprocessing im ...

  9. Openresty 进行路由系统设计

    1.系统基础设计图为: 用户通过Http访问Openresty(Nginx + Lua), 其中Nginx虚拟主机中配置文件进行Lua脚本加载. LUA通过nginx内置变量或者http请求中变量来区 ...

  10. log4j:WARN Please initialize the log4j system properly解决办法

    使用log4j,报警如下: log4j:WARN No appenders could be found for logger log4j:WARN Please initialize the log ...