用集合与优先级队列实现的二进制堆的渐近复杂性



我正在查看决赛,并偶然发现了以下问题:

二进制堆默认情况下具有优先级的队列语义:如果我们插入一些元素n次,则需要在"消失"之前将其删除。想象一下,您想使用设置语义来实现二进制堆。在这种情况下,插入和删除操作的速度如何?

(a)插入:o(n)删除:o(logn)

(b)插入:o(log n)删除:o(n)

(c)插入:o(log n)删除:o(log n)

(d)插入:o(1)删除:o(n2)

(e)以上都不是。

要插入具有优先级队列语义的实现的堆,它将是o(logn),删除也将是o(logn)。但是,凭借集合,插入和拆卸取决于集合本身的许多因素。您认为答案应该是什么?

我会说插入:o(n)删除:o(log n)。在集合重复的项目中,不允许插入重复的项目,并且由于堆是一棵二进制树,如果要插入到集合中,则完全填充了(除底部除外)(项目)如果您发现它没有其他操作,因此插入可能需要o(n)来查找和插入(您可以在大多数日志n时渗透)。Deletemin具有O(log N)时间复杂性

尚不完全清楚什么 set Sentics 请参阅什么,但作者可能是指属性

a∪{X}⋓{x} = a∪{x}

即。添加集合中的元素不应具有(可观察)效果。

这样做的一种直接方法是在插入时检查重复项。但是,在正常的二进制堆中,删除任意元素的o(n)显然很慢。

通过重复删除,直到看到新值,可以在去除最小元素后消除重复的一个智能想法。这需要O(k log n),其中k是检索到的节点的重复项数。如果已知k是恒定的,则是O(log n)。但是,在最坏的情况下,k = n,使最糟糕的时间复杂性o(n log n)。但是,如果我们测量了摊销时间复杂性,则该算法可实现O(log n)进行插入和去除。

使用平衡的二进制搜索树而不是堆,可以实现最坏情况的时间复杂性o(log n)进行插入和删除。

是否尚不清楚这是否有资格为"堆"。

总而言之,可能的答案是:

  • o(n),o(log n):有点天真的堆
  • o(log n),o(n log n):调谐的真实堆,最坏的时间复杂性
  • o(log n),o(log n):调谐的真实堆,摊销时间复杂性
  • o(log n),o(log n):伪装成堆的平衡二进制搜索树

也就是说,取决于我们如何解释问题,不同的答案是正确的。

最新更新