《超越经典:清华团队40年后再破Dijkstra算法极限,荣获STOC最佳论文》

清华段然团队突破Dijkstra算法近40年极限,发现更快单源最短路径算法,斩获STOC最佳论文奖。打破了传统排序瓶颈,算法效率大幅提升。

原文标题:40年后,Dijkstra算法极限再被突破,清华段然团队更快最短路径算法摘STOC最佳论文

原文作者:机器之心

冷月清谈:

每次打开导航软件,其背后的最短路径算法都是关键。传统上,Dijkstra算法是解决单源最短路径(SSSP)问题的经典方案,广泛应用于网络路由、地图导航等领域。然而,该算法在处理过程中,需要不断选择最短路径并更新下一段路径,特别是会进行多次对比排序,导致其在稀疏图上的时间复杂度存在O(m + nlogn)的“排序瓶颈”,这在理论上被认为是其极限。FOCS 2024的一项研究甚至证明,如果任务定义为必须输出按距离排序的顶点序列,那么Dijkstra在排序意义上是普适最优的。清华交叉信息研究院段然团队(与毛啸合作)的一项重磅研究,成功打破了这一近40年的理论极限,并因此荣获理论计算机国际顶级会议STOC 2025最佳论文奖。他们提出了一种在具有实数非负边权的有向图上的确定性单源最短路径算法,其时间复杂度为O(mlog^(2/3)n),显著优于传统的Dijkstra算法。新算法的核心思想是避免了传统Dijkstra算法中每次都需要排序的步骤,转而更专注于距离的计算。它通过分层递归的方式对图中的节点进行分组处理,并且只对关键节点进行细致的最短路径计算。该算法巧妙地融合了Dijkstra的扩展方式与Bellman-Ford算法在特定场景下无需排序即可发现关键节点的特性,通过缩小“前沿集合”规模、识别“枢纽点”以及高效处理“有界多源最短路径(BMSSP)”子问题,成功绕过了“排序瓶颈”,大幅降低了计算复杂度。这项突破性成果是首个在有向图上打破Dijkstra O(m + n log n)时间界限的确定性算法,意味着Dijkstra在不要求输出排序顶点顺序的情况下,已不再是SSSP问题的最佳选择。

怜星夜思:

1、文章说新算法更快,那对于我们每天用的地图导航,这个速度提升能带来多大的实际感受呢?比如打开导航或者重新规划路线的时候,是能明显感觉快了,还是只是理论上的提升?
2、论文提到了另一个FOCS 2024的最佳论文说Dijkstra在排序意义上是普适最优的,而清华的这个新算法是为了避免排序才突破的。这两种“最优”是不是有点矛盾?在实际应用中,我们应该怎么根据需求选择算法呢?
3、新算法是在“比较加法模型”下实现的突破。如果图的边权变得非常复杂,比如涉及乘法、指数运算,或者边权是动态变化的,那这个新算法还能保持它的优势吗?或者说,这种突破在其他复杂场景下会遇到什么挑战?

原文内容

机器之心报道

机器之心编辑部


每次打开导航的,导航软件在一秒内给出一个最速路线的时候,你有没有好奇过它是怎么找到这条路的?


假如不考虑堵车、红绿灯等交通影响因素,仅找到一条最短最快的路线,那不论如何也逃不掉 Dijkstra 算法。


按照传统的 Dijkstra 算法,你将在整段路程中停下多次,寻找每一段的最短路径,然后再去更新下一段如何最短,直到走到目的地。在抉择的过程中会面临着不断选择「最短」路径的情形,还需要通过对比排序来决策。



Dijkstra 算法有多经典呢? 


可以说每一个学计算机的学生,甚至每一个学编程理论或数据结构的人,都会在教科书上看到这个算法。


其在计算机学生心中地位甚至不亚于物理学中的基本定律,想到路径最短,必然想到 Dijkstra。


