以下两个问题我得错了,但我不知道为什么。
1.假设您使用排序数组(例如,从最大到最小)实现优先级队列的功能。 Insert和Extract-Min的最差运行时间分别是多少? (假设您有足够大的数组来容纳您所面临的插入。)
我的答案是O(log(n))和O(1)因为我们可以二进制搜索并插入所以O(log(n))
extract-min很容易。
但正确答案是O(n)和O(1)。
2.假设您使用未排序数组实现优先级队列的功能。 Insert和Extract-Min的最差运行时间分别是多少? (假设您有足够大的数组来容纳您所面临的插入。)
我的答案是O(1)和O(log(n)),因为插入是任意的,并且我们可以先将extract-min排序,然后取最小值。
但正确的答案是O(1)和O(n)
有谁可以帮我解决这个问题?非常感谢。
哦,我理解第二个问题,排序需要O(n * log(n))而不是O(log(n))
答案 0 :(得分:4)
带数组的问题不是找到你需要插入元素的地方,它实际上是插入它。它将要求您将其旁边的所有元素移动一个索引,这将花费O(n)
。
示例:[1,5,8,10,15]
,您需要插入4
,找到您需要插入的位置很简单,但您需要扩展数组(可以使用{{3}进行查询}),然后向右推送大于4(5,8,10,15)的所有元素,这将是O(n)
,你将获得[1, _, 5, 8, 10, 15]
- 所以你可以安全地添加4覆盖现有价值。
现在,插入一个元素相当容易 - 你只需要将它推到数组的后面,它将是O(1)
(使用动态数组)。但是,搜索最小值需要dynamic arrays,即O(n)
。
答案 1 :(得分:0)
对于排序数组,您可以在 O(log n)中搜索正确的位置,但需要 O(n)才能插入。因为你需要在这个地方之后移动所有元素。
答案 2 :(得分:0)