繁体   English   中英

在数组数组中查找最大/最小元素的最有效方法

[英]Most efficient way to find max/min element in array of array

我想知道如何才能有效地返回数组array中的min / max元素。 我知道我可以遍历整个数组,但是我认为可能会有更好的选择。

let tab= [2];
tab[0] = [{name :"book", value : 8}, {name :"cake", value : 2}]
tab[1] ... etc

我想例如在此数组中找到最小值或最大值。

我使用Math.max.apply来执行此操作,因为它引用数组,同时减少重复数组。 但是,如果您不在乎,则应完全使用reduce,如下所述。

有很多方法可以做到这一点。 第一个是减少保持最大/最小值的数组:

 let tab= [2]; tab[0] = [{name :"book", value : 8}, {name :"cake", value : 2}] tab[1] = [{name :"apple", value : 1}, {name :"spaceship", value : 200}] console.log( tab.map(a=>a.reduce((a,b)=>a.value>b.value?a:b,{})).reduce((a,b)=>a.value>b.value?a:b,{}) ) 

如果我们按以下方式展平数组,这会更容易

 let tab= [2]; tab[0] = [{name :"book", value : 8}, {name :"cake", value : 2}] tab[1] = [{name :"apple", value : 1}, {name :"spaceship", value : 200}] console.log( [].concat.apply([], tab).reduce((a,b)=>a.value>b.value?a:b,{}) ) 

上面的那些函数获取最大值,要获取最小值,只需将a.value>b.value更改为a.value>b.value a.value<b.value 而且,这些函数的时间复杂度为O(n)因此对于较大的数组,它将更快地工作。


另一种方法是排序并获得第一个/最后一个值

 let tab= [2]; tab[0] = [{name :"book", value : 8}, {name :"cake", value : 2}] tab[1] = [{name :"apple", value : 1}, {name :"spaceship", value : 200}] console.log( [].concat.apply([], tab).sort((a,b)=>b.value-a.value)[0] ) 

但是,此方法更为复杂,因为它先对数组排序(O(n log n)),然后再获取第一个或最后一个元素(O(1))。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM