给定一个二进制堆,如何在线性时间O(n)中将其转换为二项式队列我想把堆分开,但是由于删除的时间是o(lg n),我陷入了困境。

最佳答案

假设您有权访问包含二进制堆的后备数组,并且可以在o(n)时间内对其进行迭代,那么您只需执行n次插入就可以创建二项式堆。正如Wikipedia article所说:
只需创建一个新的
只包含此元素的堆,然后将其与
原始堆由于合并,insert需要O(log n)时间然而,
在n个连续插入序列中,插入有一个摊销
O(1)的时间(即常数)。
换言之,在二项式堆中执行n次插入将需要o(n)个时间。
不能在o(n)时间内使用标准的二进制堆删除操作来执行此操作。正如你注意到的,这将是O(log n)的每次移除,导致O(n log n)的复杂性。

关于algorithm - 如何将二进制堆转换为二项式队列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50593689/

10-09 12:31