如何找到N个数字的上半部分的平均值?

时间:2010-09-05 09:42:10

标签: algorithm

给定N个任意整数,如何找到这些数字的上半部分的平均值?有O(n)解决方案吗?如果没有可能证明这是不可能的?

4 个答案:

答案 0 :(得分:13)

首先,找到给定数组的mediantakes linear time)。

然后,只需遍历数组并总结所有大于中位数的元素。

计算您总和的元素数量(M)。如果M < N/2,则意味着几个等于中值的元素(即N/2 - M)属于上半部分。添加许多中值的总和。我们需要这种复杂性,因为我们不知道有多少中间元素(可能有几个)属于上半部分:如果我们全部采用它们,我们最终可以总结超过N/2个元素。

现在你有了数组上半部分的总和。除以N/2,你就完成了。

答案 1 :(得分:1)

您可以使用优先级队列。将元素插入队列,保持您看到的元素数量n。将队列中的n/2个最大元素提取到累加器中并计算平均值。

在队列后面有一个选择良好的数据结构,例如斐波纳契堆,这将为您提供O(n log n)运行时,因为插入为O(1),提取为O(log n)

不幸的是没有你正在寻找的O(n)运行时,但是已经实现了数据结构,这将产生非常容易理解的直接代码。

答案 2 :(得分:1)

如果你能在线性时间内找到中位数,这显然可以在线性时间内解决。 找到线性时间的中位数是棘手的,但可能。例如,请参阅selection algorithms上的维基百科文章。

答案 3 :(得分:0)

我会建议:

使用Quicksort,选择一些数据透视表。 这会将您的列表划分为两个子列表,一个小于数据透视表,一个小于数据透视表。 如果较小子列表的大小为&lt; = N / 2,则计算平均值a1 如果size == N/2 or size == N/2 -1
    你马上完成了。

如果没有重新分区更大的子列表,直到总大小为N / 2.

如果尺寸&gt; N / 2分区较小的子列表。

重复所有操作直到完成。

P.S:你不需要排序。

相关问题