Неразрешимые задачи и сложность вычислений

11 класс, углублённый уровень. Обзорный практикум к четырнадцатой паре: шесть задач — остановится ли программа, где ошибётся проверенная функция и как растёт время работы.

Что нужно сделать
Шесть задач — по одной на каждый вопрос темы, и все сразу на странице: решай в любом порядке. Ответил верно — вопрос закрыт. Ошибся — сразу видно, как это решается, а вопрос остаётся открытым: кнопка «Новые числа» даёт ту же задачу с другими данными. Времени нужно минут двадцать пять; значения переменных удобно выписывать на черновике столбиком.
Программы — картинкой
Код в задачах нарисован картинкой: его не запускают, а читают. Вся тема как раз про то, что можно узнать о программе, не запуская её, — и чего нельзя узнать даже запуском.
Отметка
Закрыто 6 из 6 — «5», 5 — «4», 3 или 4 — «3». Исправленная задача не засчитывается — за ошибку приходит новая, без ограничений: добирать можно до пятёрки. Кнопка «Получить код» появляется, как только закрыто три вопроса.
Короткий ответ — знак в знак
Ответ везде — целое число: 153, а не 153 раза. На КЕГЭ ответ читает машина, и здесь так же.
Как сдать
В конце появится код работы и кнопка «Сдать работу»: впишешь код ученика, кнопка сама откроет форму с уже вписанным кодом. Переписывать код руками не надо — на этом чаще всего и ошибаются.
Не успел на уроке
Открой эту же страницу дома и пройди целиком: вариант будет другой, а сдаётся всё так же — одним кодом.

Вопросы темы

наработано на—

Подсказка: неразрешимые задачи и сложность вычислений

Алгоритмически неразрешимые задачи

Задача алгоритмически неразрешима, если не существует алгоритма, который решает её при любых входных данных. Самая известная — задача останова (Тьюринг, 1936): по тексту любой программы и её входным данным узнать, завершится ли она.

Почему такой программы-«анализатора» нет. Допустим, она есть. Напишем программу Наоборот: она берёт текст программы, спрашивает анализатор, остановится ли эта программа на собственном тексте, и делает наоборот — если «остановится», уходит в вечный цикл, если «нет» — сразу останавливается. Что будет, если дать Наоборот её собственный текст? Остановится — значит, анализатор сказал «нет»; не остановится — значит, он сказал «да». Анализатор ошибся в любом случае — значит, его не бывает.

«Запустить и подождать» не помогает: если программа не остановилась за час, неизвестно, остановится ли она через два.

Невозможность автоматической отладки

Не бывает и программы, которая про любую программу скажет, верно ли та работает на всех входах: с её помощью решалась бы задача останова. Тесты помогают, но тестирование показывает наличие ошибок, а не их отсутствие (Э. Дейкстра): тестов конечное число, входов — бесконечно много. Функция, верная на числах до 100, может ошибиться на 121.

А конкретную программу проверить можно

Неразрешима задача для всех программ сразу. Про конкретную программу часто можно рассуждать. Если всё, что программа помнит, — одно число n, выпиши его значения столбиком: дошли до выхода из цикла — программа завершится; значение повторилось — дальше всё пойдёт по тому же кругу, программа не завершится никогда.

Сложность вычислений

Время работы оценивают числом действий в зависимости от размера данных n, память — числом хранимых значений. Важен порядок роста: O(n²) — растёт не быстрее c·n².

что в программесколько раз выполнится телопорядок
цикл по n, в нём цикл по mn · mn²
внутренний цикл до i (или от i до n)0 + 1 + … + (n − 1) = n(n − 1)/2n²
три цикла, i < j < kn(n − 1)(n − 2)/6n³
i умножается на 2, пока i < nстолько, во сколько шагов 2c дорастёт до nlog n
цикл по n, в нём деление пополамn · (число делений)n · log n

Как растут время и память

сложностьn выросло в r раз
nвремя ×r
n²время ×r² (вдвое больше n — вчетверо дольше)
n³время ×r³
2ⁿ (перебор)n выросло на d — время ×2d

Таблица n × n чисел при n вдвое больше занимает вчетверо больше памяти. Паролей длины L из k знаков — kL: длиннее на один знак — перебор в k раз дольше.

Какой алгоритм выгоднее

Одну задачу решают алгоритмы разной сложности: поиск — линейный (n сравнений) и двоичный (около log₂n, только в упорядоченном массиве); сортировка — выбором (n(n − 1)/2) и слиянием (около n · log₂n). Сравнить a·n² и b·n просто: a·n² > b·n при n > b/a. Полиномиальные алгоритмы (n, n², n³) при больших n всегда выгоднее переборных (2ⁿ), хотя при малых n бывает наоборот: 2⁵ = 32 < 5³ = 125. В заданиях 26–27 ЕГЭ перебор всех пар для n = 10⁶ — это 10¹² действий, и программа не успеет: нужен алгоритм порядка n.

Материалы подготовлены с использованием технологий искусственного интеллекта.