【发布时间】:2015-02-16 17:43:16
【问题描述】:
让一个算法得到大小为n 的未排序数组。让一个号码k<=n。该算法打印从 1 到 k(升序)的 k 最小数字。算法的下限是多少(对于每个 k)?
Omega(n)Omega(k*logn)Omega(n*logk)Omega(n*logn)- #1,#2 都正确。
现在,据我了解,如果我们想找到算法的下限,我们需要查看最坏的情况。如果是这样,那么显然最坏的情况是k=n。我们知道对数组进行排序以Omega(nlogn) 为界,因此正确答案是#4。
很遗憾,我错了,正确答案是#5。
为什么?
【问题讨论】:
-
观察 #1:对于每个
k,算法都可以在Omega(n)中运行,这是不正确的。例如,k=n表示我们实际上是在对一个数组进行排序,并且以Omega(nlogn)为边界。 -
@Jon Omega(...) 表示算法在最好的情况下运行得这么快,而不是最坏的情况。 这是不正确的。 Big Omega 说明了一个函数渐近地被另一个函数限制在下面,但这个概念同样适用于任何类型的渐近(最佳、最坏情况、平均等)。换句话说,Big O 和 Big Omega 与复杂性类型完全正交。
-
@AlonAlon Omega 是渐近下界,因此 n*logn 也是 Omega(n)。
-
@Jon 有最坏情况下的大欧米茄边界和最好情况下的大 O 边界。 O 与 Omega 指定曲线从哪一侧渐近有界,而不是在何种情况下该界限有效/实现。
标签: arrays algorithm sorting data-structures time-complexity