JavaScript中的数组很容易通过添加和删除项进行修改。这在某种程度上掩盖了大多数语言中数组是固定大小,并需要复杂操作来调整大小的事实。似乎JavaScript使编写性能较差的数组代码变得容易。这引出了一个问题:
关于数组性能,我可以从JavaScript实现中期望什么样的性能(大O时间复杂度)?
我假设所有合理的JavaScript实现最多具有以下Big O:
我可以期待某些操作比我的假设表现更好吗?我不认为任何规范中都有概述,但实际上,所有主要实现都可能在幕后使用优化的数组。是否有动态扩展数组或其他性能提升算法正在工作?
P.S.
我想知道这个问题的原因是,我正在研究一些排序算法,其中大多数似乎假定添加和删除是O(1)操作,当描述它们的总体Big O时。
关于数组性能,我可以从JavaScript实现中期望什么样的性能(大O时间复杂度)?
我假设所有合理的JavaScript实现最多具有以下Big O:
- 访问 - O(1)
- 附加 - O(n)
- 前置 - O(n)
- 插入 - O(n)
- 删除 - O(n)
- 交换 - O(1)
new Array(length)
语法预填充数组到一定大小。(奖励问题:以这种方式创建数组是O(1)还是O(n)?)这更像是一个传统的数组,如果用作预先调整大小的数组,则可以允许O(1)的附加。如果添加了循环缓冲逻辑,则可以实现O(1)的前置。如果使用动态扩展数组,则平均情况下这两个操作的复杂度为O(log n)。我可以期待某些操作比我的假设表现更好吗?我不认为任何规范中都有概述,但实际上,所有主要实现都可能在幕后使用优化的数组。是否有动态扩展数组或其他性能提升算法正在工作?
P.S.
我想知道这个问题的原因是,我正在研究一些排序算法,其中大多数似乎假定添加和删除是O(1)操作,当描述它们的总体Big O时。
.length
但只有这一个作用)。数组与普通对象实例并没有太大区别。 - Pointylength
属性和预先分配空间是两个完全不同的操作。 - Pointynew Array(10)
上设置array[5]
是O(1)时,我是否期望过高了? - Kendall Frey