让算法得到大小为n
的未排序数组。设一个数字k<=n
。该算法打印从1到k(升序)的k个最小数字。算法的下限是什么(每个k )?
Omega(n)
Omega(k*logn)
Omega(n*logk)
Omega(n*logn)
现在,根据我的理解,如果我们想要找到算法的下限,我们需要查看最坏情况。如果是这种情况,那么显然最坏的情况是k=n
。我们知道排序数组的界限是Omega(nlogn)
所以正确的答案是#4。
不幸的是,我错了,正确答案是#5。
为什么呢?
答案 0 :(得分:2)
可以在O(n + klogk)
中完成。
O(klogk)
很容易看出这个解决方案是最优的 - 不能比O(klogk)
因子更好,因为除了分配k = n你可以更好地排序任何数组,并且线性扫描至少是必须找到所需的要打印的元素。
答案 1 :(得分:1)
让我们尝试线性时间:
O(n)
。并使用该元素作为快速排序的枢轴。array[i] <= k
和array[i]>k
。这需要O(n)
时间array[i]<=k
(具有k个元素)并进行计数排序,显然需要O( k + K)O(k)
总时间= O(n)+O(k+K)+O(k)
= O(n+k+K)
此处, k 是小于或等于K
的元素数