dijkstra 算法为什么高效?

news2025/1/16 2:53:11

最短路径算法中,dijkstra(i,j,k 颇有遍历意味) 算法时间效能很好,而 floyd,bellman-ford 算法则优在处理负权重。但这是为什么?

从算法过程看,dijkstra 算法确定了某点最短路径后,它就不会再因 “松弛” 而变得更短,而别的两个算法则必须遍历完所有可能的 “松弛” 点才能确定。这个解释有点循环因果了,算法导致了高效,而高效的是算法。可这背后蕴含着什么大道理?

dijkstra 算法展示的是一个 “自然界自然发生的自然过程”,是一个熵增过程。不提 “贪婪策略” 这种名词,看几个自然过程来理解,河水泛滥或农村浇地过程,爆炸过程都可以展现 dijkstra 算法的执行。世间万物,如果任其自然发展而不管,这些个过程其实都是 dijkstra 算法过程的体现。

客观上,每个节点距离源 S 可能不止一条路径,但肯定都有至少一条最短路径,设这些最短路径为 Di,Dj,Dk,Ds,Dt,Dr,Da,… 中肯定有一个从小到大的序,即它们也能排序,dijkstra 算法就是依次寻找每个节点距离源 S 最短距离中最小那个的过程。

以爆炸距离,若一群节点分布在爆炸源周围,按照自然界最小作用量这种第一性原理,最先被波及的一定是距离爆炸源最短的,其次被波及的一定是次短的,以此类推。

把一张有向图按照节点和距离编码在一个二维坐标系里就一目了然了,反着看,从 dijkstra 的结果反推它的过程,这将是一个与 dijkstra 算法不同,但殊途同归的过程:
在这里插入图片描述

极坐标更适合编码 dijkstra 图,用不同半径的同心圆环表示距离,而不同夹角表示不同节点,最后从圆心往外爆,这才更像自然爆炸的过程。考虑到这种图不太容易画,用上面的平面直角坐标系替代了,道理一样。

dijkstra 算法高效的原因就在于它在执行过程中考虑到了这个 “每个节点最短路径亦有大小之分” 的自然序,dijkstra 算法求的就是 “每个节点最短路径的最小值”,在这个过程中自然也就排除了那些 “每个节点的非最短路径”,因为它们没有比较的资格。如果不考虑自然序,就只能硬比对,遍历所有可能的松弛空间,静待松弛不变后停止算法,而这就是 floyd,bellman-ford 等算法的过程。

floyd,bellman-ford 算法是个人为的过程,而不是自然的过程。floyd 算法的技巧在于如何高效折腾二维邻接矩阵,而 bellman-ford 算法的技巧则在于邻居交互的过程,何时交互,以及交互什么,所以人为过程是个熵减过程,虽然费劲,但也能处理非自然逻辑,比如负权重。

对于负权重的理解,如果它仅仅是一个度量,那可以统一加一个比最大负权重小 1 的数字的绝对值,就可以使用 dijkstra 算法,但事情没有这么简单,负权重并非只是一个度量,本文暂不谈,有空专门说下 bellman-ford 这种人为的熵减算法。

流体沿着最短路径,最先到达哪个就是哪个,这是 dijkstra 算法,而经理办公桌上有一堆报表,让工人拟合一份最佳收支方案,工人用图论建模,就要使用 floyd,bellman-ford 算法。

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

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

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

相关文章

单目标应用:基于红嘴蓝鹊优化器RBMO的微电网优化(MATLAB代码)

