在JavaScript数组中查找最后一个元素的计算效率最高的方法
Most computationally efficient way to find last element in a JavaScript Array?
使用会更快吗
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的建设性评论,我只是想知道仅仅使用数组来实现这一点是否会更快,方法是对包含数组所有索引的数组进行快速傅立叶变换,然后用频率分析识别最后一个元素,然后将数组转换回频率中的数字。如果我不清楚,我很抱歉,在写这篇文章的时候,我没有看清楚所有的步骤,但我认为这是一个值得遵循的想法。
- 根据元素和容器大小计算边距
- 从Rally获取一个特定的标记,以便计算另一个字段中的值
- 使用D3.js计算带有字母间距的文本长度
- 使用CSS或JavaScript计算分页符的数量
- delete在Object上效率低下,但在DOM Element's的数据属性,与null out相比
- 可以't计算自定义谷歌地图的js
- Node.js中的JavaScript原型对象效率
- 如何计算每个元素's的高度,并将这些值用作函数中的变量
- JavaScript计算帮助(乘以时间)
- 如何计算对象文字中的键
- JavaScript循环无法正确计算/显示结果
- 与域在同一台计算机上运行的NODEJS服务器的CORS错误
- 四舍五入JavaScript计算
- 计算HTML中的页数
- 使用jQuery计算数组中的对象以更改进度条
- 如何在jquery中使用实时计算求和值
- 计算多个项目的价格
- 在JavaScript数组中查找最后一个元素的计算效率最高的方法
- jQuery:计算可见元素-效率/速度问题
- 生命的游戏:试图用新的算法来提高计算效率,但没有成功.为什么?