对于一小部分输入的比较排序的下限?

时间:2012-02-16 01:17:37

标签: algorithm sorting math big-o proof

有人可以告诉我解决以下问题的数学部分。

显示没有比较排序,其运行时间至少是一半的线性 的n!长度为n的输入。那么长度为n的输入的1 / n的一小部分呢? 分数(1 /(2)^ n)怎么样?

解决方案:

如果排序以m个输入排列的线性时间运行,那么高度为h 决策树的一部分由m个相应的叶子和它们组成 祖先是线性的。 使用与定理8.1的证明中相同的参数来表明这是不可能的 对于m = n!/ 2,n!/ n或n!/ 2n。 我们有2 ^h≥m,这给我们h≥lgm。对于这里给出的所有可能的ms, lgm =Ω(n lg n),因此h =Ω(n lg n)。 特别是,

    lgn!/2= lg n! − 1 ≥ n lg n − n lg e − 1
    lgn!/n= lg n! − lg n ≥ n lg n − n lg e − lg n
    lgn!/2^n= lg n! − n ≥ n lg n − n lg e − n

1 个答案:

答案 0 :(得分:6)

每个这些样张是更一般的证明的简单修改就可以没有一个比较排序的排序任何比Ω(N log n)的速度更快(你可以看到这个证明的 in this earlier answer )。直觉上,论点如下。为了使排序算法正常工作,它必须能够确定元素的初始排序。否则,它无法对值重新排序以按升序排列。给定n个元素,有n个!这些元素的不同排列,意味着有n!排序算法的不同输入。

最初,算法对输入序列一无所知,也无法区分任何n!不同的排列。每次算法进行比较时,它都会获得有关元素排序方式的更多信息。具体地,它可以判断输入置换是在比较产生为真的排列组中还是在比较产生假的排列组中。您可以直观地看出算法如何作为二叉树工作,其中每个节点对应于算法的某个状态,并且特定节点的(最多)两个子节点指示如果比较产生真值则将输入的算法的状态或者是假的。

为了使排序算法能够正确排序,它必须能够为每个可能的输入进入唯一状态,否则算法无法区分两个不同的输入序列,因此至少可以排序其中一个不正确。这意味着如果考虑树中的叶节点数(算法已完成比较并将要排序的部分),则每个输入排列必须至少有一个叶节点。在一般证据中,有n!排列,所以必须至少有n!叶节点。在二叉树中,拥有k个叶子节点的唯一方法是使高度至少为Ω(log k),这意味着您必须至少进行Ω(log k)比较。因此,通过斯特林的近似,一般排序下限是Ω(log n!)=Ω(n log n)。

在您考虑的情况下,我们将自己限制在这些可能排列的子集中。例如,假设我们希望能够排序n! / 2的排列。这意味着我们的树的高度必须至少为lg(n!/ 2)= lg n! - 1 =Ω(n log n)。结果是。你不能按时间O(n)排序,因为没有线性函数以Ω(n log n)的速率增长。对于第二部分,看看你是否能得到n! / n按线性时间排序,决策树必须有高度lg(n!/ n)= lg n! - lg n =Ω(n log n),因此您无法对O(n)比较进行排序。对于最后一个,我们有那个lg n! / 2 n = lg n! - n =Ω(n log n),所以再次无法在O(n)时间内进行排序。

但是,您可以在线性时间内对2 n 排列进行排序,因为lg 2 n = n = O(n)。

希望这有帮助!