[英]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解決此問題,它將更快。 我的意思是
從數組中形成一個最小堆。
取出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.