如何计算最接近中位数的k?

时间:2013-01-13 10:36:18

标签: arrays algorithm median

我有一组n个成对不同的元素和一个数字k,其中1 <= k <= n。

现在我正在寻找一种计算k数字的算法,其绝对差值与数字数组的中位数之间的差异最小我需要线性复杂度(O(n))。

我的方法:

我找到了中位数:

  • 我对数字进行排序
  • 我得到了中间元素,或者如果元素数量为id,那么中间和圆形中的两个元素的平均值。

之后:

  • 我拿每个数字,找到与中位数的绝对距离。这些结果我保存在不同的数组
  • 我对新获得的数组进行排序。
  • 我取结果数组的前k个元素,我就完成了。

我不知道我的解决方案是否在O(n),也不知道我是否对这个想法是正确的。有人可以验证吗?有人能告诉我如何在O(n)中解决它吗?

1 个答案:

答案 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 }},141613