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

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

Аннотация: В лекции рассматриваются понятие алгоритма и машины Тьюринга, даются определения вычислимых функций, разрешимых предикатов и сложностных классов, приводятся описание булевых функций и таблицы их значений.

Неформально алгоритм — это однозначно определенная совокупность инструкций по преобразованию исходных данных в результат, причем все инструкции элементарны, т.е. при их выполнении "нам придется только механически следовать предписаниям, как если бы мы были роботами: от нас не потребуется ни понимания, ни искусства, ни изобретательности" [5, с. 270]. Формализовать это понятие можно различными способами.

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

F: входные данные -> результат,

Что такое "входные данные" и "результат"? Рассмотрим, например, задачу об умножении двух многочленов с целыми коэффициентами. Тогда входные данные - это пара многочленов. Проблема в том, как записать эти многочлены, чтобы их можно было ввести в компьютер. Машины Тьюринга, которые мы рассматриваем ниже, понимают лишь конечные последовательности символов (слова) из некоторого конечного множества A, называемого внешним алфавитом. Поэтому строгая формулировка вычислительной задачи должна включать в себя алфавит и способ кодировки входных данных. Например, можно записать пару многочленов с использованием 10 цифр, символа переменной x, знаков +, -, * и скобок: (x**2-5)(-4*x+1). В другой кодировке коэффициенты записываются в двоичной системе счисления и перечисляются через запятую; два многочлена разделяются звездочкой: 1, 0, -101* -100, 1. Таким образом, мы имеем две различные вычислительные задачи. С практической точки зрения, обе задачи эквивалентны, поскольку перевод из одной кодировки в другую осуществляется с помощью полиномиального алгоритма. Пока определения полиномального алгоритма у нас нет, давайте будем формалистами: вычислительная задача - это частичная1Под частичной функцией на множестве X здесь и далее понимается функция, область определения которой содержится в X. функция F: A* -> A* (где A* обозначает множество конечных слов в алфавите A ). Потом мы позволим себе некоторую вольность и будем говорить о задаче умножения многочленов или разложения целого числа на множители, имея ввиду, что все разумные кодировки эквивалентны (т.е. переводятся друг в друга при помощи полиномиальных алгоритмов). Однако нужно помнить, что не всякая кодировка является "разумной". Нехорошо, например, представлять натуральное число n набором из n звездочек, потому что длина такой записи экспоненциально велика по сравнению с двоичной или десятичной записью. Заметим также, что в некоторых задачах нет хорошего выбора "разумной" кодировки, в таких случаях (они нам не встретятся) необходимо указывать кодировку всякий раз, когда формулируется задача.

Теперь дадим формальное определение алгоритма.

Машины Тьюринга.

Машина Тьюринга (сокращенно МТ) однозначно задается указанием набора (\cal S, \_, \cal A, \cal Q, q_{0}, \delta), где \cal S, \cal A, \cal Q — конечные множества, причем \cal A\subset\cal S ; \_ — некоторый элемент \cal S\setminus \cal A ; q_{0} — некоторый элемент \cal Q, а \delta — некоторая (частичная, вообще говоря) функция из \cal Q\times\cal S в \cal Q\times\cal S\times\{-1,0,1\}.

Составляющие части МТ называются так:

\cal Sалфавит,

\_ — пустой символ (или пробел),

\cal A — внешний алфавит,

\cal Qмножество состояний управляющего устройства,

q_{0} — начальное состояние,

\deltaфункция переходов.

Состояние МТ задается тройкой (\sigma,p,q), где \sigma — бесконечное слово в алфавите \cal S, т.е. произвольная последовательность s_0,\dots, s_n,\dots элементов \cal S ; p — неотрицательное целое число; q\in\cal Q. Символы слова \sigma будем, как это принято, представлять записанными на ленте, разбитой на ячейки, по ячейке на символ. На ленте также имеется головка, которая расположена над ячейкой с номером p. Наглядно это изображается так:


Помимо ленты машина Тьюринга имеет управляющее устройство, состояние которого задается элементом q множества \cal Q.

Состояния МТ меняются дискретно. За один такт работы управляющее устройство выполняет следующие действия (полагаем, что МТ находится в состоянии (\sigma,p,q) ):

  1. читает символ, находящийся под головкой (т.е. определяет s_p );

  2. вычисляет значение функции переходов: \delta(q,s_p)=(q',s,\Delta p) (если функция переходов на паре (q,s_p) не определена, то останавливает машину Тьюринга);

  3. записывает на ленту в ячейку p символ s, сдвигает головку на \Delta p и переходит в состояние q' (другими словами, новое состояние машины задается тройкой ((s_0,\dots,s_{p-1},s,s_{p+1},\dots), p+\Delta p,q') );

  4. если p+\Delta p<0, то останавливает машину.

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

Работа машины Тьюринга будет всегда начинаться из состояния (\alpha\_\dots,0,q_0), где за конечным словом \alpha, состоящим из символов внешнего алфавита (множество таких слов обозначается \cal A^* ), следует бесконечное слово, целиком состоящее из пустых символов. Слово \alpha будем называть входом МТ. В любой момент времени слово, записанное на ленте, однозначно записывается в виде \sigma\_\dots, где последний символ слова \sigma — не пустой, а за ним идут только пустые символы. Будем называть слово \sigma используемой частью ленты.

Выполняя один такт работы за другим, машина Тьюринга порождает последовательность состояний (\sigma_0,0,q_0), \,(\sigma_1,p_1,q_1), \, (\sigma_2,p_2,q_2),\,\dots

Если МТ останавливается, используемая часть ленты в достигнутом перед остановкой состоянии называется результатом работы МТ.