堆中多次使用相同的密钥

时间:2015-07-19 14:19:43

标签: algorithm data-structures heap

在堆中(无论是最大堆还是最小堆),是否可能存在两次或多次相同的密钥?

此方案如何破坏O(n)makeheap() O(log(n))的时间复杂度,以便插入和删除?

例如: 以下堆是否有效?

 1

/  \

1   1

2 个答案:

答案 0 :(得分:0)

有时,理论扰动论证可以很好地回答这类问题。想象一下,对于堆中的每个元素,您还要存储一个"索引"到目前为止,在将元素插入堆中时,构建或访问堆中的任何操作的数量。因此,堆中的每个元素都有一个辅助唯一ID,您可以使用它来打破" tie"当堆中的两个值相等且您仍需要比较它们时。然后显然堆将像往常一样运行,具有相同的运行时间保证。弄清楚这种扰动是解决这类简并问题的简单方法,特别是当你不想要一条线上的3个点,或者一个圆上的4个点等时计算几何问题。

但是,我给你一个有点迂腐的答案。我相信真正的事实是,在堆操作中,只要交换的子节点小于或等于其父节点,您就可以随意决定在存在绑定时与父节点交换哪个元素(假设一个min-堆),一切都应该工作正常。唯一能使事情变得更复杂的事情是,由于某种原因,你想要立即从堆中弹出所有关联的最小值。但是,我相信即使这也不是什么大问题。

答案 1 :(得分:0)

  

是否可能有两次或多次相同的密钥?

是的,这是可能的。

  

这种情况如何破坏时间复杂性?

它不能。看看你选择的堆实现。证明复杂性的上限以便导出O符号,而不对所涉及的值做出任何假设,这将是简单和直接的。这意味着,例如,值可以重复,而不会影响复杂性。