算法的最低界限是多少?

时间:2015-02-16 17:43:17

标签: arrays algorithm sorting data-structures time-complexity

让算法得到大小为n的未排序数组。设一个数字k<=n。该算法打印从1到k(升序)的k个最小数字。算法的下限是什么(每个k )?

  1. Omega(n)
  2. Omega(k*logn)
  3. Omega(n*logk)
  4. Omega(n*logn)
  5. #1,#2都是正确的。
  6. 现在,根据我的理解,如果我们想要找到算法的下限,我们需要查看最坏情况。如果是这种情况,那么显然最坏的情况是k=n。我们知道排序数组的界限是Omega(nlogn)所以正确的答案是#4。

    不幸的是,我错了,正确答案是#5。

    为什么呢?

2 个答案:

答案 0 :(得分:2)

可以在O(n + klogk)中完成。

  • 运行选择算法以找到k个最小元素 - O(n)
  • 迭代并返回元素lower / equals k - O(n)
  • 如果数组允许,可能需要进行另一次迭代 重复,但它仍然在O(n)
  • 完成
  • 最后,您需要在O(klogk)
  • 中对这些元素进行排序

很容易看出这个解决方案是最优的 - 不能比O(klogk)因子更好,因为除了分配k = n你可以更好地排序任何数组,并且线性扫描至少是必须找到所需的要打印的元素。

答案 1 :(得分:1)

让我们尝试线性时间

  1. 为了找到第k个最小的元素,我们必须使用&#34; Randomized-Select&#34;平均运行时间为O(n)。并使用该元素作为快速排序的枢轴。
  2. 使用快速排序方法拆分array[i] <= karray[i]>k。这需要O(n)时间
  3. 取未排序的左array[i]<=k(具有k个元素)并进行计数排序,显然需要O( k + K)
  4. 最后,打印操作将采用O(k)
  5. 总时间= O(n)+O(k+K)+O(k) = O(n+k+K)

    此处, k 是小于或等于K

    的元素数