JavaScript 中的数组很容易通过添加和删除项来修改。它在某种程度上掩盖了大多数语言数组是固定大小的事实,并且需要复杂的操作来调整大小。似乎 JavaScript 可以轻松编写性能不佳的数组代码。这就引出了一个问题:
在数组性能方面,我可以从 JavaScript 实现中获得什么性能(就大 O 时间复杂度而言)?
我假设所有合理的 JavaScript 实现最多有以下大 O。
- 访问 - O(1)
- 追加 - O(n)
- 前置 - O(n)
- 插入 - O(n)
- 删除 - O(n)
- 交换 - O(1)
new Array(length)
JavaScript 允许您使用语法将数组预填充到特定大小。(额外的问题:以这种方式创建一个数组 O(1) 还是 O(n))这更像是一个传统的数组,如果用作一个预先确定大小的数组,可以允许 O(1) 追加。如果添加了循环缓冲区逻辑,则可以实现 O(1) 前置。如果使用动态扩展数组,O(log n) 将是这两种情况的平均情况。
我可以期望某些事情的性能比我在这里的假设更好吗?我不希望在任何规范中概述任何内容,但实际上,所有主要实现都可能在幕后使用优化的数组。是否有动态扩展数组或其他一些性能提升算法在起作用?
附言
我想知道这一点的原因是我正在研究一些排序算法,其中大多数在描述它们的整体大 O 时似乎假设追加和删除是 O(1) 操作。