不过,现在有种方法能直接让你跳过不必要的排序,只专注于最重要的点之间的最短距离,大大缩短了所需要的计算时间。这就是清华交叉信息研究院段然团队一项重磅研究给出的全新解法。这项研究还在理论计算机国际顶级会议 STOC 2025 上获得最佳论文奖。


该算法改进了图灵奖得主 Robert Tarjan 等人在 1984 年提出的 O(m + nlogn)算法,后者将 Dijkstra 最短路径算法逼近了理论极限,但并没有完全消除排序的复杂度影响。



  • 论文标题:Breaking the Sorting Barrier for Directed Single-Source Shortest

  • 论文链接:https://www.alphaxiv.org/abs/2504.17033


我们先一起回顾一下 Dijkstra 算法。这个最著名的最短路径算法,由荷兰计算机科学家艾兹赫尔・戴克斯特拉于 1956 年提出。 自此,它成为了计算机科学领域的经典,广泛应用于网络路由、地图导航等各个领域。 Dijkstra 算法的目标是找到从一个源点到图中所有其他节点的最短路径。它的基本思路是通过不断选择当前最短的节点,并更新与之相邻的节点的距离,直到所有节点的最短路径都被找到。 


去年这个经典算法达到了前所未有的新高度。这篇 FOCS 2024 的最佳论文证明:若我们把任务定义为距离排序问题,在合适的堆结构下,Dijkstra 在排序意义上是普适最优的;也就是说,一旦强制输出排序,就别指望整体复杂度再降了。



  • 论文标题: Universal Optimality of Dijkstra via Beyond-Worst-Case Heaps

  • 论文链接:https://arxiv.org/pdf/2311.11793


本次 STOC 最佳论文与之形成互补:避免排序→突破运行时间。他们关注距离的计算,而不关心顶点的具体顺序。它通过分层递归的方式,对图中的节点进行分组处理,并且只对关键节点进行细致的最短路径计算。这样的设计避免了传统 Dijkstra 算法中每次都需要排序的步骤,从而大幅度降低了计算的复杂度。


这个想法早在 2023 年就已经有了雏形。毛啸在加利福尼亚的一次会议上听到了段然关于无向图算法的演讲,双方因此展开了对话。毛啸一直仰慕段然的工作,第一次与他面对面交流时激动不已。 


会后,毛啸开始在空闲时间思考这一算法,而段然的团队则在尝试将已有的算法扩展到有向图领域。受 Bellman-Ford 算法启发,尽管这个算法比 Dijkstra 算法慢得多段然团队通过将其分步执行来避免慢速问题,并利用它提前发现关键节点。


2024 年 3 月,毛啸提出了一种无需随机性的解决方案,随后加入段然团队。他们经过几个月的合作,结合彼此的想法,并借用段然 2018 年提出的突破性技巧,最终设计出一种新算法。该算法通过分层方式,像 Dijkstra 一样从源点扩展,但利用 Bellman-Ford 算法识别关键节点,避免了排序瓶颈,比 Dijkstra 更高效。


他们是怎么做到的


在这项研究中,团队给出了一种在具有实数非负边权的有向图上的单源最短路径(SSSP)的确定性 O (mlog2/3⁡n) 时间算法,在比较加法模型中。这是首次打破 Dijkstra 算法在稀疏图上的 O (m+nlog⁡n) 时间界限的结果,表明 Dijkstra 算法不是 SSSP 的最佳选择。


经典的 Dijkstra 算法 Dij(59),结合 Fibonacci 堆 FT(87)或松弛堆 DGST(88)等高级数据结构,可以在 O (m + n log n) 时间内求解单源最短路径(SSSP)问题。该算法在比较 - 加法模型(comparison-addition model)下工作,这种模型适用于实数权重的输入,限制算法只能对边权进行比较和加法运算,并且每个操作的耗时为单位时间。


