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

时间:2013-12-12 14:42:47

标签: javascript arrays

使用

会更快吗?
var lastelement = myarray[myarray.length - 1];

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

为什么?

5 个答案:

答案 0 :(得分:4)

想一想。

如果您知道一个数组有多长,那么获取最后一个值要快于,而不是计算反向值!

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我将从与此处回答的角度不同的角度来看待这个问题。有可能你只想获得最后一个元素,你不想对实际的数组本身做任何事情。如果您使用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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

诀窍是每次遍历只需要O(ln(n)),并且由于你的行程少于ln(n),因此时间低于O(sq(ln(n))),所以它非常快。 / p>

编辑:遵循Bergi的建设性意见,我只是想知道通过对包含数组所有索引的数组使用快速傅里叶变换,然后使用频率识别最后一个元素,使用数组是否更快分析,然后转换回数组以获得频率以外的数字。如果我不清楚,我很抱歉,在撰写本文时我没有清楚地看到所有步骤,但我认为这是一个值得关注的想法。