Существует красивая структура, называемая расширяемым массивом, которая имеет вставку O (1) в худшем случае и накладные расходы памяти O (n) (то есть она асимптотически сопоставима с динамическим массивом, но имеет худший случай O (1) вставки). Хитрость заключается в том, чтобы использовать подход, который использует вектор - дублирование и копирование - но сделать копирование ленивым. Например, предположим, что у вас есть массив из четырех элементов, подобных этому:
[1] [2] [3] [4]
Если вы хотите добавить новое число, скажем 5, вы начинаете с выделения массива, который в два раза больше:
[1] [2] [3] [4]
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
Далее вы вставляете 5 в новый массив:
[1] [2] [3] [4]
[ ] [ ] [ ] [ ] [5] [ ] [ ] [ ]
Наконец, опустите 4 из старого массива в новый:
[1] [2] [3] [ ]
[ ] [ ] [ ] [4] [5] [ ] [ ] [ ]
С этого момента, каждый раз, когда вы делаете вставку, добавляете элемент в новый массив и вытягиваете еще один элемент из старого массива. Например, после добавления 6 мы получим
[1] [2] [ ] [ ]
[ ] [ ] [3] [4] [5] [6] [ ] [ ]
Вставив еще два значения, мы получим здесь:
[ ] [ ] [ ] [ ]
[1] [2] [3] [4] [5] [6] [7] [8]
Если нам теперь нужно добавить еще один элемент, мы отбрасываем пустой теперь старый массив и выделяем массив, вдвое больший, чем текущий массив (способный содержать 16 элементов):
[1] [2] [3] [4] [5] [6] [7] [8]
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
И повторите этот процесс. Не учитывая стоимость выделения памяти (которая обычно является сублинейной по размеру массива), вы выполняете не более O (1) работы за вставку.
Поиски все еще O (1), так как вы просто решаете, какой из двух массивов искать, а вставки в середине O (n) из-за тасования.
Если вам интересно, у меня есть Java-реализация этой структуры на моем личном сайте. Я не знаю, насколько вы ее найдете, но вы можете попробовать это из.
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ : Если вы хотите потратить немного времени на чтение исследовательской работы и попытаться реализовать довольно сложную структуру данных, вы можете получить тот же результат (худший - case O (1) append) в O (& radic; n) пространстве (что, кстати, оптимально) с использованием идей, представленных в этой статье. Я никогда не удосужился реализовать это, но это безусловно, стоит прочитать, если память является супер дефицитным ресурсом. Интересно, что эта конструкция использовалась в качестве подпрограммы!