什么是在阵列中找到n个最小数字的最快方法?

时间:2014-07-26 14:37:49

标签: javascript big-o performance

我有一个数字列表,我需要找到它们中最小的一个。

这是我到目前为止所做的,但我确信必须能够更快更清洁(可能无需先排序整个列表?):

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;

3 个答案:

答案 0 :(得分:2)

我认为如果您使用Min Heap来解决此问题,它会更快。我的意思是

  1. 从数组中形成一个最小堆。

  2. 取出min元素并堆积。(此步骤将重复,具体取决于您想要的项目数量)

  3. 排序算法将花费O(N * logN)时间,而Min Heap创建(步骤1)将花费O(N)时间,O(logN){average}将花费第二步所花费的时间。

    请注意:当您需要的项目数小于N时,堆很有用。如果重复步骤2 N次,则总时间与排序相同,为O(N * logN)本身。

答案 1 :(得分:0)

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);
};

答案 2 :(得分:0)

如果没有排序,可以通过这种方式完成。 基本上这个想法是每次迭代时我们都会推送一个数组中最小的数字。 并将从主数组中删除该数字

假设我们有一个长度为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是no。要找到的元素,n是总数。元素。如果我没错。 实际上我发现复杂性很弱。所以请建议是否可以做任何改进。

SEE DEMO HERE