在JavaScript数组中查找最后一个元素的计算效率最高的方法

Most computationally efficient way to find last element in a JavaScript Array?

本文关键字:计算 效率 方法 元素 数组 JavaScript 查找 最后一个      更新时间:2023-09-26

使用会更快吗

var lastelement = myarray[myarray.length - 1];

var lastelement = myarray.reverse()[0];

为什么?

想想吧。

如果你知道一个数组有多长,那么只得到最后一个值要比计算相反的值快得多!

通过索引访问元素会更快,因为它应该具有O(1)复杂性。另一方面,根据反转算法的实现方式,反转数组然后访问第一个索引的复杂性至少为O(n)。

我将从不同的角度来看待这个问题。很可能你只想得到最后一个元素,而不想对实际的数组本身做任何事情。如果您使用array.reverse来获取最后一个元素,那么实际上您正在更改数组(在您的情况下,这可能是一个令人不快的副作用)。

var myArray = [.....]; // some array
var lastElement = myArray.reverse()[0]; // get the last element
var firstElement = myArray[0]; // tricked you! This is now the same as
                               // lastElement because the myArray object
                               // in memory has been reversed.

因此,如果你想在不改变数组的情况下获得最后一个元素,你必须这样做:

var myArray = [.....]; // some array
var lastElement = myArray.slice().reverse()[0]; // copy and get the last element
var firstElement = myArray[0]; // this is the correct first element

很明显,现在哪种方式更有效。

Array.reverse()在同一引用中用新的反向数组替换旧数组,用新元素封装新数组比按索引获取数组元素慢得多。var lastelement=myarray[myarray.length-1];速度要快得多。

真正有效的解决方案是使用红黑二叉树(http://en.wikipedia.org/wiki/Red%E2%80%93black_tree),其中您将在每个节点中存储一个数组值,上一项和下一项的delta,以及与中值的相对位置。然后,只需进行几次遍历,您就应该能够识别最后一个元素(最后一个元件是具有最大中间值索引的索引的元件,而具有前一个项目,没有下一个项目)。

诀窍是每次遍历只需要O(ln(n)。

编辑:根据Bergi的建设性评论,我只是想知道仅仅使用数组来实现这一点是否会更快,方法是对包含数组所有索引的数组进行快速傅立叶变换,然后用频率分析识别最后一个元素,然后将数组转换回频率中的数字。如果我不清楚,我很抱歉,在写这篇文章的时候,我没有看清楚所有的步骤,但我认为这是一个值得遵循的想法。