Алгоритмы с нуля
Мышление и сложность: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Ни один из них — не определение для заучивания: каждый отражает решение, которое ты принимаешь, оценивая алгоритм ещё до того, как его запустишь.
Убедись, что связываешь подсчёт шагов, Big-O, классы сложности, компромисс время-память и входные ограничения в одно суждение: вот код и вот лимиты — сколько это стоит и достаточно ли быстро?
Алгоритм выполняет ровно 5n + n²/2 + 1000 базовых операций на входе размера n. Какова его Big-O и почему?
В задаче указано n ≤ 1 000 000 при лимите в 1 секунду. Твоя первая идея — вложенный цикл O(n²). Прочитай ограничение — что оно говорит ещё до написания кода?
Чтобы найти дубликат, можно взять вложенный цикл (время O(n²), память O(1)) или hash set (время O(n), память O(n)). На сервере с запасом памяти и пользователями, ждущими ответ, что выберешь и почему?
В функции один цикл, выполняющийся n раз, и внутри него вызывается бинарный поиск (O(log n)) по отсортированному массиву. Какова её сложность по времени?
Джуниор пишет largestOf с `let largest = 0` вместо `let largest = numbers[0]`, тестирует на нескольких списках из положительных чисел и выкатывает. Какой более глубокий урок, когда функция возвращает 0 для [-5, -3, -1]?
Две процедуры сортировки обе «корректны». Merge sort — время O(n log n) / память O(n); bubble sort — время O(n²) / память O(1). Для сортировки 1 000 000 записей на обычной машине как верно это прочитать?
Сквозная линия юнита — одна привычка: до запуска оцени стоимость. Подсчитай шаги, оставь только доминирующий член, назови класс Big-O, взвесь время против памяти под своё реальное ограничение и дай границе входа подсказать, какой класс вообще допустим. И никогда не путай стоимость с корректностью — Big-O измеряет, насколько быстро, а инвариант цикла доказывает, верно ли это вообще.