Московский государственный университет имени М.В.Ломоносова
Опубликован: 15.03.2007 | Доступ: свободный | Студентов: 611 / 26 | Оценка: 5.00 / 4.50 | Длительность: 19:30:00
Специальности: Программист
Лекция 1:

Что такое алгоритм?

Вычислимые функции и разрешимые предикаты.

Каждая машина Тьюринга М вычисляет частичную функцию \ph_М из \cal A^* в \cal A^*, отображающую вход \alpha в результат работы МТ на входе \alpha при условии, что результат работы является словом во внешнем алфавите. Для входов, на которых машина не останавливается или результат содержит символы из \cal S\setminus\cal A, функция \ph_М не определена. Из определения ясно, что любая МТ вычисляет ровно одну функцию (быть может, нигде не определенную).

Определение 1.1 Частичная функция f из \cal A^* в \cal A^* называется вычислимой, если существует машина Тьюринга М, для которой \ph_М=f. При этом будем говорить, что f вычислима на М.

Не все функции вычислимы. Это ясно из сравнения мощности множества функций (континуум) и мощности множества машин Тьюринга (счетное множество). Более интересные примеры см. в задачах 1.3-1.5.

Под предикатом будем понимать некоторое условие, которое выполняется (предикат истинен) или не выполняется (предикат ложен) для каждого слова из \cal A^*. Определенные таким образом, предикаты легко отождествляются с языками (подмножествами слов в \cal A^* ) — предикату соответствует множество слов, на которых он истинен. Каждому предикату сопоставим характеристическую функцию, которая равна 1 на множестве слов, для которых предикат истинен, и равна 0 на множестве слов, для которых предикат ложен. Мы будем обозначать характеристическую функцию так же, как и сам предикат. Предикат разрешим, если его характеристическая функция вычислима. О машине Тьюринга, вычисляющей характеристическую функцию предиката, будем говорить, что она дает ответ ("да" или "нет") на вопрос "истинно ли значение предиката на входе \alpha?"

Понятия вычислимой функции и разрешимого предиката будут использоваться и для функций (предикатов) от многих переменных.

