Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 比较排序-理论_Math_Sorting_Comparison_Theory_Lower Bound - Fatal编程技术网

Math 比较排序-理论

Math 比较排序-理论,math,sorting,comparison,theory,lower-bound,Math,Sorting,Comparison,Theory,Lower Bound,有人能给我解释一下这个问题的解决办法吗 假设给您一个由n个元素组成的排序序列。输入序列 由n=k个子序列组成,每个子序列包含k个元素。给定元素中的元素 子序列都小于后续子序列中的元素,并且 大于前面子序列中的元素。因此,需要做的就是 排序长度n的整个序列是对每个n=k中的k个元素进行排序 子序列。显示比较次数的n lg k下限 需要解决排序问题的这种变体 解决方案: 设S为n个元素的序列,被划分为n/k个子序列,每个子序列的长度为k 其中,任何子序列中的所有元素都大于所有元素 前一子序列的,小于

有人能给我解释一下这个问题的解决办法吗

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

解决方案:

设S为n个元素的序列,被划分为n/k个子序列,每个子序列的长度为k 其中,任何子序列中的所有元素都大于所有元素 前一子序列的,小于后一子序列的所有元素的 随后

主张

任何基于比较的排序算法对S进行排序都必须在 最坏的情况

证明

首先请注意,正如提示中指出的,我们无法证明较低的 通过将排序每个子序列的下界相乘来绑定。 这只能证明没有更快的算法对子序列进行排序 独立地。这不是我们要证明的;我们不能提出任何建议 额外的假设

现在,考虑SH的任何比较排序的高度H的决策树。 每个子序列的元素可以是任意顺序,任意k!排列 对应于子序列的最终排序顺序。而且,因为有n/k这样的 子序列,每个子序列可以是任意顺序,有(k!)^n/k个置换 可能与某些输入顺序的排序相对应的。因此,任何决定 用于排序的树必须至少有(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是(nlgk)的算法


有人能带我完成代码块中的步骤吗?尤其是当lg k!变成lg((k/2)^k/2)。

我已将数学结果转载如下:

(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(k-1)(k-2)…(k/2)

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

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)使用上述结果


希望这有帮助

我已将数学重印如下:

(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(k-1)(k-2)…(k/2)

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

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)使用上述结果


希望这有帮助

我的怀疑是从第二步到第三步。谢谢你的帮助!我的怀疑是从第二步到第三步。谢谢你的帮助!