假设我想使用数组扩展语法复制现有数组,如下所示:
const a = [1, 2, 3, ..., n];
const b = [...a]
const b = [...a]
的运行时复杂度是多少?我似乎找不到任何相关信息。
最佳答案
理论上,它需要一点前期成本,然后是线性的(假设是标准数组迭代器,而不是自定义的东西),因为理论上它是一个消耗数组中迭代器的循环,如下所示:
const a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const b = [];
for (const element of a) {
b[b.length] = element;
}
console.log(b);
这实际上是:
const a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const b = [];
{
const it = a[Symbol.iterator]();
let result;
while (!(result = it.next()).done) {
const element = result.value;
b[b.length] = element;
}
}
console.log(b);
(在特定的 [...a]
情况下,即使进行最小程度的优化,JavaScript 引擎也可能能够消除迭代器开销并使其简单地线性化,就像 a .slice()
会。)
即使由 JavaScript 引擎优化(例如,如果它位于代码中的热点),也不清楚它如何能比线性做得更好,因为即使是 memcopy 操作也是线性的。
我说“假设标准数组迭代器”因为并非所有迭代器都一定是线性的。标准数组迭代器是线性的,但这并不意味着所有迭代器都是线性的。
关于javascript - JavaScript 数组扩展语法的运行时复杂度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66292173/