簡體   English   中英

在數組中找到n個最小數字的最快方法是什么?

[英]What's the fastest way to find the n smallest numbers in an array?

我有一個數字列表,我需要找到其中n個最小的數字。

到目前為止,這是我所擁有的,但是我確信必須有可能更快,更干凈地進行(也許不必先對整個列表進行排序?):

var list = [56,34,27,4,78,12,89,1002,45,33,87,90];
var results = [];
var sorted_list = list.slice(); // fastest way to duplicate array
sorted_list.sort(function (a, b) { 
    return a - b;
});
for (var i = 0; i < n; i++) {
    // do stuff with sorted_list[i] and list
    // push the result to results
}
return results;

我認為如果您使用Min Heap解決此問題,它將更快。 我的意思是

  1. 從數組中形成一個最小堆。

  2. 取出min元素並進行heapify。(您將重復此步驟,具體取決於您想要多少個項目)

排序算法將花費O(N * logN)時間,而最小堆創建(步驟1)將花費O(N)時間,而O(logN){average}將花費第二步。

請注意:當您需要的項目數少於N時,堆很有用。如果將步驟重復2次N次,則總時間對O(N * logN)本身與排序相同。

Array.min = function( array ){
  return Math.min.apply( Math, array );
};

資料來源: http : //ejohn.org/blog/fast-javascript-maxmin/

感謝您的澄清。 對於n元素,請使用:

Array.min = function( array, n ){
  return array.sort(function(a, b){return a-b}).slice(0, n);
};

無需排序就可以用這種方式完成。 基本上,我們的想法是每次迭代時,我們都會在數組中壓入最小的數字。 並將其從主數組中刪除

假設我們有一個長度為12的數組

a=[-11,2,1,5,0,9,-8,6,-10,0,12,4];

我們必須找到4個最小的數字

我們可以找到使用此函數(am是結果數組)

function findmin(a) {
    var item=Math.min.apply(Math, a);
    var index= a.indexOf(item);
    am.push(item);
    a.splice(index, 1);
    if(am.length<n)
    findmin(a)

}

現在假設我們必須從數組中找到9個最小的數,我們可以找到(12-9 = 3)最大數並將其從給定數組中刪除,然后這就是我們的結果。

function findmax(a) {
    var item=Math.max.apply(Math, a);
    var index= a.indexOf(item);
    am.push(item);
    a.splice(index, 1);
    if(a.length>n)
    findmax(a)

}

在這里,我認為復雜度為nm,其中m為否。 的元素總數為n。 如果我沒看錯的話。 實際上我在發現復雜性方面很弱。所以請提出是否可以做些改進。

在此處查看演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM