具有线性平均时间的简单最短路径算法
1. 算法描述与正确性
本算法基于 Dijkstra 算法的多级桶实现,但使用引理 1 来检测和扫描具有精确(但不一定是最小)距离标签的顶点,它是一种标签算法。
在初始化时,算法会为每个顶点 $v$ 计算 $c(v)$。算法将已标记的顶点存放在两个位置之一:集合 $F$ 和优先队列 $B$。集合 $F$ 采用如双向链表的方式实现,以支持常数时间的添加和删除操作;优先队列 $B$ 则使用多级桶结构实现,支持插入、删除、减小键值和提取最小值等操作。插入操作可能将顶点插入 $B$ 或 $F$,减小键值操作可能将顶点从 $B$ 移动到 $F$。
算法的高层工作流程如下:
- 若集合 $F$ 非空,移除并扫描 $F$ 中的一个顶点。
- 若集合 $F$ 为空,移除并扫描优先队列 $B$ 中距离标签最小的顶点。
当顶点 $u$ 的距离标签减小时:
- 若 $u$ 属于 $B$,对 $u$ 执行减小键值操作,该操作可能在 $B$ 内重新定位 $u$,或发现 $u$ 的距离标签精确并将其移动到 $F$。
- 若 $u$ 既不在 $B$ 也不在 $F$,对 $u$ 执行插入操作,$u$ 会被插入 $B$,或者若 $d(u)$ 被确定为精确值,则插入 $F$。
优先队列 $B$ 的桶结构包含 $k + 1$ 级桶,其中 $k = ⌈log U⌉$。除顶层外,每级有两个桶。概念上,顶层有无限多个桶,但在任何给定时间,最多三个连续的顶层桶可能非空。可以通过顶层的模三环绕来维护这些桶,为提高底层效率,也可采用模四环绕。
用 $B(i, j)$ 表示第 $i$ 级的第 $j
超级会员免费看
订阅专栏 解锁全文
21

被折叠的 条评论
为什么被折叠?



