再谈 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…

C# 通过Path获取后缀,文件名,目录等

static void Test() {string path "E:\\软件包\\net安装包\\4_NDP472-KB4054531-Web.exe";Console.WriteLine("目录:" Path.GetDirectoryName(path)); //E:\软件包\net安装包Console.WriteLine("后缀:" Path.GetExtension(path)); //.exeCons…

单触控单输出触摸开关芯片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…

DataCap 自定义 File 转换器

DataCap 支持自定义 File 转换器,使用者可以编写自己的文件转换器集成到 DataCap 中。该文档主要讲解如何快速集成一个文件转换器到 DataCap 系统中。 该模块我们主要使用到的是 file 模块内的代码,我们本文使用 json 来做示例。 模块基本配置 新建项目…

从零手写实现 nginx-23-directive IF 条件判断指令

前言 大家好,我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的,可以参考我的另一个项目: 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

UE4_后期_ben_模糊和锐化滤镜

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

java基础语法整理 -----下

java基础语法整理 一、数组二、面向对象三、字符串1.String常见成员方法2.使用小案例用户登录案例遍历字符串案例统计字符次数案例字符串拼接案例手机号屏蔽 四、集合 链接: java基础语法整理 -----上 一、数组 1.从概念谈起 概念:指的是一种容器,可以…

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

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

Vue35-生命周期小结

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

ElasticSearch的桶聚合

桶聚合 在前面几篇博客中介绍的聚合指标是指符合条件的文档字段的聚合,有时还需要根据某些维度进行聚合。例如在搜索酒店时,按照城市、是否满房、标签和创建时间等维度统计酒店的平均价格。这些字段统称为“桶”,在同一维度内有一个或者多个桶。例如城市桶,有“北京”、“天…

input输入框禁止输入小数点方法

使用blur事件&#xff1a; <el-input v-model"number" type"number" placeholder"请输入" blur"numberBlur" /> 第一种&#xff1a; 使用parseInt转为整数&#xff1a; this.number parseInt(this.number);第二种&#xff…

MAC地址详解

一、MAC地址 MAC地址&#xff0c;英文全称为Media Access Control&#xff0c;前面我们就介绍过MAC地址&#xff0c;MAC地址也称为物理地址或者硬件地址&#xff0c;每个网卡都有一个MAC地址&#xff0c;是数据在实际传输过程中所用到的地址。 二、 MAC组成 前面就介绍过&…

vue-element-admin后台集成方案

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