对于无向图,Pettie 和 Ramachandran(PR,2005)提出了一种基于层次结构的算法,在比较 - 加法模型下可在 image.png 时间内运行,其中 α 为反 Ackermann 函数,r 为任意两条边权之比的上界。


Dijkstra 算法还会在求解过程中额外生成按源点距离排序的顶点序列。最新研究表明,如果要求算法输出按距离排序的顶点顺序,那么 Dijkstra 算法是最优的。若只需输出顶点距离而不要求顺序,段然、毛啸团队曾提出了一种适用于无向图的随机化 SSSP 算法,其时间复杂度为 image.png,在稀疏图中优于 O (n log n) 的结果。然而,对于有向图,这类排序瓶颈依然没有被突破。


定理 


存在一种确定性算法,可以在 

时间内求解具有实数非负边权的有向图单源最短路径问题。


研究的结果也是第一个在无向图情形下打破 O (m + n log n) 时间界的确定性算法。


技术概述


总的来说,解决单源最短路径问题有两种传统算法:


  • Dijkstra 算法:通过优先队列,每次提取距离源点最近的顶点 u,并从该顶点松弛其所有出边。该方法通常会根据顶点到源点的距离进行排序,因此时间复杂度至少为 Θ(n log n)。

  • Bellman-Ford 算法:基于动态规划思想,多次松弛所有边。若要求解最多包含 k 条边的最短路径,Bellman-Ford 算法无需排序即可在 O (mk) 时间内完成。


段然团队的方法结合了这两种思路,并采用递归划分技术,这种技术类似于瓶颈路径算法。


在 Dijkstra 算法执行过程中的任意时刻,优先队列(堆)都会维护一个前沿(frontier)集合 S,其中包含一些顶点。


如果某个顶点 u 是未完成的(即当前的距离估计 d̂[u] 仍大于真实距离 d (u)),那么从源点 s 到 u 的最短路径必须经过某个已完成的顶点 v∈S。在这种情况下,我们称 u 依赖于 S 中的某个顶点 v。不过集合 S 中的顶点并不保证全部都是已完成的。


Dijkstra 算法会选择 S 中距离源点最近的顶点(它必定是已完成的),然后松弛从该顶点出发的所有边。


运行时间的瓶颈在于:有时前沿集合可能包含 Θ(n) 个顶点。由于需要不断选出距离源点最近的顶点,这意味着必须维护这些顶点的全局有序性,因此无法突破 Ω(n log n) 的排序下界。


核心思想是缩小前沿集合的规模。假设我们只想计算距离小于某个上界 B 的所有顶点的最短路径。令 Ũ  表示所有满足 d (u) < B 且从 s 到 u 的最短路径会经过集合 S 中某个顶点的顶点集合。


可以将前沿的大小 |S| 控制在 

,也就是「感兴趣的顶点数」的 倍。


设参数 

,有两种情况:


1. 如果 |Ũ| > k・|S|,那么前沿大小已经是 |Ũ| /k;


2. 否则,若 |Ũ| ≤ k・|S|,则从 S 中的顶点运行 Bellman-Ford 步骤 k 次,所有最短路径中包含少于 k 个 Ũ 顶点的 u∈Ũ 都会被标记为完成状态。否则,若 u 所依赖的 S 中顶点 v 的最短路径树(SPT)中含有不少于 k 个 Ũ 顶点,那么可以将前沿 S 缩减为这些 “枢纽点(pivot)”,且这样的枢纽点数量最多为 |Ũ| /k。


算法基于以上思想,但与传统 Dijkstra 类似的动态前沿方式不同,研究团队采用分治(divide-and-conquer)方案:算法分为 log n /t 层,每层包含一组前沿顶点和一个上界 B。在朴素实现中,每个前沿顶点都需要花费 Θ(t) 时间处理,因此整体仍是每个顶点 Θ(log n) 的开销。


