给定二进制堆,如何在线性时间-O(n)中将其转换为二项式队列?我想拆分堆但是我被卡住了,因为删除的时间是O(lg n)
答案 0 :(得分:1)
假设您可以访问包含二进制堆的后备数组,并且可以在O(n)时间内迭代它,那么您可以通过执行n次插入来创建二项式堆。正如Wikipedia article所说:
只需创建一个新元素即可将新元素插入堆中 堆只包含此元素,然后将其与 原始堆。由于合并,插入需要O(log n)时间。然而, 在一系列n次连续插入中,insert已经摊销 O(1)的时间(即常数)。
换句话说,在二项式堆中插入n将需要O(n)时间。
通过使用标准二进制堆删除操作,您无法在O(n)时间内执行此操作。如您所述,每次删除都是O(log n),导致O(n log n)复杂度。