使用
会更快吗?var lastelement = myarray[myarray.length - 1];
或
var lastelement = myarray.reverse()[0];
为什么?
答案 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的建设性意见,我只是想知道通过对包含数组所有索引的数组使用快速傅里叶变换,然后使用频率识别最后一个元素,使用数组是否更快分析,然后转换回数组以获得频率以外的数字。如果我不清楚,我很抱歉,在撰写本文时我没有清楚地看到所有步骤,但我认为这是一个值得关注的想法。