Lobsters | 原文链接 | 2026-09-16 收录

在代数图表示上直接跑 Dijkstra

来源: anekstein.com — 2026-08-22

概述

作者延续前一篇用递归方案操作代数图的文章,这次直接在 alga 的代数表示上做 Dijkstra,而不先展开成邻接表,算法在 O(s log s) 时间内完成,s 是表达式本身的大小。关键在于 alga 的 Connect 构造描述的是一个有向完全二分子图:它自身只需 O(1) 空间、孩子只需 O(n) 空间,与边数 O(n²) 无关,因此表达式本身就是一种图压缩,展开反而会把次二次算法的收益吃掉。他借助 Bannach、Marwitz 与 Tantau 关于切换图(switching graph)的论文,说明 alga 表达式可以归约为 DAG 压缩,再通过复制簇顶点区分上、中、下三层,让搜索能沿父子边回溯以建立可达性与距离。实现上他并不真的构造切换图,而是在惰性生成的搜索前沿上遍历表达式,用一张只与节点数成正比、与边数无关的索引缓存父节点、顶点出现位置与子节点句柄。

核心要点

金句

挑战在于对图的描述做算法,而不是对图本身做算法。
返回 Lobsters 首页