我有一组n个成对不同的元素和一个数字k,其中1 <= k <= n。
现在我正在寻找一种计算k
数字的算法,其绝对差值与数字数组的中位数之间的差异最小。 我需要线性复杂度(O(n)
)。
我的方法:
我找到了中位数:
之后:
我不知道我的解决方案是否在O(n)
,也不知道我是否对这个想法是正确的。有人可以验证吗?有人能告诉我如何在O(n)中解决它吗?
答案 0 :(得分:8)
您可以像这样解决问题:
您可以在O(n)
中找到中位数,w.g。使用O(n)
nth_element algorithm。
循环遍历所有使用一对来替换每个元素的元素:<the absolute difference to the median>, <element's value>
。您再次使用n
= k
执行nth_element。应用此算法后,您可以保证在新数组中首先具有绝对差异的k
个最小元素。你拿他们的指数并完成!
另一方面,您的算法使用排序,这使它成为O(nlogn)
。
编辑:请求的示例:
让数组为[14, 6, 7, 8, 10, 13, 21, 16, 23]
。
[8, 7, 9, 10, 13, 16, 23, 14, 21]
,注意数组没有排序,但中位数(13)仍在中间。[<abs(14-13), 14>, <abs(6-13), 6>, <abs(7-13), 7>, <abs(8-13), 8>, <abs(10-13), 10>, <abs(13-13), 13>, <abs(21-13), 21>, <abs(16-13), 16>, <abs(23-13), 23>
。因此我们获得了数组:[<1, 14>, <7, 6>, <6, 7>, <5, 8>, <3, 10>, <0, 13>, <8, 21>, <3, 16>, <10, 23>
k
是4我们再次制作nth_element(使用每对中的第一个元素进行比较)并获得:[<1, 14>, <3, 16>, <0, 13>, <3, 10>, <8, 21>, <7, 6>, <10, 23>, <6, 7>, <5, 8>]
所以您搜索的数字是前4对中的第二个元素:{{1 }},14
,16
和13