比较排序 - 理论

时间:2012-02-16 00:29:35

标签: math sorting comparison theory lower-bound

有人可以向我解释这个问题的解决方案吗?

假设您有一系列 n 元素要进行排序。输入序列 由 n = k 子序列组成,每个子序列包含 k 元素。给定的元素 子序列都小于后续子序列中的元素 大于前一个子序列中的元素。因此,所需要的一切 对整个 n 长度序列进行排序是为了对每个 n = k 中的 k 元素进行排序 序列。在比较次数上显示 n lg k 下限 需要解决这种排序问题的变种。

解决方案:

S 成为 n 元素的序列,分为 n / k 子序列,每个子序列的长度 k 其中任何子序列中的所有元素都大于所有元素 前面的子序列,并且小于后续的所有元素 亚序列。

权利要求

用于排序 S 的任何基于比较的排序算法必须在(n lg k)时间内 最坏的情况。

证明

首先注意到,正如提示中指出的那样,我们无法证明更低 通过将下限相乘来对每个子序列进行排序。 这只能证明没有更快的算法来对子序列进行排序 独立。这不是我们要求证明的;我们不能介绍任何 额外的假设。

现在,考虑高度为h的决策树,用于S的任何比较排序 每个子序列的元素可以是任何顺序,任何 k!排列 对应于子序列的最终排序顺序。并且,因为有 n / k 这样的 子序列,每个子序列可以按任何顺序排列,有(k!)^ n / k 排列 S可以对应于某些输入顺序的排序。因此,任何决定 用于排序S的树必须至少具有(k!)^ n / k 叶。由于高度 h 的二叉树 不超过 2 ^ h 叶子,我们必须 2 ^h≥(k!)^(n / k)h≥lg((k) !)^ N / K)。我们 因此获得

     h ≥ lg((k!)^n/k)          -- unbalanced parens - final one added?
       = (n/k) lg(k!)
       ≥ (n/k) lg((k/2)^k/2)
       = (n/2) lg(k/2)

第三行来自 k!,其 k / 2 最大术语各自至少 k / 2 。 (我们在这里隐含地假设k是偶数。我们可以调整地板和天花板 如果 k 是奇数。)

由于在任何决策树中存在至少一个用于排序具有长度的S的路径 至少(n / 2)lg(k / 2),任何基于比较的排序的最坏情况运行时间 S的算法是(n lg k)

有人可以引导我完成代码块中的步骤吗?特别是 lg k!的步骤变为 lg((k / 2)^ k / 2)

1 个答案:

答案 0 :(得分:3)

我转载了以下数学:

  

(1)h≥lg(k! n / k

     

(2)=(n / k)lg(k!)

     

(3)≥(n / k)lg((k / 2) k / 2

     

(4)=(n / 2)lg(k / 2)

让我们来看看这个。从第(1)行到第(2)行使用对数的属性。类似地,从第(3)行到第(4)行使用对数的性质和(n / k)(k / 2)=(n / 2)的事实。因此,技巧步骤是从第(2)行到第(3)行。

此处的声明如下:

  

对于所有k,k! ≥(k / 2)(k / 2)

直观地说,这个想法如下。考虑k! = k(k-1)(k-2)...(2)(1)。如果您注意到,这些术语中有一半大于k / 2,其中一半较小。如果我们删除所有小于k的项,我们得到的东西(接近)如下:

  

ķ! ≥k(k - 1)(k - 2)...(k / 2)

现在,我们有k /2≥k,所以我们有

  

ķ! ≥k(k - 1)(k - 2)...(k / 2)≥(k / 2)(k / 2)...(k / 2)

这是(k / 2)与其自身(k / 2)次的乘积,因此它等于(k / 2) k / 2 。这个数学不精确,因为奇数和偶数值的逻辑有点不同,但基本上使用这个想法你会得到早期结果证明的草图。

总结:从(1)到(2)和从(3)到(4)使用对数的属性,从(2)到(3)使用上述结果。

希望这有帮助!