使用O(n)时间的黑盒算法计算中位数

时间:2018-11-18 15:09:28

标签: algorithm sorting median

问题是这样的:

给定大小为n且算法为B的数组A,且B(A,n)= b,其中b是A的元素,使得| {1 <= i <= n | a_i> b} |> = n / 10
| {1 <= i <= n | a_i> b} | <= n / 10

B的时间复杂度为O(n)。

我需要找到O(n)的中位数。

我尝试通过应用B来解决此问题,然后找到小于b的元素组,将其命名为C。 且元素大于b,则将其命名为D组。 我们可以通过遍历O(n)中的数组A来获得组C和D。 现在我可以将算法B应用于上述较小的组,因为中位数不存在,最后应用相同的原理,我可以获得中位数元素。时间复杂度O(nlogn)

我似乎找不到适合O(n)的解决方案。

这是一个作业问题,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

您应该使用函数B()为Quickselect算法选择一个枢轴元素:https://en.wikipedia.org/wiki/Quickselect

您似乎已经在考虑确切地执行此过程,因此您已经有了算法,而只是错误地计算了复杂度。

在每次迭代中,您对列表执行线性时间过程,该过程最多为上一次迭代中列表大小的9/10,因此最坏的情况是

O(n + n * 0.9 + n * 0.9 ^ 2 + n * 0.9 ^ 3 ...)

像这样的几何级数收敛到一个常数乘数:

让T = 1 + 0.9 ^ 1 + 0.9 ^ 2 + ...

很容易看到

T-T * 0.9 = 1,所以

T *(0.1)= 1,并且T = 10

因此,所有迭代处理的元素总数少于10n,因此您的算法需要O(n)时间。