В настоящее время алгоритм «растущего» вычисляет, что Array
, поддерживающий ArrayList
/ ArrayBuffer
, слишком мал для запрашиваемой операции, и копирует содержимое в начало большего массива.
jsuereth очень хорошо объясняет это в комментариях этой темы :
ArrayBuffer отлично подходит для добавления, но
не так хорош для подготовки. в Java
ArrayList на самом деле попытается
амортизировать затраты, чтобы подготовиться,
сделать это немного лучше в моем
мнение. Да ArrayBuffer это наверное
достаточно хорошо, если вы просто добавляете
на список и элементы индексации.
Не будет ли хорошим улучшением сделать так, чтобы расположение старого содержимого зависело от последней операции, исходя из предположения, что эта операция может вызываться чаще в будущем?
I. e.:
, если append
требуется больший массив, скопируйте существующее содержимое в начало нового массива:
[x|x|x|x|x|x]
|
v
[x|x|x|x|x|x| | | | | ]
, если prepend
требуется больший массив, скопируйте существующее содержимое в конец нового массива:
[x|x|x|x|x|x]
|
v
[ | | | | |x|x|x|x|x|x]
Решит ли это проблемы с производительностью для prepend, и в целом сделает алгоритм немного более адаптивным к шаблонам использования? (В худшем случае было бы добавление / добавление большого количества материала ...)
Существуют ли какие-либо другие структуры данных, которые уже учитывают последнюю операцию при расширении базовой структуры?