Какова будет сложность добавления как 100000
элементов в конец ArrayList, который был создан с размером по умолчанию?
Хорошо, добавление элемента в конец ArrayList
будет be O(1)
, но что было бы полной сложностью добавления, например, 100 000
элементов?
Я думал, что это будет O(n)
, но некоторые говорят, что это должно быть O(n^2)
. Что правильно и почему?
ArrayList
Javadoc утверждает:
Операция add работает в режиме амортизированного постоянного времени, то есть для добавления n элементов требуется время O (n).
Если кто-то заявляет иначе, у них есть хорошая причина, чтобы противоречить разработчикам Java, но по мере того, как встает вопрос, нет ничего, что могло бы опровергнуть, поскольку никаких аргументов не было представлено. ("Некоторые люди говорят" не очень авторитетно...).
Единственным фактором, влияющим на вставку вне O (n), является рост емкости. Как быстро это растет? Если ваш элемент вставки по элементу, емкость не корректируется при каждой вставке, но на самом деле довольно редко. Вы жертвуете пространством за эффективность. Поэтому, если, вставив другой элемент, вы достигнете предела емкости, он будет увеличиваться примерно в 1,5 раза (в реализации Sun). Сколько таких настроек вам нужно будет сделать для 100K элементов, если вы начинаете с 10? Около 25... Из них 25 только два последних размера по размеру сопоставимы с N, поэтому с постоянным коэффициентом это O (N).
Однако вы не указали, как вы вставляете эти элементы. Вы можете настроить емкость для хранения ваших 100K-элементов или использовать addAll
, которые, я надеюсь, будут делать то же самое. Еще O (N)