Временная сложность добавления множества новых элементов в конец ArrayList

1

Какова будет сложность добавления как 100000 элементов в конец ArrayList, который был создан с размером по умолчанию?

Хорошо, добавление элемента в конец ArrayList будет be O(1), но что было бы полной сложностью добавления, например, 100 000 элементов?

Я думал, что это будет O(n), но некоторые говорят, что это должно быть O(n^2). Что правильно и почему?

  • 0
    Очевидно, это будет зависеть от реализации ArrayList (когда он растет / как часто он будет расти / до какого числа он будет расти). Чем больше он растет, тем ближе сложность к O (n)
  • 0
    @Kon 100000 элементов для ArrayList по умолчанию в Java. новый ArrayList <Integer> ();
Показать ещё 5 комментариев
Теги:
arraylist
big-o

2 ответа

3
Лучший ответ

ArrayList Javadoc утверждает:

Операция add работает в режиме амортизированного постоянного времени, то есть для добавления n элементов требуется время O (n).

Если кто-то заявляет иначе, у них есть хорошая причина, чтобы противоречить разработчикам Java, но по мере того, как встает вопрос, нет ничего, что могло бы опровергнуть, поскольку никаких аргументов не было представлено. ("Некоторые люди говорят" не очень авторитетно...).

1

Единственным фактором, влияющим на вставку вне O (n), является рост емкости. Как быстро это растет? Если ваш элемент вставки по элементу, емкость не корректируется при каждой вставке, но на самом деле довольно редко. Вы жертвуете пространством за эффективность. Поэтому, если, вставив другой элемент, вы достигнете предела емкости, он будет увеличиваться примерно в 1,5 раза (в реализации Sun). Сколько таких настроек вам нужно будет сделать для 100K элементов, если вы начинаете с 10? Около 25... Из них 25 только два последних размера по размеру сопоставимы с N, поэтому с постоянным коэффициентом это O (N).

Однако вы не указали, как вы вставляете эти элементы. Вы можете настроить емкость для хранения ваших 100K-элементов или использовать addAll, которые, я надеюсь, будут делать то же самое. Еще O (N)

  • 0
    Ответ правильный, но аргументация - нет. Сейчас ваш ответ гласит: «Вам нужно изменить размеры O (log (n)) и добавить O (n) в постоянное время, так что всего O (n)». Однако для изменения размеров требуется линейное время. Следовательно, фактическим результатом этого аргумента является O (n * log (n)). Вам не хватает важной части, которая, поскольку изменение размеров начинает занимать больше времени, также происходит реже.
  • 0
    Да, просто исправляю это
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню