【问题标题】:In an integer array with N elements , find the minimum k elements? [duplicate]在具有 N 个元素的整数数组中,找到最小的 k 个元素? [复制]
【发布时间】:2012-08-16 22:28:22
【问题描述】:

可能重复:
Worst-case O(n) algorithm for doing k-selection

鉴于以下问题:

In an integer array with N elements , find the minimum k elements (k << N)

您可以假设N 是一个很大的数字。

我正在考虑最小堆,有人有更好的解决方案吗?

问候

【问题讨论】:

标签: arrays algorithm numbers


【解决方案1】:

如果K selection algorithm在O(n) 中找到第 K 个最小的元素,然后选择小于找到的项目的数字。 (如果某些数字等于第 K 个元素,则选择直到填充 K 项)。

【讨论】:

  • 最小堆实际上可能比简单的实现要慢。我知道如果 k == 1 会更慢。
  • @SaeedAmiri: 找到Kth 最小的数字后,那我应该使用分区算法吗?
  • @ron 在找到Kth 最小的数字后,您需要做的就是再次迭代数组并且任何数字&lt; Kth smallest 都在您的解决方案中,直到您拥有k 项目。所以O(n) + O(n) = O(2n) ~ O(n)
  • @ron,只是迭代数组,并选择小于或等于第K个最小数字的数字,然后如果找到的项目数大于K,则丢弃一些等于第K个最小的项目号码。
  • @Wug,当然对于 K=1,2,3 创建堆是不好的,但是当我们除了 K &lt;&lt; N 之外对 K 一无所知时,我们不能相信幼稚的方法.例如 K = sqrt(N) n sqrt(n) 但堆小于 O(n logn)
【解决方案2】:

这个呢:

对数组进行排序(快速排序或堆排序非常适合整数数组),并迭代到 k

【讨论】:

  • 除非 k 很大,否则这比 k O(n) 搜索要慢。
【解决方案3】:

我认为您可以在 O(N*log(K)) 中完成此操作。伪代码:

haz array[N]
haz output[k] (itz a list)

i iteratez on array with array[N] az element:
    i insertz element into output (i maintainz strict ordering)
    i removez largest element of output when output size iz bigger than k

要求:

  • 从末尾删除 N 个列表 (N * O(1))
  • 最多 N 次排序维护列表插入 (N * O(log(listsize)))

列表的大小以 K 为界

因此,O(N * log(K)) 时间。

【讨论】:

    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多