Пусть \cal A — некоторый алфавит, а n — натуральное число. Пусть Mмашина Тьюринга с внешним алфавитом \cal A\cup\{\#\}. Построим частичную функцию \ph_{M,n} из (\cal A^*)^n в \cal A^* так: \ph_{M,n}(\alpha_1,\dots,\alpha_n)=y, если результат работы машины M на входе \alpha_1\#\alpha_2\#\dots\#\alpha_n\# совпадает со словом y. Если машина не останавливается или на ленте записано что-нибудь не то (например, символы не из алфавита \cal A и т.п.), то \ph_{M,n}(\alpha_1,\dots,\alpha_n) не определена.

Определение 1.2. Частичная функция f из (\cal A^*)^n в \cal A^* называется вычислимой, если существует машина Тьюринга М, для которой \ph_{М,n}=f.

Предикат от нескольких переменных разрешим, если его характеристическая функция вычислима.

Нас будут интересовать ресурсы, требующиеся для вычислений. Два важнейших ресурса — время и память. Будем говорить, что машина Тьюринга M работает за время T_М(n), если максимальное (по всем входам длины n ) количество тактов, которое проработает М до остановки, равно T_М(n). Аналогично, машина Тьюринга M работает на памяти S_М(n), если наиболее удаленное от начала ленты положение головки при вычислениях на входах длины n равно S_М(n).

Вычисления на машинах Тьюринга.

Очевидно, что МТ задает алгоритм в смысле приведенного выше неформального определения. Обратное утверждение называется тезисом Черча:

"любой алгоритм может быть реализован машиной Тьюринга"

Не вдаваясь в обсуждение тезиса Черча, заметим, что в настоящее время нет серьезных оснований подвергать его сомнению. Все известные в настоящее время алгоритмы реализуются машинами Тьюринга. Подробное изложение теории алгоритмов читатель может найти в книгах [1, 5, 6, 10, 13, 16, 17]. Мы же ограничимся краткими неформальными пояснениями приемов программирования на машинах Тьюринга.

Возможности машины Тьюринга при таком неформальном обсуждении — это возможности человека с ограниченной памятью, карандашом и ластиком, которому вручили неограниченной (бесконечной) толщины тетрадь. Страницы тетради имеют ограниченный размер (все возможные варианты заполнения страницы образуют алфавит МТ при строгом описании). На первых страницах тетради записано входное слово — по одному символу (из внешнего алфавита) на страницу. Человек может листать тетрадь, стирать символы, записывать новые. Заканчивается эта его деятельность тем, что он закрывает тетрадь (сдвиг головки влево в положении 0) и возвращает результат своей работы.

Представив себя в такой ситуации, легко сообразить, что можно, запоминая несколько символов, выполнять любые действия на ограниченном количестве подряд идущих страниц; можно ставить на страницах дополнительные пометки (ограниченное количество на каждой); можно листать тетрадь, пока не найдется нужная пометка; можно копировать символы на свободные страницы тетради. Свободные места на страницах можно также использовать для хранения вспомогательных слов произвольной длины (как и входное слово, они записываются по одному символу на страницу), над которыми может поработать другой человек (это называется "вызов подпрограммы"). В частности, эти вспомогательные слова позволяют поддерживать счетчики (целочисленные переменные). Используя счетчики, можно адресоваться к ячейкам памяти по их номеру.

Поскольку описание любой машины Тьюринга является конечным объектом, его можно закодировать словом в некотором алфавите. В нашей неформальной ситуации легко понять, что существует универсальная машина Тьюринга U, которая, получая на вход пару ([М],x), дает выход \ph_M(x). Здесь через [М] обозначено описание некоторой машины Тьюринга М. Действительно, предположим, что тетрадь начинается со страниц, где записаны инструкции по работе. Тогда выполнять эти инструкции можно следующим образом: пометим текущую страницу; пролистаем тетрадь до начального раздела, содержащего инструкции; найдем нужную инструкцию; вернемся назад и выполним ее.

Сложностные классы.

Не для всякой вычислимой функции можно реально осуществить вычисление ее значения. Существование алгоритма не означает, что нам по силам проделать все предписанные действия. Препятствие может заключаться в том, что требуемые для этого вычисления ресурсы слишком велики. Поэтому нас интересует не столько существование алгоритма для решения задачи, сколько существование эффективного алгоритма.

Формализовать это понятие непросто. Принятый сейчас способ состоит в том, что выделяются классы тех функций или предикатов, вычисление которых возможно при задаваемых ограничениях на потребляемые ресурсы.Принадлежность функции тому или иному сложностному классу служит удобной характеристикой возможностей ее эффективного вычисления, не связанной с конкретными реализациями алгоритмов.

Наиболее важные классы получаются, если накладывать ограничения на рост времени работы и/или используемой памяти в зависимости от длины входного слова. А наиболее важное различие между эффективными и неэффективными вычислениями задается функциями полиномиального роста. Функция f(n) — полиномиального роста, если для некоторой константы d при достаточно больших n выполняется неравенство f(n)\leq n^d. В этом случае будем использовать обозначение f(n)=\poly(n).

Определение 1.3. Предикат f на множестве \cb^* принадлежит классу \P (и называется полиномиально вычислимым ), если его характеристическая функция вычислима на машине Тьюринга М, для которой T_М(n)=\poly(n).

Определение 1.4. Предикат f на множестве \cb^* принадлежит классу \PSPACE, если его характеристическая функция вычислима на машине Тьюринга М, для которой S_М(n)=\poly(n).

По аналогии с предикатами можно определить и функции, вычислимые за полиномиальное время, и функции, вычислимые на полиномиальной памяти. Для классов таких функций также используются обозначения P и PSPACE, так что точный смысл этих обозначений нужно восстанавливать из контекста.