Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЯП, ТВП / ТЯПМТ / Пособие.doc
Скачиваний:
161
Добавлен:
11.05.2015
Размер:
2.37 Mб
Скачать

1.5. Алгоритмы

Алгоритм - центральное понятие в компиляции и программировании, поэтому важно его формальное определение.

Частичные алгоритмы

Неформальное определение.

Частичный алгоритм состоит из конечного числа команд, каждая из которых может выполняться механически за фиксированное время и с фиксированными затратами.

Для того чтобы быть точным, необходимо определить термин «команда». Кроме того, частичный алгоритм имеет любое число входов и выходов. Эти переменные тоже требуют определения.

Пример.

Алгоритм Евклида

Вход : p и q положительные числа

Выход: g – наибольший общий делитель p и q

Метод.

Шаг 1. Найти r - остаток от деления p и q.

Шаг 2. Если r=0, положить p=q и остановиться. В противном случае положить p=q, затем q=r и перейти к шагу 1.

Данный алгоритм состоит из конечного множества команд и имеет вход и выход. Но можно ли команду выполнять механически с фиксированными затратами времени и памяти?

Строго говоря, нет. p и q могут быть очень большими и, следовательно, затраты на деление будут пропорциональны величинам p и q.

Можно заменить шаг 1 на последовательность шагов, которые вычисляют остаток от деления p на q, причем количество ресурсов, необходимых для выполнения одного такого шага, фиксировано и не зависит от p и q.

Таким образом, мы допускаем, что шаг частичного алгоритма может сам быть частичным алгоритмом.

Алгоритмы

Определение.

Частичный алгоритм останавливается на данном входе, если существует такое натуральное число t, что после выполнения t элементарных команд этого алгоритма либо не окажется ни одной команды этого алгоритма, которую нужно выполнять, либо последней выполненной командой будет «остановиться». Частичный алгоритм, который останавливается на всех входах, т.е. на всех значениях входных данных, называется всюду определенным алгоритмом либо просто алгоритмом.

Пример.

Рассмотрим предыдущий частичный алгоритм: после шага 1 выполняется шаг 2. После шага 2 либо выполняется шаг 1, либо следующий шаг невозможен, т.е. алгоритм остановлен. Можно доказать, что для каждого входа p и q алгоритм останавливается не более, чем через 2q шагов, и значит этот частичный алгоритм является просто алгоритмом.

Другой пример.

Шаг 1. Если x = 0, то перейти к шагу 1, в противном случае остановиться.

Для x = 0 этот частичный алгоритм никогда не остановится.

С точки зрения рассматриваемого нами предмета нас будут интересовать две проблемы:

  • корректность алгоритмов;

  • оценки их сложности.

При этом следует оценивать два критерия сложности:

  • число выполненных элементарных механических операций как функция от величины входа (временная сложность);

  • объем памяти, требующийся для хранения промежуточных результатов, возникающих в ходе вычисления, как функция от величины входа (емкостная сложность).

Пример.

Для алгоритма Евклида число шагов для (p, q) 2q.

Объем использует понятия 3 ячейки p, q, r.

Объем используемой памяти зависит от длины бинарного представления числа  , гдеn наибольшее из чисел p, q (объем памяти).

Рекурсивные алгоритмы

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

Возьмем алгоритм, которому можно предъявлять произвольную цепочку x. После некоторого вычисления алгоритм выдает «да», если цепочка принадлежит языку. Если x не принадлежит языку, алгоритм останавливается и выдает «нет».

Такой алгоритм определяет L язык как множество входных цепочек, для которых он выдает «да».

Если мы определили язык с помощью всюду определенного алгоритма, то последний остановится на всех входах.

Множество, определяемое частичным алгоритмом, называется рекурсивно перечисленным.

Множество, определяемое всюду определенным алгоритмом, называется рекурсивным.

Задание алгоритмов

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

  • машины Тьюринга;

  • грамматики Хомского типа 0;

  • алгоритмы Маркова;

  • лямбда – исчисления;

  • системы Поста;

  • ТАГ – системы и др.

Языки программирования

При дальнейшем анализе мы будем пользоваться формализмом Тьюринга, вводя по мере надобности необходимые нам определения.

Проблемы

Определение.

Проблема – это утверждение (предикат), истинное или ложное в зависимости от входящих в него неизвестных (переменных) определенного типа. Проблема обычно формулируется как вопрос.

Пример:

«целое число x меньше целого y».

Определение.

Частный случай проблемы – это набор допустимых значений ее неизвестных.

Отображение множества частных случаев проблемы во множество {да, нет} называется решением проблемы.

Если решение можно задать алгоритмом, то проблема называется разрешимой.