首页 > 其他分享 >求单源最短路径的新方法

求单源最短路径的新方法

时间:2024-06-16 20:31:24浏览次数:12  
标签:struct 纵坐标 路径 list 单源 算法 方法 节点

参见:dijkstra 算法为什么高效

本来不想谈算法,本来只想了一下 dijkstra 算法背后的形而上,但还是归纳出一个仅靠一次广度优先遍历就能获得单源最短路径的新算法,框图里是算法流程,流程下是一个例子:
在这里插入图片描述

它不单单可在广度优先遍历时间复杂度求解最短路径,还能在支付额外的 insert 时间后求出所有第 2 短,第 3 短,第 4 第 5 第 n 短路径,非常高尚。

啊哈,真的有这么简单吗,我的感觉怪怪的,总觉得哪里少了一步,O(n^2) 基础时间复杂度是少不了的,因为至少要比较两个维度,剩下的优化另说,至多收到 log。确实,这段是我后来增加的,外出散步时想到了问题点。

注意上图,S–A 在被 S–F–A 接管后,纵坐标下移了三层,图虽然画对了,但在算法步骤里并没有标识清楚这三层下降带来的附加操作:

新的最短路径节点接管老最短路径节点的所有孩子节点,并带来这些孩子节点纵坐标下降三层,以此递归操作,如果孩子节点有不同的父节点,则保留原父结点指向,分裂孩子节点下降三层。

这下就补上了遗漏的时间复杂度,但为什么是广度优先遍历,就是为了让递归不至于过深,事实上递归操作并非标称的时间复杂度,而大概率只有一到两次。换句话说,孩子节点将只从纵坐标最低处生出,广度优先遍历可让在递归孩子节点时,孩子代数不会过深,这就是这个算法的妙处。

补充图示如下(上图视作有错误的第一版,废弃):
在这里插入图片描述

它来自于我惯常的横竖一颠倒的方法论,标准 dijkstra 算法的 “贪心” 体现在 V_c 纵坐标的冒泡,而 “松弛” 则体现在 V_c 纵坐标的求解。这算法没有任何松弛比较,而是无条件求出 V_c 纵坐标并将它标识在坐标系,这又体现了我惯常的数形结合方法论,坐标系里肉眼可见,无需任何奇技淫巧。

可能的数据结构如下:

struct node {
    // 保存指向该节点的 node list
    struct list_head from;
    // 保存该节点指向的 node list,便于广度优先遍历
    struct list_head to;
    // 保存该节点第 1 短,第 2 短,... 的 path list
    struct list_head path;
    uint curr_lowest_w;
    uint index;
 };
    
struct edge {
    struct node from;
    struct node to;
    uint weight;
}; 

struct path {
    struct list_head nodes;
};

那为什么 dijkstra 算法和我上述的算法都无法处理负权重边?

昨天的文字中提到,dijkstra 算法模拟的是 “自然发生的过程”,背后是第一性原理,负权重边恰恰是 “不可能自然发生的”。以爆炸为例,当冲击波接触到某处,冲击波袭来的路径一定最短,若希望冲击波以某种方式先接触到它处再拐回的速度更快,除非时间倒流,在自然尺度下这不可能发生,再以河水泛滥为例,洪水淹过某地,洪水经过的路径一定最短,若要洪水经过别处再拐回的路径更短,除非水往高处流,在自然重力下,这不可能发生。

本文到此为止,为日后检索不至于主体不明确而乱掉,不将不同主题放入一篇文字,另起一篇单独做一个携带负权重边的有向图建模,展示一下非自然的熵减过程如何产生负权重边。

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

标签:struct,纵坐标,路径,list,单源,算法,方法,节点
From: https://blog.csdn.net/dog250/article/details/139661397

相关文章

  • 设计模式-模板方法模式
    模板方法模式模板方法模式(TemplateMethodPattern),又叫模板模式,是指定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的默写特定步骤,属于行为型设计模式。模板方法的本质是抽象封装流程,该流程由几个步骤组成,具体步骤可......
  • 同盾中文点选验证码识别方法
    中文验证码一直是识别的难题,首先他分类的种类很多,常见中文都有3500个,而且一般中文验证码都会有变形,导致每一个文字都需要大量训练样本。假设每一个汉字样本需要100个,100×3500=35万个样本,所以标记的样本数量巨大,训练周期长,成本高。而且通常需要点选的文字数量很多,需要同时全......
  • Day27.属性查找与绑定方法
    1.属性查找与绑定方法_类和类下的对象访问数据属性 类和类下的对象访问数据属性代码如下:classStudent:#1.变量的定义stu_school='oldboy'#记录类下实例化次数count=0#空对象,'egon',18,'male'def__init__(self,x,y,z):......
  • Windows系统上安装部署苹果系统(Mac OS)的几种方法
    /*MacOS苹果系统,正常情况下,只能安装到苹果公司自己出品的Mac电脑,俗称白苹果,不能安装到各种组装机或者其他品牌的品牌机上,黑苹果的的原理,就是通过一些“破解补丁”工具欺骗macOS系统,让苹果系统认为你的电脑其实是一台苹果电脑,从而可以安装运行。*/1.购买苹果笔记本或苹果一......
  • Android 使用绑定式调用service中的方法
    在Android中,Service有两种启动方式:startService()和bindService()。startService()启动Service时,Service会被创建并且调用onCreate()和onStartcommand()方法。Service会一直保持运行状态,直到调用stopService()或者stopSelf()方法。bindService()启动Service时,Service会被创建......
  • 学习笔记:快速成长的几点方法
    分享一篇学习笔记,聊聊普通人快速成长的方法。 1、能力复制如何理解能力?举个日常工作中常见的例子:PPT。无论是转正述职晋升或者项目成果汇报,大多都会以PPT作为载体。很多同学说自己会写PPT,结果PPT的内容即没有很清晰的结构,阐述的内容也不具备自洽的逻辑,他们只是找了一个PPT模......
  • 最新2024FL Studio21中文激活注册码获取方法步骤教程!
    在音乐创作领域,FLStudio21无疑是一款强大的工具。然而,对于许多初学者来说,如何正确注册和激活FLStudio21成了一个难题。今天,我们就来为大家详细解答这个问题。我们需要在FLStudio21的官方网站上购买正版软件。在购买过程中,请确保选择与您操作系统相匹配的版本。购买完成后,......
  • Vim 的基本使用方法
    Vim是一款功能强大的文本编辑器,但它对于新用户来说可能有些陌生。以下是一些Vim的基本使用方法:1.启动Vim:打开终端并输入`vim`命令,按下Enter键即可启动Vim。2.进入编辑模式:在Vim中,默认是处于命令模式(Commandmode)的。要进入编辑模式(Insertmode),按下`i`键。......
  • 根据项目用例图用例点估算项目工时的方法
    一共通过6个步骤:计算未调整的角色权值UAW计算未调整的用例权值UUCW计算未调整的用例点UUCP计算技术(TCF)和环境因子(ECF)->TEF计算调整的用例点UCP计算工作量(man-hours)多少人多少工时(人天)6步骤之一UAV计算Actor角色权值定义:序号复杂度级别复杂度标......
  • 是否可以从一个static方法内部发出对非static方法的调用
    不可以直接从一个static方法内部发出对非static(即实例)方法的调用。static方法属于类本身,而非static方法则属于类的实例(对象)。由于static方法不依赖于类的任何特定实例,因此它不能直接访问非static方法或实例变量,因为这些方法和变量都需要类的实例来调用或访问。但是,有几种方法......