我有一个数字列表,我需要找到它们中最小的一个。
这是我到目前为止所做的,但我确信必须能够更快更清洁(可能无需先排序整个列表?):
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;
答案 0 :(得分:2)
我认为如果您使用Min Heap来解决此问题,它会更快。我的意思是
从数组中形成一个最小堆。
取出min元素并堆积。(此步骤将重复,具体取决于您想要的项目数量)
排序算法将花费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是总数。元素。如果我没错。 实际上我发现复杂性很弱。所以请建议是否可以做任何改进。