从2堆数据库中删除元素

时间:2011-09-07 15:54:44

标签: algorithm heap time-complexity

假设我们得到了2个不同的堆 - 第一个堆是最小堆,第二个堆是最大堆,它们一起包含n个不同的元素,而不是非常不同的密钥,我需要删除元素x,它必须在其中一个堆,但不是两个堆,因为堆不同。

删除需要以O(logn)的复杂性完成。

注意:堆可以按此顺序拥有密钥:

minHeap:6,6,6,6,6,6

maxHeap:6,6,4,3

删除:x-> key = 6

你会怎么做,是否有可能以所需的复杂性做到这一点?

提示:您可以使用HeapChangeKey,它可以将元素x的键更改为您想要的任何内容 - 您可以使用它来冒泡您正在搜索的元素...(如果堆没有双打,我有解决方案,但没有人告诉我,钥匙是不同的所以上面的例子是我需要你帮助的原因)

1 个答案:

答案 0 :(得分:1)

您可以使用以下算法在O(log n)时间内从二进制堆中删除:

  1. 将元素删除并使用冒泡操作将其与父元素交换,直到它到达堆的顶部。
  2. 使用标准二进制堆删除步骤删除堆的顶部元素并重新平衡它。
  3. 这第一步需要O(log n)时间,因为你需要将元素一直交换到堆的顶部,这需要时间与堆的高度成比例(O(log n))和第二步步骤也需要O(log n)。因此,如果您可以在O(log n)时间内找到要从每个堆中删除的元素,则可以在O(log n)时间内从两个堆中删除元素。

    这样做的一种方法是使用哈希表或二进制搜索树来扩充两个堆,从堆中的值映射到它们的位置。这样,当您需要从一个或两个堆中删除条目时,您可以查看哈希表以查找二进制堆中的哪个位置以查找该元素,然后可以使用上述过程删除元素。您可能需要更新用于堆积元素的代码,以便在移动元素时更新这些表。

    或者,如果您不需要将元素存储在二进制堆中,则可以考虑将所有元素存储在平衡二叉搜索树中。您可以在O(log n)时间内对BST执行所有标准优先级队列操作,但也可以使用标准BST删除步骤在O(log n)时间内从基于BST的优先级队列中轻松删除元素。

    希望这有帮助!