通过在每一层应用前沿缩减策略,我们只需对这些枢纽点(约为前沿顶点的

执行 Θ(t) 操作。这样,每个顶点的处理时间就降低为 image.png,实现显著加速。


算法


该团队研究的是常数度图中从源点 s 出发的单源最短路径问题,且 m = O (n)。在算法中,他们设两个参数:image.pngimage.png


他们的核心思想是基于顶点集的分治。我们希望将一个顶点集 U 划分为 2^t 个大小相近的部分:image.png


其中越靠前的子集中的顶点距离越小,然后递归地继续划分每个 U_i。这样,经过大约 (log n) /t 层递归后,子问题规模将缩小到单个顶点。


为了动态构造这种结构,他们每次尝试计算一批最接近的顶点的距离(不必完全恢复它们的精确距离顺序),并给出一个边界值,表示实际推进了多少。


假设在算法的某个阶段,对于所有 d (u) < b 的顶点 u,它们都已完成,并且团队已经松弛了从它们出发的所有边。此时他们想要找到所有 d (v) ≥ b 顶点的真实距离。


为了避免优先队列中每个顶点 Θ(log n) 的时间开销,他们考虑一个前沿集 S,其中包含所有当前满足 b ≤ d^(v) < B 的顶点(这里 B 是某个上界,并且不对它们进行排序)。可以发现,对于任意未完成顶点 v’ 且 b ≤ d (v’) < B,它的最短路径一定会经过某个已完成的顶点 u ∈ S。


因此,要计算所有 b ≤ d (v’) < B 顶点的真实距离,只需找到从 S 中的顶点出发、距离受限于 B 的最短路径。他们将这个子问题称为有界多源最短路径(Bounded Multi-Source Shortest Path,BMSSP),并为其设计了一个高效算法。


算法 1 查找关键枢纽点


算法 2 BMSSP 的基本情形


算法 3  有界多源最短路径


更多引理及证明、算法细节以及观察结论请参照原论文。


参考链接:

https://www.quantamagazine.org/new-method-is-the-fastest-way-to-find-the-best-routes-20250806/



© THE END 

转载请联系本公众号获得授权

投稿或寻求报道:liyazhou@jiqizhixin.com


嗯……如果能感觉到,那说明以前的Dijkstra慢得有点过分了!:joy: 我觉得吧,这就像你手机从iPhone 14升级到15,宣传说性能提升了N%,你平时刷刷抖音、聊聊微信,你能感受到那百分之N的提升吗?估计也很难。但对于背后那些忙碌的服务器小哥来说,这可是实打实的“减负”,意味着他们可以少加点班,多喝几杯咖啡了!

“比较加法模型”是理论计算机科学中常见的抽象模型,它假设算法只能对边权进行比较和加法运算,且每一步操作的耗时为单位时间。这种模型简化了分析,但也限制了算法的适用范围。如果边权涉及乘法、指数或其他非加法操作,传统Dijkstra和Bellman-Ford算法都需要进行根本性的改造,因为它们的核心是基于边权的累加和比较来确定最短路径。在这种情况下,新算法所依赖的“分层递归”和“缩小前沿”等技巧,其效率优势可能不复存在或大打折扣,甚至可能需要引入新的计算模型或复杂度分析。至于动态变化的边权(如实时交通流量、网络拥堵),则需要动态图算法来处理,即图的结构或边权在计算过程中实时变化。虽然一些动态最短路径算法已经存在,但将此新算法的确定性高效特性扩展到动态场景,会是另一个巨大的研究挑战,可能需要结合快速更新数据结构和增量计算技术。

从理论复杂度来看,O(mlog^(2/3)n)相对O(m+nlogn)是一个显著的进步,尤其在处理节点和边数量庞大的大规模图时,累计的计算时间节省会非常可观。对于地图导航这种应用,用户的实时感知可能不会特别强烈,因为现代导航系统已经高度优化,例如通过预计算常见路径、利用分布式计算、以及对图进行分层处理等。然而,在后台服务器层面,这种效率提升能让系统在短时间内处理更多的路径规划请求,降低服务器负载,甚至能在更复杂的场景(比如多目的地规划、实时交通更新下的路径重规划)中提供更快的响应,这间接优化了用户体验,并为未来更复杂的功能(如智能交通管理、物流优化)打下了基础。

哎呀,这不就是:“一个说我跑得最快,因为我同时还要把跑鞋按尺码排好队!”;另一个说:“我跑得最快,因为我压根不管跑鞋的尺码,直接光脚冲!”。哈哈,其实他俩都没错,就是比的东西不一样嘛!一个是在特定条件下(必须排序)的最优,另一个是不受那个条件限制下的最优。所以选哪个?看你的活儿是什么呗。如果你的APP需要显示“离你最近的100个充电桩,并按距离从近到远排好”,那Dijkstra可能还是首选。但如果你的APP只要告诉我“到单位到底要多远”,那新算法肯定跑得更快!

哈哈,我觉得普通用户大概率是感觉不到的。你想啊,你打开导航,它现在基本也是秒出路线啊。除非你是那种每次出门都要跑几百上千公里横跨N个省份的“深度游”玩家,或者你家刚好在那种像蜘蛛网一样密集复杂的超级城市核心区,那可能理论上的毫秒级优化才能被你“感知”到。更多时候,我们觉得导航慢,可能跟手机性能、网络信号、或者实时路况更新的延迟关系更大,跟算法本身的速度关系没那么大。

这两种“最优”并不矛盾,而是针对不同问题定义下的“最佳性能”。FOCS 2024的论文指出的是,如果你的任务目标是不仅要计算出最短距离,还要输出这些顶点按距离排列的顺序,那么Dijkstra算法在这一特定约束下是无法被超越的。而清华团队的新算法,其突破点在于它放弃了强制要求输出有序顶点集合这一约束,仅仅关注如何最快地计算出从源点到其他所有节点的最短距离值。因此,算法的选择应严格依据应用的具体需求:如果你的后续处理步骤确实需要一个按距离有序的顶点序列(例如,进行层级遍历、扩散分析),那么Dijkstra及其变体依然是稳健且高效的选择;但如果你的核心需求仅仅是知道最短距离是多少,且对输出顺序没有要求(例如,多数导航应用只关心终点距离和中间路线),那么清华团队提出的这种更快的算法无疑更具优势。

这有点像“我最快,但我只在穿西装的时候最快”和“我最快,但我穿什么都无所谓”的区别。Dijkstra的“最优”是带条件的,它要求你保持“绅士风度”(排序),才能展现它的极致。新算法则是“野路子”高手,为了效率直接把那些“繁文缛节”给抛弃了。所以,如果你的老板(或者说你的产品经理)只关心结果不关心过程,那新算法就是YYDS!但如果他非要你把过程也整得明明白白,那Dijkstra还是有它的市场。

你想想,Dijkstra家族的算法,包括这个新突破的,就好比是学霸只擅长解线性的数学题。你突然给他来一道带微积分、带傅里叶变换的超纲题,他可能就得傻眼了。这个新算法的优势,在于它在“加法和比较”这个舒适区里做到了极致。但如果边权变成“打个电话加个好友才能过”,或者“走这条路边走边跳踢踏舞”,那这些非传统的“代价”可能就不是简单的加法能处理的了。它恐怕就得去找个量子物理学或者心理学的老师来帮忙了,哈哈哈。

嗯,这就像说这个新算法在“只有加法和比大小”的游戏里是无敌的。但要是游戏里突然加了乘法、除法、开方啥的,那它可能也要懵圈。毕竟它优化的是“加法”层面的计算。对于边权复杂的图,算法可能得先花大力气把这些复杂边权转换成某种可以在比较加法模型下处理的“等效距离”,或者干脆就得换一套完全不同的算法体系了。至于动态的边权,比如现实交通,那更是个大坑,得实时更新路况,每次都重新算,那速度再快也扛不住疯狂变化吧。