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) 操作。