问题是这样的:
给定大小为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)的解决方案。
这是一个作业问题,我将不胜感激。
答案 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)时间。