Карта / Коллекции / Сложность O(1) vs O(n)

Сложность O(1) vs O(n)

Когда выбираешь коллекцию, важно понимать: сколько шагов нужно операции, чтобы выполниться. Это и называется сложностью алгоритма (Big-O) — подробный разбор самого понятия в теме «Big-O», здесь — применительно к коллекциям.

O(1) — константное время. Не важно, 10 элементов в коллекции или 10 миллионов — операция выполняется за одно и то же время:

HashMap<String, Integer> map = new HashMap<>();
map.get("ключ");   // O(1) — мгновенно, независимо от размера map

O(n) — линейное время. Сложность растёт прямо пропорционально размеру коллекции:

List<String> list = new ArrayList<>();
list.contains("Артур");   // O(n) — в худшем случае проверит каждый элемент
Копнуть глубже

Сравнительная таблица по самым частым операциям:

ОперацияArrayListLinkedListHashMap/HashSetTreeMap/TreeSet
доступ по индексуO(1)O(n)
поиск по значениюO(n)O(n)O(1)O(log n)
вставка в конецO(1)*O(1)O(1)O(log n)
вставка в началоO(n)O(1)

*в среднем — иногда ArrayList нужно расширить внутренний массив, тогда дороже разово.

Вывод простой: для поиска по значению — HashMap/HashSet. Для доступа по индексу — ArrayList. Для частых вставок в начало/середину — LinkedList. Когда нужен порядок — TreeMap/TreeSet, ценой O(log n) вместо O(1).

🎤 Закрыл тему, если можешь объяснить:
• разницу между O(1) и O(n) на примере `get` у HashMap и `contains` у списка;
• какую коллекцию выбрать под задачу поиска/вставки/порядка (если дошёл до 2-го слоя).