【发布时间】:2015-07-16 19:09:19
【问题描述】:
我正在寻找使用 D-Ary 堆实现 Dijkstra 算法运行时的完整演练。
目前我最好的理解是树的深度最多为log_d(n),所以插入和冒泡的最大时间是log_d(n)。删除节点会不会冒泡?
我只是无法在这里拼凑出总的 Big-O 运行时间。我的理解是它应该是 O(m logm/n n)),但我想有一种演练来理解为什么会这样。
【问题讨论】:
标签: algorithm heap big-o dijkstra
我正在寻找使用 D-Ary 堆实现 Dijkstra 算法运行时的完整演练。
目前我最好的理解是树的深度最多为log_d(n),所以插入和冒泡的最大时间是log_d(n)。删除节点会不会冒泡?
我只是无法在这里拼凑出总的 Big-O 运行时间。我的理解是它应该是 O(m logm/n n)),但我想有一种演练来理解为什么会这样。
【问题讨论】:
标签: algorithm heap big-o dijkstra
在一个 d-ary 堆中,上堆(例如,插入,如果您在堆节点移动时跟踪它们,则减少键)需要时间 O(log_d n),而下堆(例如,delete-min)需要时间时间 O(d log_d n),其中 n 是节点数。 down-heaps 更昂贵的原因是我们必须找到要提升的最小子级,而 up-heaps 只是与父级进行比较。
假设一个连通图,Dijkstra 最多使用 m - (n - 1) 个减少键和最多 n - 1 个插入/删除(假设我们从不插入根)。因此,Dijkstra 使用 d-ary heap 作为优先级队列的运行时间为 O((m + n d) log_d n),这对于密集图来说是值得的。
【讨论】: