07-狄克斯特拉算法

数据结构和算法
基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏

第7章 狄克斯特拉算法

上一章的广度优先搜索,找出的是段数最少的路径;
本章狄克斯特拉算法,找出的是最快的路径。

7.1 使用狄克斯特拉算法
步骤:
第一步:找出最便宜的节点
在这里插入图片描述

从起点出发,前往节点A需要6分钟,而前往节点B需要2分钟。置于前往其他节点,先假设为不穷大。

第二步:计算经节点B前往其各个邻居所需的时间。
在这里插入图片描述

经节点B可以找到前往节点A更短的路径,只需要5分钟。
在这里插入图片描述

对于节点B的邻居,如果找到前往它的更短路径,就更新其开销:

  • 前往节点A的更短路径(从6分钟缩短到5分钟)。
  • 前往终点的更短路径(从无穷大缩短到7分钟)。

第三步:重复

重复第一步:找出可能在最短时间内前往的节点。
已经对节点B执行了第二步,除节点B外,可在最短时间内前往的节点是节点A。

在这里插入图片描述

重复第二步:更新节点A的所有邻居节点开销。

在这里插入图片描述

可以发现前往终点的时间为6分钟。
在这里插入图片描述
在这里插入图片描述

7.1.1
使用广度优先搜索来查找两点之间的最短路径,指的是段数最少;
而在狄克斯特拉算法中,每段都分配了一个数字或权重,因此找出的是总权重最小的路径。
在这里插入图片描述

狄克斯特拉算法的4个步骤:

  • (1)找出最便宜的节点,即可在最短时间内前往的节点。
  • (2)对于该节点的邻居,检查是否有前往它们的更短路径,如果有,就更新其开销。
  • (3)重复这个过程,直到对图中的每个节点都这样做了。
  • (4)计算最终路径。

7.2 术语

  • 狄克斯特拉算法用于每条边都有关联数字的图,这些数字称为权重(weight)。
  • 带权重的图为加权图(weighted graph),不带权重的图为非加权图(unweight graph)。
  • 环:从一个节点出发,走一圈后又回到这个节点。绕环的路径不可能是最短路径。
  • 无向图意味着两个节点彼此指向对方,其实就是环。在无向图中,每条边都是一个环。
  • 狄克斯特拉算法只适用于有向无环图(directed acyclic graph,DAG)。

7.3 换钢琴例子
Rama想用自己的乐谱来换架钢琴,那么需要确定哪种路径将乐谱换成钢琴时需要支付的额外费用最少。
在这里插入图片描述

使用狄克斯特拉算法可得到:
在这里插入图片描述

7.4 负权边
如果有负权边,就不能使用狄克斯特拉算法。
因为狄克斯特拉算法是这样假设的:对于处理过的海报节点,没有前往该节点的更短路径。这种假设仅在没有负权边时才成立。
在包含负权边的图中,要找出最短路径,可使用贝尔曼-福德算法。

7.5 实现
以下图为例。
在这里插入图片描述

要编写解决这个问题的代码,需要三个散列表。
在这里插入图片描述
算法实现思路
在这里插入图片描述

#实现图GRAPH:将节点的邻居和前往邻居的开销存储到散列表中。
graph["start"] = {}
graph["start"]["a"] = 6
graph["start"]["b"] = 2graph["a"] = {}
graph["a"]["fin"] = 1 #fin指到终点graph["b"] = {}
graph["b"]["a"] = 3
graph["b"]["fin"] = 5graph["fin"] = {} #终点没有任何邻居#实现图COSTS:节点的开销指的是从节点出发前往该节点需要多长时间。
infinity = float("inf")
costs = {}
costs["a"] = 6
costs["b"] = 2
costs["fin"] = infinity#实现图PARENTS:存储父节点的散列表。
parents = {}
parents["a"] = "start"
parents["b"] = "start"
parents["fin"] = None
processed = [] #记录处理过的几点的数组,避免多次处理。

准备工作做好了,接下来实现算法。
图4.2

