Предполагается, что вы понимаете нотацию Big O. Примеры находятся в JavaScript. Информационные ссылки «Интервью по программированию» Гейл Лаакманн Макдауэлл
В некоторых языках, таких как JavaScript или Python, размер массивов автоматически изменяется, то есть он будет расти по мере добавления элементов. В других языках, таких как Java, массивы имеют фиксированную длину, то есть размер определяется при инициализации массива. Эти массивы, которые растут автоматически, называются динамическими массивами.
В Java ArrayList — это структура данных, подобная массиву, которая обеспечивает динамическое изменение размера, сохраняя при этом O(1) доступ. Когда массив заполнен, его размер увеличивается вдвое. Каждое удвоение занимает На) время, но случается так редко, что его амортизированное время вставки все еще равно O(1) .
В разных языках программирования имя этой структуры данных, а также ее коэффициент изменения размера (который в Java равен 2) различаются. Коэффициент изменения размера определяет, насколько больше будет изменен размер массива.
При изменении размера, предполагая, что коэффициент изменения размера равен 2, мы можем наблюдать, что мы увеличиваем размер массива N, удваивая предыдущий массив (что составляет половину N). Кроме того, нам также нужно скопировать Н/2 элементы в этот новый массив.
Если мы суммируем количество элементов, которые мы копируем из окончательного увеличения емкости в первое увеличение емкости: 2n 4n 8 n 16n ... 2 1 что в сумме чуть меньше N. Следовательно, вставка N элементов занимает около На) работа в целом. Каждая вставка O(1) в среднем, хотя некоторые вставки занимают На) время в худшем случае.
Динамические массивы в JavaScript обычно имеют несколько основных методов, каждый из которых имеет разную временную сложность:
get(i): этот метод извлекает элемент по индексу i.
set(i, n): этот метод устанавливает элементу с индексом i значение n.
pushback(n): этот метод добавляет элемент n в конец массива.
popback(): этот метод удаляет последний элемент массива.
resize(): этот метод удваивает емкость массива и копирует все элементы в новый массив.
getSize(): этот метод возвращает количество элементов в массиве.
getCapacity(): этот метод возвращает текущую емкость массива.
class DynamicArray { // size is # of filled slots while capacity is total slots in array constructor(capacity) { this.capacity = capacity; this.arr = new Array(this.capacity); this.size = 0; } // O(1) get(i) { if (i = this.size) return undefined; return this.arr[i]; } // O(1) set(i, n) { if (i = this.size) return undefined; this.arr[i] = n; } // O(1) amortized pushback(n) { if (this.size === this.capacity) { this.resize(); } this.arr[this.size] = n; this.size ; } // O(1) popback() { if (this.size === 0) return undefined; this.size--; let temp = this.arr[this.size]; this.arr[this.size] = undefined; return temp; } // O(n) resize() { this.capacity *= 2; let newArr = new Array(this.capacity); for (let i = 0; iЗаключение
Динамические массивы — это мощная структура данных, которая сочетает в себе гибкость хранилища с изменяемым размером и эффективность доступа в постоянном времени. Надеюсь это поможет!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3