在使用D-Ary堆实现时,我正在寻找关于Dijkstra算法运行时的完整演练。
到目前为止,我最好的理解是树的深度最多为log_d(n),因此插入和冒泡的最大时间是log_d(n)。在删除节点时不会冒泡吗?
我只是在拼凑各种东西以找到总的Big-O运行时遇到了麻烦。我的理解是它应该是O(m logm / n n)),但是我希望有一种演练来理解为什么会这样。
答案 0 :(得分:1)
在d-ary堆中,向上堆(例如,插入,减少键,如果你在它们四处移动时跟踪堆节点)需要时间O(log_d n)和向下堆(例如,delete-min) time O(d log_d n),其中n是节点数。下降成本更高的原因是我们必须找到最小的孩子来推广,而成堆只是与父母相比。
假设连接图,Dijkstra最多使用m - (n - 1)个减少密钥,最多使用n - 1个插入/删除(假设我们从不插入根)。使用d-ary堆作为优先级队列的Dijkstra的运行时间因此是O((m + n d)log_d n),这对于密集图是值得的。