#首先定义函数find_lowest_cost_node找出开销最低的结点
def find_lowest_cost_node(costs):lowest_cost = float("inf")lowest_cost_node = Nonefor node in costs:  #遍历所有节点cost = costs[node]if cost < lowest_cost and node not in processed: #如多当前节点的开销更低且未处理过,lowest_cost = cost #就将其视为开销最低的节点lowest_cost_node nodereturn lowest_cost_node#实现狄克斯特拉算法
node = find_lowest_cost_node(costs) #在未处理的节点中找出开销最小的节点。
while node is not None: #这个while循环在所有节点都被处理过后结束cost = cost[node]neighbors = graph[node]for n in neighbors.key(s):  #遍历当前节点的所有邻居new_cost = cost + neighbors[n]if costs[n] > new_cost: #如果经当前节点前往该邻居更近costs[n] = new_cost #就更新该邻居的开销parents[n] = node   #同时将该邻居的父节点设置为当前节点processed.append(node)      #将当前节点标记为处理过node = find_lowest_cost_node(costs) #找出接下来要处理的节点,并循环

7.6 小结

  • 广度优先搜索用于在非加权图中查找最短路径。
  • 狄克斯特拉算法用于在加权图中查找最短路径。
  • 仅当权重为正时狄克斯特拉算法才管用。
  • 如果图中包含负权边,请使用贝尔曼-福德算法。

——持续修改完善中…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊mysql执行过程

在项目开发当中 &#xff0c;很多时候&#xff0c;我们的数据库应用优化都是从表层到里层的一个过程。比如一个查询写下来 &#xff0c;我们的优化方向大多时候都是先看方法执行的时间长短&#xff0c;然后再决定是否去优化它&#xff0c;下意识的第一步操作都是看是否命中索引…

01. Node js Hello world

2019独角兽企业重金招聘Python工程师标准>>> 01. Node js Hello world 环境安装 官网http://nodejs.org/ Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, no…

异常检测之浅谈入侵检测

打开微信扫一扫&#xff0c;关注微信公众号【数据与算法联盟】 转载请注明出处&#xff1a;http://blog.csdn.net/gamer_gyt 博主微博&#xff1a;http://weibo.com/234654758 Github&#xff1a;https://github.com/thinkgamer前言 由于业务关系&#xff0c;最近一段时间一直在…

企业知识库在跨地域团队协作中的价值

随着全球化进程的不断加速&#xff0c;越来越多的企业开始面临跨地域协作的挑战。在这种背景下&#xff0c;企业知识库作为一种重要的知识管理工具&#xff0c;对于提高团队协作效率、促进知识共享与创新具有不可替代的价值。接下来就说一下知识库在跨地域团队协作中的重要性及…

Asp-Net-Core开发笔记:接口返回json对象出现套娃递归问题

前言看了下推送记录&#xff0c;一个月前&#xff0c;OK&#xff0c;我又变成月更了o(╯□╰)o&#xff0c;这绝对不行&#xff01;[○&#xff65;&#xff40;Д&#xff65; ○]所以今天来更新了其实不是我懒得更新或者是太忙&#xff0c;其实是最近在写一篇很长的博客&…

spring之二——使用maven创建一个java project

2019独角兽企业重金招聘Python工程师标准>>> maven的安装及Eclipse maven插件安装这里不再说了&#xff0c;安装可以看这篇博客&#xff1a; http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 需要注意的是&#xff0c;maven在w…

自从装了windows神器,再也不用羡慕mac了

1. 命令行神器 1.1 GOW Gow&#xff08;Gnu On Windows&#xff09;是Cygwin的轻量级替代品。 它使用一个方便的NSIS安装程序&#xff0c;安装超过100个非常有用的开源UNIX应用程序&#xff0c;编译为本机win32二进制文件。 它被设计为尽可能小&#xff0c;大约18 MB&#xff…

第1章 绪论

《数据结构》学习笔记 第1章 绪论 1.1 数据结构的研究内容 计算机计算数值时&#xff0c;一般经过一下步骤&#xff1a; 1.从具体问题抽象出数学模型&#xff08;实质是分析问题&#xff09;。 2.设计一个解次数学模型的算法。 3.编写程序&#xff0c;进行测试、调试&#xf…

C#中泛型约束的具体用法