一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、红嘴蓝鹊优化器求解微电网 2.1算法简介 红嘴蓝鹊优化器(R…

Sharding-JDBC 使用 Nacos 作为配置中心 【下 代码实战】

Sharding-JDBC 使用 Nacos 作为配置中心 【下 代码实战】 1. 实现 ShardingSphereDriverURLProvider 由上一篇博文我们已经知道了 Sharding-JDBC 是基于 Java SPI 机制去加载 并实例化 ShardingSphereDriverURLProvider 的实现类 public interface ShardingSphereDriverURLP…

3个月搞定计算机二级C语言!高效刷题系列进行中

文章目录 前言备考计算机二级C语言为什么考二级C语言?刷题总结后发布系列文章后记免责声明 前言 大家好,我是梁国庆。 计算机二级应该是每一位大学生的必修课,相信很多同学的大学flag中都会有它的身影。 我在大学里也不止一次的想要考计算…

如何下载iSlide软件及详细安装步骤

iSlide插件是一款能够支持PPT和WPS的ppt插件,旨在让每一个人都能够轻松制作出精美的ppt,能够在职场收到更多的关注,而该软件的口号正是「让 PPT 设计简单起来」,该插件是由原来NT插件升级改良过来的,在功能上面进行了全…

代码随想录算法训练营第51天:股票2

代码随想录算法训练营第51天:股票2 ‍ 123.买卖股票的最佳时机III 力扣题目链接(opens new window) 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&a…

01 Pytorch 基础

1.数据处理 1.取一个数据,以及计算大小 (剩下的工作,取batch,pytorch会自动做好了) 2.模型相关 如何得到结果 3.模型训练/模型验证: 代码剖析 1.配置文件yaml (字典) #参数配置config {"train_path"…

centos7.6使用飞鱼FlyFish的docker镜像

参考教程: 飞鱼的docker镜像使用教程: doc/FlyFish_docker镜像使用指南.md 云智慧/FlyFish - Gitee.com centos的docker安装教程: CentOS下 Docker、Docker Compose 的安装教程_centos安装docker-compose_centos 安装docker-compose-CSDN…

ER实体关系图与数据库模型图绘制

属性分析 1、用户表(user)、用户钱包表(user_wallet)(与user是1对1关系)、用户钱包交易日志表(user_wallet_log)(与user是1对多关系)。 user:用户表通常包含用户的基本信息,例如用户ID(主键)、用户名、密码(通常加密…

C++ 12 之 指针引用

c12指针引用.cpp #include <iostream>using namespace std;struct students12 {int age; };int main() {students12 stu;students12* p &stu; // 结构体指针students12* &pp p; // 结构体指针起别名pp->age 20;// (*pp).age 22;cout << "…

C++并发之锁(std::lock_guard,std::unique_lock)

目录 1 概述2 使用实例3 接口使用3.1 lock_guard3.2 adopt_lock3.3 defer_lock3.4 try_to_lock3.5 try_lock3.6 release3.7 lock3.8 call_one1 概述 锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。   在构造时,互斥对象被调用线程锁定,在析构时,互斥被解…

STM32的FreeRtos的学习

首先就是去官网下载一个源文件&#xff1a;FreeRtos官网 下载下来的是一个zip文件&#xff0c;解压缩了。 然后再工程文件夹中创建个文件夹&#xff1a; 在这个文件夹中创建3个文件夹&#xff1a; 然后开始把下载下来的文件夹中的文件挑选出来放到我们的工程文件夹中&#xff1…

uniapp中u-input点击事件失效

当给u-input设置了disabled/readonly属性后&#xff0c;pc浏览器中点击事件失效&#xff0c;但是app/移动端h5中却仍有效 解决办法 给外边包上一个盒子设置点击事件&#xff0c;给input加上css属性&#xff1a;pointer-events&#xff1a;none pointer-events CSS 属性指定在什…

【APP移动端自动化测试】第二节.Appium介绍和常用命令代码实现

文章目录 前言一、Appium介绍和安装二、python代码功能实现 2.1 hello appium 参数详解 2.2 在脚本内启动其他app 2.3 获取app的包名和界面名 2.4 关闭app和驱动对象 2.5 安装和卸载以及是否安装app 2.6 将应用置于后台总结 前言 一、Appium介绍…

[AI资讯·0612] AI测试高考物理题,最高准确率100%,OpenAI与苹果合作,将ChatGPT融入系统中,大模型在物理领域应用潜力显现

AI资讯 国产AI大战高考物理&#xff0c;第1题全对&#xff0c;第2题开始放飞终于放大招了&#xff0c;2024WWDC&#xff0c;苹果开启AI反击战苹果一夜重塑iPhone&#xff01;GPT-4o加持Siri&#xff0c;AI深入所有APPOpenAI确认苹果集成ChatGPT 还任命了两位新高管GPT-4搞不定…

GUI编程(Python)

本章&#xff0c;我们将学习GuI (Graphics User Interface) ,即图形用户界面编程&#xff0c;我们可以通过python提供的丰富的组件&#xff0c;快速的实现使用图形界面和用户交互. GUI编程类似于“搭积木”&#xff0c;将一个个组件(Widget)放到窗口中&#xff0e;如下是 windo…

windows环境下配置git环境变量

路由当前目录 vim 打开 .bash_profile PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.4.3nts PATH$PATH:/d/phpstudy_pro/Extensions/php8/php8.2.9nts PATH$PATH:/d/phpstudy_pro/Extensions/composer2.5.8 …

大数据概论总结

三次信息化浪潮 : 信息技术的支撑 : 存储设备容量不断增加 CPU的处理能力不断提高 网络带宽不断增加 数据产生方式的变革促成大数据时代的来临 运营式系统阶段用户原创内容感知式系统阶段 大数据发展历程 : 分为三个阶段 : 大数据的概念 : 1 . 数据量大 : 根据IDC作出…

再也不用担心流量超过上限了!Windows 11中监控数据使用情况的几种方法

序言 如果你使用按流量计费的连接或担心超过数据上限,在Windows上监控你的数据使用情况可能是有益的。这允许你调整你的使用模式,以确保你有效地使用数据。方法如下。 使用任务管理器密切关注数据使用情况 在任务管理器中,你可以实时监控计算机上的应用程序使用的数据量。…

Prisma数据库ORM框架学习

初始化项目 中文网站 点击快速开始,点击创建sql项目,后面一步一步往后走 这个博主也挺全的,推荐下 可以看这个页面初始化项目跟我下面是一样的,这里用得是ts,我下面是js,不需要额外的配置了 1.vscode打开一个空文件夹 2.npm init -y 初始化package.json 3.安装相关依赖 …

判断环形链表-链表题

141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool hasCycle(ListNode *head) {ListNode* slow head;ListNode* fast head;while(fast ! NULL &&fast->next ! NULL){fast fast->next->next;slow slow->next;if(fast…