我最近参加了一个有问题的考试:您的朋友已经为优先级队列提出了一组算法,可以执行以下操作:Insert(S, x)
O(1)
,Peek-Max(S)
在O(1)
,Remove-Max(S)
中的O(1)
和O Increase-Key(S, x, k)
中的(logn)
。您如何向您的朋友证明这套算法是不可能的?
我真的很紧张,因为我很肯定我得错了答案。我说优先级队列必须具有以下属性:对于一组元素[A1, A2, ... An]
,它需要具有我现在意识到的关系[A1 >= A2 >=...>= An]
并不是真的。只有第一个元素需要大于其余元素(假设最大优先级第一优先级队列)。因此插入功能不能在O(1)中,因为对于一组n个元素,你无法确保放置的项目在恒定时间内处于适当的位置。
你们是否有任何关于如何解决这个问题的见解?我昨晚无法入睡,以为我可能错了这个问题。
答案 0 :(得分:1)
一种反驳某事的简单方法是想一个反例。在这种情况下,您希望找到一系列明显不可能的操作。
例如,假设您将n
元素插入队列,然后删除-max n
元素。由于这是一个优先级队列,因此我们提取的元素应按排序顺序排列。因此,使用您朋友的算法,我们能够按时间复杂度n
对O(n)
元素进行排序。我们知道排序最好是O(nlogn)
- 在O(n)
中排序是不可能的!