当阵列的长度为n且1 <= m <= n ^ 0.5
时我认为您可以使用选择算法来查找第m个最小整数(在http://en.wikipedia.org/wiki/Selection_algorithm中有一个名为BFPRT的复杂的整数,即O(n))然后将其用作分区数组的枢轴获得前m个最小的整数。
但是,有没有办法使用像min-heap这样的数据结构?我怎么知道它是否是O(n)?
答案 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)