
- •Глава 4 алгоритмы и машины тьюринга
- •4.1. О понятии алгоритма. Тезис Чёрча
- •4.2. Машина Тьюринга
- •Примеры решения задач
- •Задачи для самостоятельного решения
- •4.3. Рекурсивные функции
- •Примеры решения задач
- •Задачи для самостоятельного решения
- •Разрешимые и перечислимые множества
- •Универсальные функции
- •Задачи для самостоятельного решения
- •4.5. Алгоритмически неразрешимые задачи
- •4.6. О сложности алгоритмов
- •Содержание
4.6. О сложности алгоритмов
Алгоритмическая разрешимость той или иной задачи, вообще говоря, не означает, что задачу можно считать решённой. Может оказаться, что решение задачи потребует такого объёма вычислений, который современный компьютер может сделать лишь за миллионы лет. Например, перебор всех вариантов шахматных партий относится к числу таких задач и не может быть осуществлён за реальное время. Поэтому важную (и всё возрастающую) роль приобретает не только доказательство алгоритмической разрешимости задачи, но и поиск такого алгоритма, который может быть осуществлён за реальное время, т.е. имеет сравнительно небольшую сложность. К понятию сложности вычислений алгоритма есть несколько разных подходов, и в разных разделах теории приводятся разные определения этого понятия, не всегда эквивалентные друг другу. Мы приведём здесь наиболее распространённые .
Предположим,
что у нас есть класс задач, отличающихся
лишь параметром
(где
– некоторое натуральное число). Например,
нахождение наибольшего общего делителя
чисел
и
где
или поиск в графе с
вершинами кратчайшего пути между двумя
вершинами, или вычисление определителя
матрицы
и т.д. Ты будем говорить, что алгоритм
имеетполиномиальную
сложность,
если количество элементарных
вычислений
для решения задачи этим алгоритмом не
превосходит
где
– некоторый многочлен с целыми
коэффициентами. Под элементарным
вычислением мы понимаем вычисление,
производимое за ограниченное (как
правило, небольшое) время. Например,
элементарным вычислением считается
сложение, умножение чисел, пересылка
числа (но не массива чисел) в ячейку
памяти с данным номером и т.д. (при этом
предполагается, что число представляется
машинным кодом фиксированной длины).
Можно сказать, что алгоритм, имеющий
полиномиальную сложность, реализуется
заполиномиальное
время, т.е.
за время, полиномиально зависящее от
параметра
Легко видеть, что если на одном компьютере
алгоритм работает полиномиальное время,
то на любом другом компьютере он будет
работать хотя и другое, но также
полиномиальное время. Конечно, в
определении полиномиальной сложности
можно многочлен
заменить функцией
где
и
– константы. Некоторые алгоритмы требуют
объёма вычислений порядка
где
– константа. Это алгоритмыэкспоненциальной
сложности.
Такие алгоритмы могут быть реализованы
только при небольших значениях параметра
Приведём примеры.
Пример 1.
Алгоритм Евклида нахождения наибольшего
общего делителя двух натуральных чисел
является полиномиальным. Действительно,
первый шаг алгоритма – это деление
на
с остатком:
где
Затем с парой
мы проделываем то же самое, что делали
с парой
и т.д. Окончание алгоритма произойдёт,
когда очередное деление вообще не будет
давать остатка. Так как остатки при
переходе от одного шага к другому
уменьшаются, то не более чем за
шагов произойдёт остановка, и мы получим
ответ (здесь предполагается, что
–верхняя граница рассматриваемых чисел
и
Таким образом, если считать, что деление
с остатком одного числа на другое
делается за
элементарных шагов, то сложность
алгоритма будет порядка
т.е. он не просто полиномиальный, но дажелинейный.
Пример 2.
Вычисление определителя матрицы размера
может быть произведено с помощью
полиномиального алгоритма (хотя, если
делать по определению, вычисляя и
складывая все
слагаемых, то алгоритм будет даже более,
чем экспоненциальным). Действительно,
приведение матрицы к треугольному виду
требует
операций над строками (под операцией
здесь понимается вычитание изi-й
строки умноженной на
j-й
строки), а каждая такая операция
осуществляется с помощью не более
сложений и умножений и одного деления
(так как
). После приведения матрицы к треугольному
виду вычисление определителя делается
с помощью
умножений. Таким образом, общее количество
элементарных операций не превосходит
что является многочленом третьей
степени.
Пример 3.
Упорядочение массива из
чисел
может быть осуществлено за полиномиальное
время – нетрудно видеть, что есть простой
алгоритм, решающий задачу с помощью не
более, чем
элементарных операций (не более
сравнений чисел и не более
пересылок).
Другой
подход состоит в рассмотрении машины
Тьюринга, обрабатывающей слова в двоичном
алфавите
причём слово длины
интерпретируется как натуральное число
Говорят, что машина Тьюринга
работает за полиномиальное время,
если существует многочлен
такой, что на любом входном слове длины
машина
останавливается после выполнения не
более чем
операций. Пусть
– множество всех конечных слов в алфавите
Язык
– это любое подмножество множества
Машина Тьюринга
распознаёт
язык
если на всяком входном слове
машина
останавливается в принимающем состоянии,
а на слове
– в отвергающем. Класс
– это класс всех языков, распознаваемых
машинами Тьюринга, работающими за
полиномиальное время. Функция
вычислима
за полиномиальное время,
если существует работающая полиномиальное
время машина Тьюринга такая, что если
на её вход подано слово
то в момент остановки на ленте будет
записано значение
Язык
принадлежит классу
если существует предикат
вычислимый за полиномиальное время, и
многочлен
такие, что
(Здесь
обозначает длину слова
т.е. число входящих в него букв). Ясно,
что
Вопрос о том, совпадают или нет эти
классы языков, до сих пор открыт.
Большинство специалистов считают, что
они не совпадают (так называемая
“гипотеза
”).
В классеNP-языков
выделяются наиболее сложные, называемые
NP-полными,
причём любой NP-полный
язык распознаваем за полиномиальное
время тогда и только тогда, когда
Для решения ряда математических задач весьма эффективны вероятностные алгоритмы, т.е. алгоритмы, в которых тот или иной шаг осуществляется случайным образом. В обычных машинах Тьюринга (их называют детерминированными) переход в новое состояние и сдвиг считывающей головки происходят по жёстким правилам в зависимости от предыдущего состояния и текущего символа на ленте. В вероятностных же машинах это зависит ещё от некоторой случайной величины, распределённой по некоторому вероятностному закону (чаще всего берут величину, принимающую значения 0 и 1 с вероятностью 0,5). Сложность вероятностного алгоритма – это математическое ожидание количества элементарных операций, решающих данную задачу. В настоящее время известны высокоэффективные вероятностные алгоритмы решения многих математических задач (например, задачи поиска простого делителя числа, ряда задач теории графов и т.д.). Важную роль такие алгоритмы играют в теории кодирования и шифрования