再谈 dijkstra 算法和最短路径问题

前置文章:
dijkstra 算法为什么高效
有向图的负权值边与建模
求单源最短路径的新方法

前天晚上实现了一个基于 dijkstra 算法的求单源最短路径的新算法,整理了一篇文章。我非常不愿意把一些直观的问题太过于技术化,但多年的职业经历偏偏让一篇好好的文字写着写着就变成技术博客了,非常不适。

我的新算法强调 “只需要一次广度优先遍历”,文章 求单源最短路径的新方法 里的图解释得已经很明白了,但这和 dijkstra 算法有什么关系,为什么说是 “基于 dijkstra 算法的新算法”,基不基于不重要,要点在于,dijkstra 算法本身,它就是一个 “只需要一次广度优先遍历” 就获得结果的算法,不同点在于,dijkstra 算法用 S 到 V_curr 的距离来松弛,而我的方法则是用坐标系把每个节点的松弛结果都展示了出来,松弛的过程通过递归调整后继节点纵坐标来完成,而广度优先恰恰意味着后继节点非常少,在绝大多数情况下,好运常在,O(E) 时间复杂度即可完成。

要点就是广度优先遍历。

我先解释广度优先和深度优先两种遍历方式的不同:
在这里插入图片描述

来看 dijkstra 算法本身,将节点不断加入 closeset 的过程就是广度优先遍历的过程,如果节点不是离散的,而是连续的,这意味着边缩短到无穷小而不再有权重,那么广度优先遍历能确保首先接触到的节点一定是距离最短的节点。广度优先遍历会系统地检查从起点出发的每一步距离,确保它找到的第一个目的地的路径一定是最短的。这是因为它按波次向外扩展,首先检查所有与起始点直接相邻的点,然后检查与这些点相邻的点,以此类推。

通常经理们喜欢讲 “爆炸半径” 这个词,爆炸半径越小,波及面越小,但也是最先被波及到。控制爆炸半径就是尽量让爆炸只影响它直接接触到的第一波接触面,因为爆炸本身就是广度优先遍历,一圈一圈向外,只不过它是并行的。

为了理解距离短一定先接触,可以手工做一张图,节点用绳子打的结模拟,边就是绳子,边的权值就是绳子长度,往外抻这张网直到绳子变紧拉不动了停止,那些拉紧的绳子就是最短路径,在源点放一些蚂蚁,看看蚂蚁先到达哪里。

但对于算法,我们必须理解算法的本质,由于人脑和计算机的秉性,算法是一个流程,一个串行的步骤序列,所以算法无法 “一下子看出谁距离 S 最近”,算法必须通过一系列步骤去比对,而广度优先遍历就是最有效的方式,它非常形象地模拟了 “一圈一圈向外按波次扩展” 的过程。

如果你到了一个陌生的城市,找最近的路,比如找回家最短的路,去商场最短的路,去公园最短的路,不依赖现代导航,纯粹 citywalk 步行找路,是深度优先,一条路见路口就拐,还是广度优先,不同的路都试一下呢?

在实际中,可以将广度优先搜索策略简化为 “始终选择离你最近的未探索路径”,这就是 dijkstra 算法的核心。当你来到一个十字路口,你总是先探索离你最近的未走过的街道,而不是随机选择或深入一条特定的路径。

相比之下,深度优先搜索可能会导致你走过一些不必要的长路,甚至可能会多次经过相同的地方,除非你有很好的记忆或者有某种方式来标记已经探索过的路径。深度优先策略更适合探索迷宫或查找任何可达但不一定最短的路径。

有人认为人脑并不擅长即时地计算和记忆复杂的路径图,所以必须要有个导航,但导航背后大概率还是 dijkstra 算法,使用现代导航工具或询问当地居民通常更实用,但对我而言,幸运的是,我个人非常擅长 citywalk 并寻找计算最短路径,从 4,5 岁直到现在,我一直保持着 citywalk 的习惯,第一次是 4 岁半从安阳市钟楼经过北大街走到北门,绕行解放路走到铁狮口迷路,硬摸回家,最后一次就是今天,嘉定环城河跑步一圈后从东大街走到温宿路拐入博乐路进入州桥,经清河路走到罗宾森,吃了一顿本清素酸菜鱼。

这也许就是我擅长图论图算法的原因吧,实践经历加上一点天赋历练出来的,虽然我不懂那些技术术语,但我能给人直感,直击本质。

浙江温州皮鞋湿,下雨进水不会胖。

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

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

相关文章

C#——静态成员和非静态成员详情

静态成员和非静态成员 调用: 静态属性(static) : 类名.属性名调用 非静态属性(没static) : 1.先创建对象 2.对象.属性 特点: 静态方法里面只能访问静态成员 非经态方法中可以访问所有的属性 static数据成员在类的内部声明,但只能在类的外部定义,…

【软件安装9】OpenCV多版本安装Ubuntu18.04

文章目录 一、查看已安装的Opencv版本二、安装新版本三、多版本OpenCV切换 OpenCV 官网 在此 一、查看已安装的Opencv版本 查看已安装opencv的版本 pkg-config opencv --modversion官网下载对应的版本,并解压 opencv3.4.3 二、安装新版本 进入前置准备里下载…

24年法考报名照片千万别乱拍,否则卡审

法考报名照片每年都有很多被卡审😭 常见的问题是 ①照片比例不对,无法上传,人像比例要求非常严格 ②照片像素错误,不能直接拿大图压缩图片,需要做出413*626像素的法考证件照 ③照片文件偏大,照片要求40-100…

单触控单输出触摸开关芯片PT2052A

