可以使用heapsort排序的元素数量?

时间:2013-04-03 19:46:49

标签: algorithm sorting math runtime time-complexity

我在考试中遇到了一个非常令人困惑的问题并且尝试了错误,这是一个客观类型的问题,给出了四个选项,现在我知道正确的选项,但我没有解释。

问题:

使用heapsort在Ɵ(logn)时间内排序的元素数量是

a)Ɵ(1)

b)Ɵ(√logn)

c)Ɵ(log n / loglog n)

d)Ɵ(log n)

选项c是正确的。

我选择了选项a),我认为在log n时间内只会对一个元素进行排序,这是错误的,我不知道为什么选项c)是正确的。

2 个答案:

答案 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)的转换主要是基于“直觉”。我有理由相信它是正确的或至少“几乎正确”,但我不知道我用来表明这一点的正式规则。