Мне было интересно, какова временная сложность использования распространения с массивом в JavaScript. Это линейный O (n) или постоянный O (1)?
Пример синтаксиса ниже:
let lar = Math.max(...nums)
Мне было интересно, какова временная сложность использования распространения с массивом в JavaScript. Это линейный O (n) или постоянный O (1)?
Пример синтаксиса ниже:
let lar = Math.max(...nums)
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);
}
В качестве живого примера посмотрите, как следующий фрагмент кода занимает некоторое время для выполнения:
const arr = new Array(3e7).fill(null);
const t0 = performance.now();
const arr2 = [...arr];
console.log(performance.now() - t0);
(если бы операция была O(1)
, она была бы почти мгновенной, но это не так)
Распространение аргумента отличается от распространения массива, но в нем используется одна и та же операция (повторяет итерацию до тех пор, пока она не будет исчерпана), и поэтому имеет ту же сложность.
Для вызовов функций:
myFunction(...iterableObj);
...
, for..in, for..of и т. д. :-)
- person RobG; 15.07.2019
Math.max.apply(null,nums)
и, возможно, в случае хост-объекта противArray.from(document.getElementsByTagName('p'))
или подобного. - person RobG   schedule 15.07.2019