【发布时间】:2012-03-07 09:50:44
【问题描述】:
谁能给我解释一下这个问题的解决方法?
假设你有一个 n 个元素的序列来排序。输入序列 由 n=k 个子序列组成,每个子序列包含 k 个元素。给定的元素 子序列都小于后续子序列中的元素,并且 大于前面子序列中的元素。因此,所有需要 对长度n的整个序列进行排序,就是对n=k中的每一个k个元素进行排序 子序列。显示比较次数的 n lg k 下限 需要解决排序问题的这种变体。
解决方案:
令 S 为 n 个元素的序列,这些元素分为 n/k 个子序列,每个子序列的长度为 k 其中任何子序列中的所有元素都大于所有元素 前一个子序列的元素,并且小于后一个子序列的所有元素 子序列。
声明
任何基于比较的排序算法对 S 进行排序都必须花费 (n lg k) 时间 最坏的情况。
证明
首先请注意,正如提示中所指出的,我们无法证明较低的 通过将排序每个子序列的下限相乘来绑定。 那只会证明没有更快的算法对子序列进行排序 独立。这不是我们被要求证明的;我们不能介绍任何 额外的假设。
现在,考虑 S 的任何比较排序的高度为 h 的决策树。因为 每个子序列的元素可以是任意顺序,任意 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)的那一步。
【问题讨论】:
标签: math sorting comparison theory lower-bound