Какова алгоритмическая сложность метода с внешним циклом от 0 до 10 и внутренним циклом от 0 до x
Что проверяют
Умеете ли вы считать сложность, а не угадывать её по числу вложенных циклов. Задача с подвохом: циклов два, а квадрата нет. Следом обычно меняют условие, например внутренний цикл идёт до i или внешний до n, и смотрят, пересчитаете ли вы.
Как отвечать
Сначала запишите код, чтобы договориться об условии:
for (int i = 0; i < 10; i++) { for (int j = 0; j < x; j++) { ... } }
Дальше рассуждение по шагам:
- внешний цикл: фиксированные 10 итераций (или 11, если граница включена), от входных данных не зависит;
- внутренний цикл:
xитераций на каждом проходе внешнего; - итог: тело выполняется
10 * xраз. Константа в O-нотации отбрасывается, получается O(x), линейная сложность; - память: O(1), дополнительных структур нет.
Сразу назовите допущения, это самая сильная часть ответа:
- тело внутреннего цикла выполняется за O(1). Если внутри стоит
list.contains()поArrayListдлиныm, сложность становится O(x · m); - если
xтоже константа, формально это O(1): число операций ограничено и не растёт; - при
x <= 0внутренний цикл не выполнится ни разу, на асимптотику это не влияет.
Покажите, что понимаете вариации. Внешний цикл до n и внутренний до x дают O(n · x). Если внешний идёт до n, а внутренний до i, итераций n*(n-1)/2, это O(n²). При фиксированной границе 10 тот же приём даёт 45 итераций, то есть константу.
Где спотыкаются
Отвечают O(n²), потому что видят два вложенных цикла. Вложенность ничего не значит, пока вы не посмотрели, от чего зависят границы.
Оставляют в ответе O(10x) или O(11x). По сути это не ошибка, но выдаёт неуверенность в правилах нотации: постоянные множители опускаются.
Забывают о стоимости тела цикла. Вызов метода коллекции, склейка строк через + или запрос к базе внутри меняют итоговую оценку сильнее, чем сами циклы.