【问题标题】:How to find the first m smallest integers in an array in O(n)?如何在 O(n) 中找到数组中的前 m 个最小整数?
【发布时间】:2013-04-21 10:50:05
【问题描述】:

当数组长度为 n 且 1

我认为您可以使用选择算法来找到第 m 个最小的整数(http://en.wikipedia.org/wiki/Selection_algorithm 中有一个复杂的称为 BFPRT 的整数,即 O(n)),然后将其用作对数组进行分区以获得前 m 个最小的整数。

但是,有没有办法使用诸如最小堆之类的数据结构来做到这一点?我怎么知道它是否是 O(n)?

【问题讨论】:

标签: algorithm data-structures


【解决方案1】:

您可以在线性时间内创建一个最小堆。然后你只需要删除最小元素m 次,每次删除的成本为log(n)。那是O(n) + m*O(log(n)),即O(n) + O(sqrt(n)*log(n)),即O(n)

编辑我最初说O(n) + O(sqrt(n)*log(n))O(sqrt(n)*log(n))这是错误的,因为O(n)实际上是o(sqrt(n)*log(n)),这意味着它不是O(sqrt(n)*log(n))

【讨论】:

  • 他至少需要检查一次数组中的所有单元格。所以线性是最小值
  • 是的,因为它是错误的。我将在答案中添加注释以反映这一点
【解决方案2】:

只需使用基数排序即可在 O(n) 时间内对数组进行排序。

【讨论】:

  • 这对于大多数实际用途都是正确的,但值得注意的是,基数排序取决于数字的长度。
【解决方案3】:

Build_Heap(A) 方法可以在 O(n) 时间内从随机数组中创建 min_heap 或 max_heap,如果我们创建 min_heap 则需要 O(1) 时间来获取最小元素

所以得到最小元素的总时间是 O(n)+)(1) 也就是 O(n)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2015-06-07
    • 2014-08-25
    • 2014-09-04
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多