如何在O(n)中找到数组中的前m个最小整数?

时间:2013-04-16 07:44:16

标签: algorithm data-structures

当阵列的长度为n且1 <= m <= n ^ 0.5

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

但是,有没有办法使用像min-heap这样的数据结构?我怎么知道它是否是O(n)?

3 个答案:

答案 0 :(得分:4)

您可以在线性时间内创建最小堆。然后,您只需要为每次删除删除费用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))

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

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