Масиви в JavaScript дуже легко змінювати, додаючи та видаляючи елементи. Це дещо маскує той факт, що більшість мовних масивів мають фіксований розмір і потребують складних операцій для зміни розміру. Здається, що JavaScript дозволяє легко писати неякісний код масиву. Це призводить до питання:
Яку ефективність (з точки зору великої складності у часі) можна очікувати від реалізацій JavaScript щодо продуктивності масиву?
Я припускаю, що всі розумні реалізації JavaScript мають максимум такі великі O.
- Доступ - 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) при описі загального великого О.
length
властивості та попередньо розподілити простір - це дві абсолютно різні речі.
array[5]
на a new Array(10)
- це O (1)?
.length
але це стосується цього.) Масиви дійсно не сильно відрізняються від простих екземплярів Object.