繁体   English   中英

查找数组中第n1个最小数到第n2个最小数的快速算法

[英]Fast algorithm to find the n1 th smallest number to n2 th smallest number in an array

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

我可以首先对该数组进行排序,然后从排序后的数组中检索第n1个数字,第n1 + 1个数字,直到第n2个数字。 但是由于n1n2通常比数组的大小小,因此不必对数组进行完全排序。 我认为一旦达到n2,该算法就应该能够在中间停止。

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

因为,N1和N2的大小比数组N的大小要小。我们可以使用最小堆数据结构在O(N2 * LogN)中实现。

脚步

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

如果您的数组大小不是很大,则可以使用简单的查找表(此处为某种排序)来代替排序。 首先,迭代数组,然后存储lookup [array [i]] = true; 然后遍历查找并执行以下操作:

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

如果窗口n1 <= n2,那将是O(n),但没有比O(n)快的东西了

使用选择排序 这是为O(n²),如果你整个数组排序,但O(MN),如果你只有数组中最小的m个排序。

如果n2 (因此n1 )都很小,则可以找到n2个最小的元素,而忽略前n1个元素。 这些方法由Arun Kumar和user448810进行了描述,并且只要n1保持较小,它们将是有效的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM