给定N个任意整数,如何找到这些数字的上半部分的平均值?有O(n)解决方案吗?如果没有可能证明这是不可能的?
答案 0 :(得分:13)
首先,找到给定数组的median(takes 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:你不需要排序。