我在考试中遇到了一个非常令人困惑的问题并且尝试了错误,这是一个客观类型的问题,给出了四个选项,现在我知道正确的选项,但我没有解释。
问题:
使用heapsort在Ɵ(logn)时间内排序的元素数量是
a)Ɵ(1)
b)Ɵ(√logn)
c)Ɵ(log n / loglog n)
d)Ɵ(log n)
选项c是正确的。
我选择了选项a),我认为在log n时间内只会对一个元素进行排序,这是错误的,我不知道为什么选项c)是正确的。
答案 0 :(得分:2)
忽略这样一个事实,即问题要求在堆排序上绑定一个Theta,这在一般情况下是没有的,这就是为什么这会让人困惑:
在处理Landau表示法(= O,Ɵ,Omega的东西)时,我们习惯将输入大小设为n
;你在这里被问到的是“我们需要设置输入大小以获得Ɵ(log n)的复杂性。”
例如:考虑列表遍历;对于大小为O(n)
的列表,您将n
。另一方面,如果我们将某些log n
的输入限制为n
,则会产生O(log n)
的复杂性。将这个想法转移到排序算法,我们知道如果我们给它一个大小为O(n log n)
的列表,那么堆排序的最坏情况复杂度为n
。那么如果我们给它一个大小为log n
的列表会发生什么?复杂性变得越来越小:我们从(n) log (n)
转到
(log n) log (log n) = log n log log n
现在解释为什么c)是正确的答案,我会写l(n)
而不是log n
来使其更具可读性。
将术语n * l(n)
中的输入大小调整为l(n)/l(l(n))
c(c)状态。然后我们得到:
l(n)/l(l(n)) * l(l(n)/l(l(n)))
= l(n)/l(l(n)) * [l(l(n) - l(l(l(n)))]
= l(n) - [l(n) * l(l(l(n)))]/l(l(n))
正如您所看到的(希望如此),主导术语是l(n) = log n
,因此对于大小为l(n)/l(l(n))
的输入,堆排序的最坏情况复杂度为O(log n)
。然而,Theta对于一般情况肯定是错误的。
附注:有没有人知道如何使条款漂亮?我知道我们这里没有LaTeX内联,但这看起来并不好看。
答案 1 :(得分:0)
设t = exp(n)是你的时间,m是你可以在那个时间排序的项目数。
a)m =Θ(1)⇒t→∞:无论时间如何,您只能对有限数量的项目进行排序。
b)m =Θ(√t)⇒t=Θ(m²):你需要二次时间。愚蠢的泡沫排序。
c)m =Θ(t / log t)⇒t=Θ(m log m):这是你对堆排序所知的复杂性。
d)m =Θ(t)⇒t=Θ(m):线性时间排序太好了。
我必须承认c)的转换主要是基于“直觉”。我有理由相信它是正确的或至少“几乎正确”,但我不知道我用来表明这一点的正式规则。