Массивы в JavaScript очень легко изменять, добавляя и удаляя элементы. Это несколько маскирует тот факт, что большинство языковых массивов имеют фиксированный размер и требуют сложных операций для изменения размера. Кажется, что JavaScript упрощает написание плохо работающего кода массива. Это приводит к вопросу:
Какую производительность (с точки зрения большой временной сложности) я могу ожидать от реализаций JavaScript в отношении производительности массива?
Я предполагаю, что все разумные реализации JavaScript имеют не более следующих больших О.
- Доступ - O (1)
- Добавление - O (n)
- Подготовка - O (n)
- Вставка - O (n)
- Удаление - O (n)
- Обмен - O (1)
JavaScript позволяет предварительно заполнить массив до определенного размера, используя new Array(length)
синтаксис. (Дополнительный вопрос: создает массив таким образом O (1) или O (n)). Это больше похоже на обычный массив, и при использовании в качестве массива с предварительно заданным размером может допускать добавление O (1). Если добавлена логика кольцевого буфера, вы можете добиться начала O (1). Если используется динамически расширяющийся массив, O (log n) будет средним случаем для обоих из них.
Могу ли я ожидать более высокой производительности для некоторых вещей, чем мои предположения? Я не ожидаю, что что-либо будет описано в каких-либо спецификациях, но на практике может случиться так, что все основные реализации используют оптимизированные массивы за кулисами. Используются ли динамически расширяющиеся массивы или какие-то другие алгоритмы повышения производительности?
PS
Причина, по которой мне это интересно, заключается в том, что я исследую некоторые алгоритмы сортировки, большинство из которых, кажется, предполагают, что добавление и удаление являются операциями O (1) при описании их общего большого O.
length
свойства и предварительное выделение пространства - две совершенно разные вещи.
array[5]
на new Array(10)
O (1)?
.length
но это все.) На самом деле массивы мало чем отличаются от простых экземпляров Object.