有关课程开放课程中的问题的问题

时间:2015-03-02 10:14:36

标签: algorithm heap

以下两个问题我得错了,但我不知道为什么。

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))

3 个答案:

答案 0 :(得分:4)

  1. 带数组的问题不是找到你需要插入元素的地方,它实际上是插入它。它将要求您将其旁边的所有元素移动一个索引,这将花费O(n)
    示例:[1,5,8,10,15],您需要插入4,找到您需要插入的位置很简单,但您需要扩展数组(可以使用{{3}进行查询}),然后向右推送大于4(5,8,10,15)的所有元素,这将是O(n),你将获得[1, _, 5, 8, 10, 15] - 所以你可以安全地添加4覆盖现有价值。

  2. 现在,插入一个元素相当容易 - 你只需要将它推到数组的后面,它将是O(1)(使用动态数组)。但是,搜索最小值需要dynamic arrays,即O(n)

答案 1 :(得分:0)

对于排序数组,您可以在 O(log n)中搜索正确的位置,但需要 O(n)才能插入。因为你需要在这个地方之后移动所有元素。

答案 2 :(得分:0)

  1. 您需要在插入的值之后移动数组中的值,因此O(n)。
  2. 你已经指出了。排序需要O(n * logn),但您可以使用线性扫描找到最小值 - O(n)