【问题标题】:What's the time complexity of JavaScript spread syntax in arrays?数组中 JavaScript 展开语法的时间复杂度是多少?
【发布时间】:2019-11-23 17:18:30
【问题描述】:

我想知道在 JavaScript 中将扩展与数组一起使用的时间复杂度是多少。是线性 O(n) 还是常数 O(1)?

以下语法示例:

let lar = Math.max(...nums)

【问题讨论】:

  • 我没有任何证据,但如果不是 O(n),那就太奇怪了。它必须遍历数组的每个元素。
  • 没有展开运算符,有spread syntax。 ;-)
  • @RobG 很抱歉。将编辑问题:)
  • @jhpratt ya 至少最好能看到更清晰的图片,这就是我问哈哈的原因。
  • 我认为这将取决于您要比较的替代方案及其运行的实现,例如在 OP 中,与 Math.max.apply(null,nums) 相比,可能在主机对象与 Array.from(document.getElementsByTagName('p')) 或类似的情况下。

标签: javascript arrays time-complexity spread


【解决方案1】:

Spread 调用相关对象的[Symbol.iterator] 属性。对于数组,这将遍历数组中的每一项,调用数组迭代器的.next(),直到迭代器耗尽,导致O(N)的复杂度。

出于完全相同的原因,for..of(也称为[Symbol.iterator])循环也是O(N)

const arr = [1, 2, 3];
for (const item of arr) {
  console.log(item);
}

对于一个实时示例,请查看以下 sn-p 如何花费 一些时间 来执行:

const arr = new Array(3e7).fill(null);
const t0 = performance.now();
const arr2 = [...arr];
console.log(performance.now() - t0);

(如果操作是O(1),它几乎是瞬时的,但不是)

参数传播与数组传播不同,但它使用same operation(遍历可迭代对象直到耗尽),因此具有相同的复杂性。

对于函数调用:

myFunction(...iterableObj);

【讨论】:

  • 请注意,像上面这样简单的性能测试可能会受到不同实现如何优化代码的严重影响。对正在执行的操作进行更改可能会对相对性能产生重大影响,远远超过...for..infor..of、等:-)
猜你喜欢
  • 2021-05-23
  • 2017-03-19
  • 2021-02-10
  • 1970-01-01
  • 2020-06-24
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多