Cheatsheets
Введение в сложность времени выполнения операций
Сначала давайте обсудим временную сложность общих операций, разделенных по структурам данных/алгоритмам. Затем поговорим о разумных сложностях, учитывая размеры входных данных.
Массивы (динамический массив/список)
Дано n = arr.length:
- Добавление или удаление элемента в конце: O(1) амортизированное
- Добавление или удаление элемента из произвольного индекса: O(n)
- Доступ или модификация элемента по произвольному индексу: O(1)
- Проверка наличия элемента: O(n)
- Два указателя: O(n⋅k), где k — работа, выполняемая на каждой итерации, включает скользящее окно
- Построение префиксной суммы: O(n)
- Поиск суммы подмассива по префиксной сумме: O(1)
Строки (неизменяемые)
Дано n = s.length:
- Добавление или удаление символа: O(n)
- Доступ к элементу по произвольному индексу: O(1)
- Конкатенация двух строк: O(n+m), где m — длина другой строки
- Создание подстроки: O(m), где m — длина подстроки
- Два указателя: O(n⋅k), где k — работа, выполняемая на каждой итерации, включает скользящее окно
- Построение строки из объединения массива, stringbuilder и т.д.: O(n)