JavaScript中的数组很容易通过添加和删除项来进行修改。它在某种程度上掩盖了一个事实,即大多数语言数组都是固定大小的,并且需要复杂的操作来调整大小。看起来,JavaScript使编写性能不佳的数组代码变得容易。这导致了一个问题:
对于数组性能,我可以从JavaScript实现中获得什么样的性能(就O时间复杂度而言)?
我假设所有合理的JavaScript实现最多都具有以下大O。
- 存取权-O(1)
- 追加-O(n)
- 前置-O(n)
- 插入-O(n)
- 删除-O(n)
- 交换-O(1)
JavaScript使您可以使用以下命令将数组预填充为特定大小 new Array(length)
语法。(奖金问题:是以O(1)或O(n)的方式创建数组)这更像是常规数组,并且如果用作预大小数组,则可以允许添加O(1)。如果添加了循环缓冲区逻辑,则可以实现O(1)前置。如果使用动态扩展数组,则O(log n)将是这两种情况的平均情况。
我可以期望某些事情比我的假设有更好的性能吗?我不希望任何规范概述任何内容,但实际上,可能是所有主要实现都在幕后使用了优化的数组。是否在工作中动态扩展数组或其他一些提高性能的算法?
聚苯乙烯
我想知道这是因为我正在研究一些排序算法,当描述它们的整体大O时,大多数似乎都假定追加和删除是O(1)运算。
length
属性和预分配空间是完全不同的两件事。
array[5]
一个new Array(10)
是O(1)?
.length
,仅此而已。)数组实际上与普通Object实例没有太大区别。