Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2419

.pdf
Скачиваний:
1
Добавлен:
15.11.2022
Размер:
1.57 Mб
Скачать

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

3.2.1. Понятие и формальное определение машины Тьюринга

Исторически данное понятие было введено в 1936 году логиком Тьюрингом. Тьюринг рассматривал гипотетическую «машину», имеющую конечное множество S внутренних состояний и одну бесконечно длинную ленту, разделенную на ячейки, которую машина могла передвигать на одну ячейку вправо или влево за один такт. В каждой ячейке машина может записывать символ из конечного алфавита А. Первоначально лента должна быть пустой, кроме конечного числа ячеек, заполненных заранее. Эти заранее заполненные ячейки представляют собой программу запуска машины.

Формальное определение машины Тьюринга состоит в сле-

дующем.

Машиной Тьюринга называется пятерка объектов

[ A, S, v, ,

]. А есть конечный алфавит символов, которые мо-

гут быть записаны в ячейках и являются одновременно входными и выходными: A {a0 , a1 , , an }. S есть конечное множество

внутренних состояний, S {s0 , s1 , sr } ; v - функция из S A в S; - функция из S A в A; - функция из S A в множество

{П, Л, ОСТАНОВ}, интуитивный смысл которого станет ясен из дальнейшего.

Машина Тьюринга работает следующим образом. Она на-

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

(П), налево (Л), или остается на месте и прекращает работу (ОСТАНОВ) в зависимости от значения функции .

80

На рисунке схематически изображена лента машины Тьюринга и считывающе-записывающая головка.

Работа машины состоит в повторении следующего цикла: считывание символа из ячейки, впечатывание нового символа в эту ячейку, выбор которого определяет функция (может ока-

заться, что это тот же символ), сдвиг ленты налево или направо либо остановка. Лента бесконечна в обоих направлениях, однако вначале (и, значит, после любого такта) заполнено лишь конечное число ячеек.

3.2.2. Примеры машин Тьюринга

Пример 1. Машина Тьюринга считывает входную последовательность нулей и единиц, печатает Ч, если число единиц четное, и Н, если нечетно. Строке из нулей и единиц предшествуют и последуют пустые ячейки, обозначаемые #. Символы Ч или Н печатаются в первой пустой ячейке вслед за входной строкой. Таким образом, алфавит данной машины Тьюринга имеет вид:

