如何设置最低比较次数?
答案 0 :(得分:6)
引用Donald Knuth(通过维基百科的方式,因为我目前没有TAOCP的副本),比较次数的下限为6:
http://en.wikipedia.org/wiki/Selection_algorithm(向下滚动到标题为“下限”的部分)。
你的目标实际上是找到k个最低值,其中k是列表大小的一半,向上舍入,(因此,k = 3; n = 5),然后取最大值。将其插入到页面上的公式中,您将得到:
(5 - 3) + 1 + 1 + 2 = 6
在这种情况下,the actual minimum number of required comparisons is also six。
如果您怀疑找到中位数的任务与找到k个最低值一样困难,您可以参考Knuth的TAoCP,第3卷,第5.3.3章后的练习#2。
答案 1 :(得分:3)
Donald Knuth的计算机程序设计艺术第3卷中有很多材料,在第5.3.3节,最小比较选择中,考虑选择 t 最大 n 值所需的最小比较次数的一般性问题。 (此值由 V t (n)表示。
Knuth为 V t (n)给出了 n - t +(t-1)⌈lg(n + 2 - t)⌉的上界),首先通过锦标赛系统确定 n - t + 2 的最大元素,删除它(因为它不能是 t 最大)并将其替换为其余元素之一,继续此过程直到所有元素都成为此过程的一部分,然后此阶段的最大元素是 t 原始集合中的最大元素。在这种情况下, n = 5 和 t = 3 ,因此该公式给出的上限是6次比较。
Knuth提到当n≤6时,此上限是精确的,因此在这种情况下适用。一般来说,我的理解是没有找到用于选择(和排序)的最小比较算法的一般程序,并且用于增加 n 值的记录通常使用通常不适用于当 n 增加时,更大的值或被其他技巧轻易击败。