【问题标题】:Finding K closest elements from the median of an unsorted Array从未排序数组的中位数中找到 K 个最接近的元素
【发布时间】:2018-04-25 11:59:29
【问题描述】:

给定一个未排序的数组,我试图找到距离数组中位数最近的 K 个元素。我无法在线性运行时间内找到解决方案。

A[] = 1, 2, 3, 4, 5 ,6 , 30 ,31, 32 ,33 ,34    # assume sorting part is done

这里的中位数是 6。

答案是 2,3,4,5,6。

任何帮助或提示将不胜感激。

【问题讨论】:

  • 你的数组总是排序的吗?我
  • 不,没有排序
  • assume sorting part is done 是什么意思?如果它应该在线性时间内运行,我们怎么能假设呢?是否允许使用额外的数据结构?

标签: algorithm sorting


【解决方案1】:

我对此的建议是两步法。

首先,使用Median of Medians算法在线性时间内找到未排序数组的中位数。

其次,扫描数组并填充Max Heap(大小为k),其中元素根据与中位数的距离进行组织,以便找到k个最近的元素。

您可以通过以下方式确保堆中包含的元素永远不会超过 k。当您想将第 (k+1) 个元素添加到堆中时,请检查它是否小于根。如果是这样,您将其添加到堆中,并在重组堆后删除(新)根。如果没有,您可以丢弃它。

上面的运行时间应该是 O(N log(k)),它在 N 中是线性的。

【讨论】:

  • 堆的大小如何?您不需要将所有 N 个元素添加到堆中并执行 k 次提取吗?因此运行时间为 O(k log(N))。因此,如果 k 为 ~N/2,这将不再是线性运行时。
  • @YashChowdhary,答案在这方面缺少一些信息。我希望现在更清楚了。
猜你喜欢
  • 2022-10-05
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 2016-03-20
相关资源
最近更新 更多