A = {#, 0, 1, Ч, Н}.

Внутренние состояния: S {s0 , s1 , s2 }; s0 - начальное состояние. Машина останавливается по сигналу ОСТАНОВ.

v:

:

 

:

 

(s0 ,0) s1

(s0 ,0) 0

(s0 ,0) Л

(s0 ,1) s2

(s0 ,1) 1

(s0 ,1) Л

(s1,0) s1

(s1

,0) 0

(s1

,0) Л

(s1,1) s2

(s1

,1) 1

(s1

,1) Л

 

 

81

 

 

(si , a j ) ;
v(si , a j ) ;

(s2 ,0) s2

 

(s2 ,0) 0

(s2 ,0) Л

(s2 ,1) s1

 

(s2 ,1) 1

(s2 ,1) Л

(s0 , # ) s0

(s0 , # ) #

(s0 , # ) Л

(s , #) s

 

(s , # ) Ч

(s1 , #) ОСТА

1

1

 

1

 

 

(s

2

, # ) s

2

(s

2

, # ) Н

(s2 , #) ОСТА

 

 

 

 

 

Удобнее задавать функции v, ,

, пользуясь обозначения-

ми Тьюринга. В этом варианте машина Тьюринга задается конечным множеством пятерок [ si , a j , sr , zl , tn ]. В каждой такой

пятерке

si - текущее состояние машины;

a j - символ, считываемый из ячейки;

sr - следующее состояние машины, sr zl - символ, печатаемый в ячейке, zl t n - одна из команд П, Л, ОСТАНОВ.

В этих обозначениях описанная выше машина задается так:

s0

#

s0

#

Л

s0

0

s1

0

Л

s0

1

s2

1

Л

s1

0

s1

0

Л

s1

1

s2

1

Л

s2

0

s2

0

Л

82

s2

1

s1

1

Л

s1

#

s1

Ч

ОСТА-

 

 

 

 

НОВ

s2

#

s2

Н

ОСТА-

 

 

 

 

НОВ

Нетрудно описать машины Тьюринга, вычисляющие разнообразные функции от чисел, подаваемых на вход. Стандартным представлением неотрицательного числа n в машине Тьюринга является последовательность из n+1 единиц, стоящих подряд. Два таких числа отделяются нулем. Так, строка

...##111011##... представляет упорядоченную пару (2,1). Строка

...##111101101011# #... представляет последовательность (3, 1, 0,

1).

Пример 2. Следующая машина Тьюринга складывает два неотрицательных целых числа, поданных на вход:

s0

#

s0

#

Л

s0

1

s1

1

Л

s1

1

s1

1

Л

s1

0

s2

1

Л

s2

1

s2

1

Л

s2

#

s3

#

П

s3

1

s4

#

П

s4

1

s5

#

ОСТАНОВ.

Она превращает две последовательности единиц, разделенные нулем, в последовательность единиц, представляющую число, равное сумме чисел на входе. Можно описать машину Тьюринга, способную сложить три целых числа, четыре целых числа или даже любое не ограниченное наперед количество целых чисел, но эта задача несколько сложнее.

Пример 3. Простая машина Тьюринга, обладающая большими возможностями, чем любой конечный автомат, определяет

83

по любой входной строке вида …##111...1100...00##... (где # - пустые ячейки), одинаково ли число нулей и единиц в такой строке. Алфавит ее состоит из символов 0, 1, Ч, Н, # (в частности, машина может «записывать» пустые ячейки, т. е. стирать имеющуюся запись). Внутренние состояния ее:

S {s0 , s1 , s2 , s3 , s4 , s5 , s6 }.

Пятерки, описывающие машину по Тьюрингу:

s0

#

s0

#

Л

s0

0

s1

#

Л

s0

1

s8

1

П

s1

0

s1

0

Л

s1

1

s1

1

Л

s1

#

s2

#

П

s2

0

s2

0

П

s2

1

s3

#

П

s2

#

s8

0

П

s3

0

s3

0

П

s3

1

s3

1

П

s3

#

s4

0

Л

s4

0

s5

#

Л

s4

1

s7

1

Л

s4

#

s6

1

П

s6

0

s6

0

П

s6

1

s6

1

П

s6

#

s8

Ч

ОСТАНОВ

s5

0

s5

0

Л

s5

1

s5

1

Л

s5

#

s2

1

П

s7

1

s7

1

Л

s7

#

s8

1

П

s8

0

s8

0

П

s8

1

s8

1

П

s8

#

s8

Н

ОСТАНОВ

84

По окончании работы машина справа от входной строки печатает Н, если число нулей равно числу единиц, Ч — в противном случае, и затем останавливается.

85

3.3. Сложность алгоритмов (анализ алгоритмов)

3.3.1.Основные понятия

Сложность алгоритмов – это величина, характеризующая длину описания алгоритма или громоздкость его применения к исходным данным.

Изучение сложностей алгоритмов началось в 60-х годах 20 века. Этот раздел теории алгоритмов имеет важное теоретическое и практическое значение. Разрабатываемые методы оценки сложности алгоритмов позволяют находить наиболее эффективные способы вычисления арифметических функций. В терминах сложности алгоритмов можно уточнить и исследовать многие проблемы, связанные с нахождением оптимального алгоритма для решения конкретных задач.

Класс однородных вычислительных задач называется проблемой (массовой задачей).

Индивидуальные случаи проблемы Т называются частными случаями проблемы Т.

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

Другим примером является задачи коммивояжера. Пара-

метры

этой

массовой

задачи является

множество «городов»

C {c1,c2 ,...,cm}

и расстояний d (ci , c j ) между каждый парой го-

родов

ci и

c j

из C .

Решение

– это

упорядоченный набор

ck1 , ck2 ,..., ckm

заданных городов, который минимизирует величину

 

 

 

 

m 1

 

 

 

 

 

 

 

d (ck , ck

) d (ck

, ck )

 

 

 

 

i 1

i

i 1

m 1

 

 

 

 

 

 

 

Это выражение дает длину маршрута, начинающегося в городе ck1 , проходящего последовательно через все города и воз-

86

вращающегося в ck1 непосредственно из последнего города ck m .

Индивидуальная задача о коммивояжере задается любыми конкретными множествами {c1,c2 ,...,cm} и {d (ci , c j )} .

С каждым частным случаем I проблемы Т (I Т) связывается размер |I|. Эта функция не единственна. Ее выбор определяется теоретическими и практическими соображениями, связанными с точками зрения на эту проблему.

Например, для пары квадратных матриц I ( A, B) , размер-

ности которых -

n

 

n , разумной мерой их умножения может

служить величина

 

I

 

n . Однако, если изучается объем памяти,

 

 

 

 

 

 

 

необходимый для алгоритма умножение матриц, то мера I n2 .

В задаче о коммивояжере |I| можно определить как количество данных городов m.

Пусть Т – проблема и А – алгоритм, решающий ее. При решении частного случая I Т алгоритм А выполняет некоторую последовательность вычислений SI .

Важны следующие характеристики:

1.длина SI , которая характеризует время вычисления,

2.глубина SI , то есть число уровней параллельных шагов, на которые SI может быть разложено,

3.объем памяти, требуемый для вычисления SI ,

4.число арифметических операций при алгебраических вычислениях или число обращений к памяти.

Размер |I| выбирается так, чтобы все частные случаи I одинакового размера n решались при помощи одной и той же схемы Cn . Сложность схемы Cn определяется как и I, так и другими

мерами сложности.

После выбора меры вычисления S , функция сложности вычисления FA определяется несколькими способами. Главные

из них – сложность в наихудшем случае и сложность поведения в среднем.

Сложность в наихудшем случае

87

 

 

 

FA (n) max{

(SI )

I T ,

I

n} .

Сложность поведения в среднем

 

 

 

M A (n)

p(I ) (SI ) ,

 

 

 

 

I Tn

где: Tn I

 

n и p(I )

вероятность появления I среди

I T ,

I

других случаев размера n.

 

 

 

 

3.3.2. Классификация задач по степени сложности

Сложность задачи – это сложность наилучшего алгоритма известного для ее решения.

Для оценки сложности важно следующее определение.

Функция

(n) есть O(g(n)) , если существует константа С, такая,

 

 

 

 

 

что n

 

f (n)

C

g(n)

.

 

 

 

 

 

 

Основной вопрос теории сложности – насколько успешно или с какой стоимостью может быть решена заданная проблема Т? Цель заключается в рассмотрении всех возможных алгоритмов решения Т и попытке формулировки утверждения о вычислительной сложности внутренне присущей Т. Любой алгоритм А для Т дает верхнюю оценку величины FA сложности Т. Однако знание нижней оценки представляет интерес математический, т.к. это дает руководство в поиске хороших алгоритмов, указывая заведомо ложные попытки.

Быстрыми являются линейные алгоритмы, которые обладают сложностью порядка n и называются также алгоритмами порядка O(n) , где n – размерность входных данных.

К линейным алгоритмам относится алгоритм нахождения суммы двух десятичных чисел. Его сложность – O(n1 n2 ) .

Существуют алгоритмы быстрее линейных. Например, алгоритм двоичного поиска в линейном упорядоченном массиве. Его сложность – O(log2 n) , где: n – длина массива.

88

Полиномиальным алгоритмом (алгоритм класса Р) называется алгоритм, у которого временная сложность равна o(nk ) , где

k – целое число 0. алгоритмы для временной сложности которых не существует такой оценки называются экспоненциальными (алгоритмы класса Е).

Задача считается труднорешаемой, если для нее не существует разрешающего полиномиального алгоритма.

Задача называется «хорошей», если для нее существует полипомиальный алгоритм.

Примеры алгоритмов класса Р:

1. Задача Прима – Краскала. Дана плоская страна и в ней n – городов. Нужно соединить все города телефонной связью так, чтобы общая длина телефонных линий была минимальной. Эта задача решается с помощью жадного алгоритма сложности O(n log n) .

2.Кратчайший путь на графе, состоящем из n вершин

иm ребер. Сложность – O(mn ) .

3.Быстрое преобразование Фурье - O(n log n) , обыч-

ное преобразование Фурье – O(n2 ) .

4.Умножение чисел. Алгоритм Шенхаге–Штрассена

-O(n log n log log n) . Школьный метод умножения O(n2 ) .

5.Умножение матриц размерности (n n). Алгоритм Штрассена O(nlog2 7 ) . Очевидный алгоритм О(n3).

Примеры алгоритмов класса Е:

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

89

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]