前言上一篇博文简单介绍了泛型的约束&#xff0c;说是通过where<>来实现具体委托占位符的约束。那么约束又有什么类型和次序呢。这篇文章咱们一起看看。目前共5种类型的约束。类名&#xff1a;只有这个类型的类或从它继承的类才能用作类型实参class&#xff1a;任何引用类…

系统架构:Web应用架构的新趋势 前后端分离的想法

最近研究servlet&#xff0c;看书时候书里讲到了c/s架构到b/s架构的演变&#xff0c;讲servlet的书都很老了&#xff0c;现在的b/s架构已经不是几年前的b/s架构&#xff0c;其实b/s架构就是web应用开发&#xff0c;对于这样的架构我们现在应该考虑的是前端和后端的分离&#xf…

Asp-Net-Core学习笔记:身份认证入门

前言过年前我又来更新了~我就说了最近不是在偷懒吧&#xff0c;其实这段时间还是有积累一些东西的&#xff0c;不过还没去整理……所以只能发以前没写完的一些笔记出来就当做是温习一下啦PS&#xff1a;之前说的红包封面我还没搞&#xff0c;得抓紧时间了最近在准备搞一个我之前…

第1章 大数据挖掘及应用概论

《大数据挖掘及应用》学习笔记。 第1章 大数据挖掘及应用概论 数据挖掘是数据分析的提升。 1.1 大数据智能分析处理的普及和应用 1.1.1 云计算(cloud computing) 云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c;进入可配…

浮点型数据的输出格式

2019独角兽企业重金招聘Python工程师标准>>> float的占位符为f%,默认输出六位小数&#xff0c;如果要限制位数的输出&#xff0c;可以用%.2f这样的格式&#xff0c;double同上。 如果是浮点型转换成整型不会进行四舍五入&#xff0c;浮点型的输出如果截取了位数进行…

linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)

一、介绍基于TCP协议通过socket实现网络编程常用API 1、读者如果不是很熟悉,可以先看我之前写的几篇博客,有socket,地址结构的理解,更加方便读者理解 地址分别是: 1)、http://blog.csdn.net/u011068702/article/details/56479927 2)、http://blog.csdn.net/u01106870…

VS2010下Boost1.55.0配置

为什么80%的码农都做不了架构师&#xff1f;>>> 打开程序菜单&#xff0c;选择Visual Studio Tools里面的 Visual Studio 命令提示。转到解压后的Boost所在目录&#xff0c;输入Bootstrap&#xff0c;执行完毕会生成b2.exe。输入&#xff08;目录下的bjam.exe和b2.…

Linux信号实践(3) --信号内核表示

信号在内核中的表示执行信号的处理动作称为信号递达&#xff08;Delivery&#xff09;&#xff0c;信号从产生到递达之间的状态&#xff0c;称为信号未决&#xff08;Pending&#xff09;。进程可以选择阻塞&#xff08;Block&#xff09;某个信号。被阻塞的信号产生时将保持在…

第2章 数据认知与预处理

《大数据挖掘及应用》学习笔记。 第2章 数据认知与预处理 2.1 数据分析的定义和流程 数据分析(data analysis)是指用适当的统计分析方法对收集来的大量数据进行分析和解释&#xff0c;提取出有用的信息形成结论&#xff0c;从而对数据加以详细研究和概括总结的过程。 2.1.1 如…

9 C++ Boost 多线程,线程同步

线程的创建 boost_thread,boost_system 多线程的创建 线程的参数传递 线程的创建方式 线程的join 加入join,回收线程线程中断 线程中断2, 线程组 boost 线程的死锁 boost 线程递归锁 线程互斥锁,线程同步 unique_lock 锁,离开作用域自动释放 unique_lock 锁 示例 2,可以显式的释…

命令注入_命令注入绕过方式总结

前言命令注入是web中常见的漏洞之一&#xff0c;由于web应用程序未对用户提交的数据做严格的过滤&#xff0c;导致用户输入可以直接被linux或windows系统当成命令执行&#xff0c;一般都会造成严重的危害。常用符号分号(;)多条语句顺序执行时的分割符号。1cmd1;cmd2管道符(|)cm…

集合的结构示意图

转载于:https://blog.51cto.com/8467007/1364724