在堆中(无论是最大堆还是最小堆),是否可能存在两次或多次相同的密钥?
此方案如何破坏O(n)
和makeheap()
O(log(n))
的时间复杂度,以便插入和删除?
例如: 以下堆是否有效?
1
/ \
1 1
答案 0 :(得分:0)
有时,理论扰动论证可以很好地回答这类问题。想象一下,对于堆中的每个元素,您还要存储一个"索引"到目前为止,在将元素插入堆中时,构建或访问堆中的任何操作的数量。因此,堆中的每个元素都有一个辅助唯一ID,您可以使用它来打破" tie"当堆中的两个值相等且您仍需要比较它们时。然后显然堆将像往常一样运行,具有相同的运行时间保证。弄清楚这种扰动是解决这类简并问题的简单方法,特别是当你不想要一条线上的3个点,或者一个圆上的4个点等时计算几何问题。
但是,我给你一个有点迂腐的答案。我相信真正的事实是,在堆操作中,只要交换的子节点小于或等于其父节点,您就可以随意决定在存在绑定时与父节点交换哪个元素(假设一个min-堆),一切都应该工作正常。唯一能使事情变得更复杂的事情是,由于某种原因,你想要立即从堆中弹出所有关联的最小值。但是,我相信即使这也不是什么大问题。
答案 1 :(得分:0)
是否可能有两次或多次相同的密钥?
是的,这是可能的。
这种情况如何破坏时间复杂性?
它不能。看看你选择的堆实现。证明复杂性的上限以便导出O符号,而不对所涉及的值做出任何假设,这将是简单和直接的。这意味着,例如,值可以重复,而不会影响复杂性。