快速算法在数组中找到第n1个最小数到第n个最小数

时间:2017-04-27 21:35:17

标签: python algorithm sorting columnsorting

我有一个数组,我试图找到 n1 最小数字,直到数组中 n2 最小数字并将它们存储在另一个大小为 N2-N1 + 1 即可。这里 n2 > n1 ,与数组的大小相比,两者都很小(例如,数组大小为10000, n1 = 5 n2 = 20 )。

我可以先对此数组进行排序,然后检索 n1 数字 n1 + 1 数字,直到 n2 数字为止排序的数组。但由于 n1 n2 与数组大小相比通常相对较小,因此无需对数组进行完全排序。一旦达到 n2 ,算法应该能够在中间停止。

我想知道是否有任何算法,也许是一个修改版本的certian排序算法在这个问题上特别好(好的,我的意思是快)。您可以使用Python代码或伪代码作为插图,谢谢!

4 个答案:

答案 0 :(得分:1)

因为,与阵列的大小相比,N1和N2确实很小。 我们可以使用最小堆数据结构在O(N2 * LogN)中实现。

<强>步骤

  1. 构建一个最小堆。该操作的复杂性将是O(N)
  2. 循环范围为0到N2:      获取根元素并调用heapify。忽略第一个N1元素并返回其余元素。该步骤的复杂度为O(1)+ O(logN) 因此,总的来说我们有O(N2 * logN)

答案 1 :(得分:0)

如果你的数组大小不是很大,你可以使用简单的查找表(这里有一种排序),而不是排序。首先迭代数组并只存储lookup [array [i]] = true; 然后迭代查找并执行以下操作:

for(...){
if(lookup[j]){
    ith++; 
    if(ith>=n1 && ith<=n2)
       ADD(j);
}}

那就是O(n),如果你有一个窗口n1&lt; = n2而不是比O(n)存在更快

答案 2 :(得分:0)

使用selection sort。如果您对整个数组进行排序,则为O( n ²),但如果您只对数组中最小的 m 项进行排序,则为O( mn

答案 3 :(得分:0)

如果 n2 (因此 n1 )都很小,那么你可以找到 n2 最小元素并忽略第一个 n1 。这些方法由Arun Kumar和user448810描述,只要 n1 仍然很小就会有效。

但是,您可能正在描述 n1 (因此 n2 )可能增长的情况(甚至可能与整个列表长度呈线性关系)并且只有他们的差异 n2-n1 仍然很小。在这种情况下,您需要一个选择算法,例如quickselect,在这种情况下将保持为O(N)。