给定 5 个数字,找到中位数所需的最小比较次数是多少?

Posted

技术标签:

【中文标题】给定 5 个数字,找到中位数所需的最小比较次数是多少?【英文标题】:given 5 numbers, what is the minimum number of comparisons needed to find the median? 【发布时间】:2010-12-07 19:53:36 【问题描述】:

一般而言,您如何设置最小比较次数?

【问题讨论】:

见cstheory.stackexchange.com/questions/12257/… 【参考方案1】:

引用 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。

【讨论】:

但是,找到 N/2 个最低元素并不像只找到一个中位数那么难。 一旦你找到了 N/2 个最小的元素,这些元素中最大的就是中位数,并且由于你刚刚完成了所有必要的比较,你知道 N/2 中的哪一个最小的元素是最大的。 感谢 TAoCP 参考,Pavel。 同意。 6 是你能做的最好的。 你或我的计算有问题。 (5 - 3) + 2 + 3 是我的解决方案。 log_2(4) = 2 和 ceil(log_2(5) = 3。需要帮助!【参考方案2】:

Donald Knuth 的计算机编程艺术第 3 卷的第 5.3.3 节,最小比较选择中有很多关于此的材料,其中考虑选择第​​ t 个最大 n 个值所需的最小比较次数的更一般问题。 (这个值用Vt(n)表示)。

Knuth 给出 n - t + (t-1)⌈lg(n + 2 - t)⌉ 对于 Vt(n ),首先通过锦标赛系统确定 n - t + 2 的最大元素,然后将其删除(因为它不可能是第 t 个最大元素)并将其替换为其余元素之一,继续此过程,直到所有元素都已成为此过程的一部分,然后此阶段的最大元素是原始集合中的第 t 个最大元素。在这种情况下,n = 5t = 3,所以这个公式给出的上限是 6 次比较。

Knuth 提到这个上限在 n ≤ 6 时是精确的,因此适用于这种情况。总的来说,我的理解是,没有找到用于选择(和排序)的最小比较算法的通用程序,并且增加 n 值的记录通常使用特殊技巧,这些技巧通常不适用于当 n 增加时,更大的值或被其他技巧简单地击败。

【讨论】:

以上是关于给定 5 个数字,找到中位数所需的最小比较次数是多少?的主要内容,如果未能解决你的问题,请参考以下文章

给定数组表示 S 所需的最小数字计数

搜索排序数组中出现次数超过一半的元素所需的最小比较

找到偶数出现的数字

算法第四章上机实验报告

返回找到相邻的重复数字对所需的最少乘法次数

给定一个随机顺序的整数数组,您必须找到最小交换次数才能将其转换为循环排序数组