Сложность JavaScript для функций массива

Является ли сложность выполнения, определенная стандартом JS, для общих Array функций, таких как push, pop, shift, slice или splice? Особенно Я заинтересован в удалении и вставке записей в случайные позиции. Если сложность не определена, что я могу ожидать, например. в V8?

(Этот вопрос был вдохновлен этим. Кроме того, этот тест, опубликован здесь, также заставляет меня любопытно, но, возможно, это некоторые несвязанные явления.)

(Очень близкий вопрос здесь. Однако один из комментариев к принятому ответу говорит, что сейчас это неправильно. Кроме того, в принятом ответе нет любая ссылка, которую стандарт действительно определяет таким образом.).

Ответ 1

Спецификация ECMA не определяет ограничительную сложность, однако вы можете получить ее из алгоритмов спецификации.

push - это O (1), однако на практике он столкнется с расходами на копирование O (N) на определенных границах движка, поскольку массив слотов необходимо перераспределить. Эти границы обычно логарифмичны.

pop - это O (1) с аналогичной оговоркой к push, но копия O (N) встречается редко, поскольку ее часто складывают в сборку мусора (например, копировальный коллектор может копировать только использованную часть массив).

shift в худшем случае O (N), однако в особых случаях он может быть реализован как O (1) за счет замедления индексации, поэтому ваш пробег может меняться.

slice - O (N), где N - end - start. Не огромная возможность оптимизации здесь без значительного замедления записи в оба массива.

splice, в худшем случае, O (N). Существуют методы хранения массивов, которые делят N на константу, но значительно замедляют индексирование. Если двигатель использует такие методы, вы можете заметить необычно медленные операции, поскольку он переключается между методами хранения, вызванными изменениями шаблонов доступа.

Тот, о котором вы не говорили, < <27 > . В среднем случае это O (N log N). Однако в зависимости от алгоритма, выбранного двигателем, вы можете получить O (N ^ 2) в некоторых случаях. Например, если движок использует QuickSort (даже с поздним выходом в InsertionSort), он имеет известные случаи N ^ 2. Это может быть источником DoS для вашего приложения. Если это связано с ограничением размера массивов, которые вы сортируете (возможно, слиянием подмассивов) или выкупа в HeapSort.

Ответ 2

разрез только линейный, если номер принят, неизвестен. Если число срезов постоянное, то срез является постоянным, а не линейным.