1.产品概述 PT2052封装和丝印 PT2052A 是一款单通道触摸检测芯片。该芯片内建稳压电路,提供稳定电压给触摸感应电路使用,同时内部集成高效完善的触摸检测算法,使得芯片具有稳定的触摸检测效果。该芯片专为取代传统按键而设计,具有…

【精品方案】离散型制造行业智能工厂标准解决方案(49页 PPT)

引言:随着科技的不断进步和制造业的转型升级,离散型制造行业正面临着从传统制造向智能制造转型的迫切需求。离散型制造行业涉及的产品种类繁多,生产流程复杂,对生产效率、产品质量和成本控制有着极高的要求。因此,开发…

SQL中的UPDATE语句:别让你的数据“离家出走”

sql的update操作正式环境用的很少,但是在测试环境还是用的挺多的。 想象一下,你正在管理一个学校的数据库,其中有一个students表,记录着每个学生的信息。有一天,你接到通知说某个学生的年龄或成绩需要更新。这时&…

【Java并发编程之美 | 第一篇】并发编程线程基础

文章目录 1.并发编程线程基础1.1什么是线程和进程?1.2线程创建与运行1.2.1继承Thread类1.2.2实现Runnable接口1.2.3实现Callable接口(与线程池搭配使用)1.2.4小结 1.3线程常用方法1.3.1线程等待与通知1.3.2线程睡眠1.3.3让出CPU执行权1.3.4线…

漫步者开放式耳机值得买吗?漫步者、西圣、小米硬核测评pk性能!

说起开放式蓝牙耳机,相信大部分朋友都不会陌生。与传统的封闭式耳机相比,开放式蓝牙耳机不仅提升了佩戴舒适度,还对耳朵有良好的保护效果。特别适合喜欢户外运动和长途旅行的用户。然而,由于市场上产品众多,选择一款高…

用Python向Word文档添加页眉和页脚

用Python向Word文档添加页眉和页脚 添加页眉和页脚效果代码 添加页眉和页脚 在本文中,我们将用python向文档中添加页眉和页脚。 效果 添加前的文档: 添加页眉和页脚后: 代码 from docx import Documentdef add_header_footer(doc_path…

UE4_后期_ben_模糊和锐化滤镜

学习笔记,不喜勿喷,侵权立删,祝愿生活越来越好! 本篇教程主要介绍后期处理的简单模糊和锐化滤镜效果,学习之前首先要回顾下上节课介绍的屏幕扭曲效果: 这是全屏效果,然后又介绍了几种蒙版&#…

MySQL与PostgreSQL关键对比四(关联查询性能)

引言:MySQL单表的数据规模一般建议在百万级别,而PostgreSQL的单表级别一般可以到亿级,如果是MPP版本就会更多。从基础数据建议上,不难看出,MySQL在Join的情况下也就是主要查询的情况下性能和PostgreSQL相差还是很大的。…

Vue35-生命周期小结

一、8个,4对生命周期函数 第一对:数据监测、数据代理,创建之前和创建之后。 注意:不是vm的创建!!! 第二队:beforeMount和mounted 第三队:beforeUpdate和update 第四队…

vue-element-admin后台集成方案

官网:介绍 | vue-element-adminA magical vue adminhttps://panjiachen.github.io/vue-element-admin-site/zh/guide 1.git环境安装配置及简单操作 1.1git环境安装配置 git软件官网:Git - Downloads (git-scm.com)https://git-scm.com/downloads 下载…

印尼slot游戏pwa做Facebook广告代投推广流程

印尼slot游戏pwa做Facebook广告代投推广流程 随着互联网的普及和移动设备的广泛应用,社交媒体平台如Facebook成为了企业和个人进行品牌推广的重要渠道。在印尼的slot游戏行业中,利用PWA(Progressive Web App)技术进行Facebook广告…

第N4周:中文文本分类-Pytorch实现

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制🚀 文章来源:K同学的学习圈子 目录 一、准备工作 1.任务说明 文本分类流程图: 2.加载数据 ​编辑 二、…

conda添加镜像源与channels

文章目录 一、conda下添加国内镜像源(window下)二、pip配置国内镜像源(window下,临时修改)三、conda源的定义 一、conda下添加国内镜像源(window下) 1、为【channels】配置清华镜像通道 直接在…

【Pandas】已完美解决:AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例(结合实战场景)五、注意事项 一、问题背景 在Pandas的早期版本中,ix 是一个方便的索引器,允许用户通过标签和整数位置来索引DataFrame的行和列。然而&a…

Pixi.js学习 (四)鼠标跟随、元素组合与图片位控

目录 一、鼠标移动跟随 1.1 获取鼠标坐标 1.2 鼠标跟随 二、锚点、元素组合 2.1 锚点 2.2 元素组合 三、图片图层 四、实战 例题一:完成合金弹头人物交互 例题二:反恐重击瞄准和弹痕 例题一代码: 例题二代码: 总结 前言 为了提高作…

ADS基础教程20 - 电磁仿真(EM)参数化

EM介绍 一、引言二、参数化设置1.参数定义2.参数赋值3.创建EM模型和符号 四、总结 一、引言 参数化EM仿真,是在Layout环境下创建参数,相当于在原理图中声明变量。 二、参数化设置 1.参数定义 1)在Layout视图,菜单栏中选中EM&g…

大模型出现的不断重复的现象

无论是大语言模型还是多模态模型,都遇到过这个问题,该如何解决呢? 1.调整推理参数 [BUG] 返回重复的内容 Issue #277 QwenLM/Qwen GitHub是否已有关于该错误的issue或讨论? | Is there an existing issue / discussion for this? 我已经搜索过已有的issues和讨论 | I…