簡體   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