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叉堆是可以起到优化复杂度的效果的。