Something About Dijkstra (3)

k-ary Heap(k叉堆)

简单点说,即将原本堆的实现形式从二叉树改为 k 叉树。

k 叉树的 Insert 和 DecreaseKey 操作的复杂度为 O(log k (V)),DeleteMin 的复杂度为 O(k log k (V)),具体的对比如下表所示:

数据结构 Insert,DecreaseKey DeleteMin
链表 O(1) O(V)
二叉堆 O(log (V)) O(log (V))
k 叉堆 O(log k (V)) O(k log k (V))
斐波那契堆 O(1) amortized O(log V)

对 Dijkstra 的时间优化

对一个 Dijkstra 算法来说,如果图为 G(V,E),一般需要 |V| 次 Insert、|V| 次 DeleteMin 和 |E| 次 DecreaseKey,所以对二叉堆来说总复杂度为 O( (2|V|+|E|) log (V) ),而 k 叉堆为 O( ( (k+1)|V|+|E| ) log k (V) )。

通常我们 k 的值会取 |E| / |V|,那么k 叉堆复杂度就是 O( ( |V|+2|E| ) log (|E| / |V|) (V) )。
在 |E| / |V| > 2 的情况下,显然k叉堆是可以起到优化复杂度的效果的。