Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TA1_2.DOC
Скачиваний:
11
Добавлен:
02.11.2018
Размер:
444.42 Кб
Скачать

0.4. Интерпретация программы как функции.

Предположим, что программа P всегда считывает с входной ленты n целых чисел и записывает на выходную ленту не более одного целого числа. Пусть x1 , x2 ,... , xn - целые числа в первых n клетках входной ленты, и пусть программа P записывает y в первую клетку выходной ленты, а затем останавливается. Тогда P вычисляет функцию f (x1,...,xn) = y. Легко показать, что РАМ может вычислять в точности частично рекурсивные функции. То есть для произвольной частично рекурсивной функции f можно написать РАМ-программу, ее вычисляющую, и для произвольной РАМ-программы можно указать эквивалентную ей частично рекурсивную функцию.

0.5. Интерпретация программы как языка .

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

Алфавит - это конечное множество символов, которые можно представить целыми числами

1, 2, ... k.

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

Язык - множество цепочек (слов) алфавита.

Язык L  подмножество * : L  *

Данная РАМ допускает (воспринимает) язык в следующем смысле. Пусть на входной ленте находится цепочка s = a1a2...an , причем, символ a1 расположен в первой клетке, а2 - во второй и

т.д., а в (n +1)-ой клетке расположен 0 (концевой маркер), т.е. вход - S0, где S *.

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

Входная цепочка S допускается программой P, если P прочитывает все ее символы и концевой маркер ( 0-конец цепочки ), пишет 1 в первой клетке выходной ленты и останавливается.

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

Языком, допускаемым программой P, называется множество всех цепочек, допускаемых этой программой.

Лемма 0.

1) Язык L допускается некоторой PAM-машиной тогда и только тогда, когда он рекурсивно перечислим.

2) Язык L допускается некоей РAM-машиной, останавливающейся на всех входах тогда и только тогда, когда он рекурсивен.

Пример. [Ахо, с.21]

Пусть k = 2.

Рассмотрим РАМ-программу, которая допускает язык на входном алфавите {1,2}, состоящий из всех цепочек с одинаковым числом вхождений 1 и 2.

Эта программа считывает каждый входной символ в регистр 1, а в регистре 2 оставляет разность d между количеством символов 1 и 2, поступивших до текущего момента. Встретив концевой маркер 0, программа сравнивает d с нулем, в случае совпадения печатает 1 и останавливается.

L  {1,2}*

Возьмем псевдо-язык:

begin

d  0;

READ 1 read x;

while x0 do begin

if x1

then dd-1;

JUMP endif

else dd+1;

endif: READ 1 read x; end;

JUMP while

if d=0 then write 1;

HALT

end;

0.6. Вычислительная сложность рам-программ.

Двумя важными мерами сложности алгоритма являются временная и емкостная сложности, рассматриваемые как функции размера входа.

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

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

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

Средней (или усредненной) сложностью называется “средняя” сложность по всем входам данного размера.

Алгоритм, имеющий большую сложность в худшем случае, может работать достаточно быстро в среднем.

а) временная сложность в среднем случае:

f(n) = Max по всем входам размера n (сумма времен, затраченных на каждую команду).

б) временная сложность в среднем случае:

f(n) = среднее по всем входам размера n (сумма времен, затраченных на каждую команду)

бывает разное : арифметическое, с весом - все зависит от распределения входов.

Для емкостной сложности определения аналогичны.

а) f(n) = Max по всем входам размера n ( Емкости всех регистров, к которым было обращение).

б) f(n) = среднее по всем входам размера n ( Емкости всех регистров, к которым было обращение).

Рассмотрим язык, являющийся полным и непротиворечивым.

Чтобы точно определить временную и емкостную сложности, надо указать время, необходимое для выполнения каждой РАМ-команды, и объем памяти, используемый каждым регистром.

Определим время выполнения команды и размер регистров. Существуют два варианта:

1) равномерный весовой критерий - каждая РАМ-команда затрачивает одну единицу времени, и каждый регистр использует одну единицу памяти.

Если не оговорено противное, то сложность РАМ-программы будет измеряться в соответствии с

равномерным весовым критерием.

2) логарифмический весовой критерий - принимает во внимание ограниченность размера реальной ячейки памяти.

Пусть l(i) - логарифмическая функция на целых числах, заданная равенствами:

Здесь учитывается, что для представления целого числа n в регистре требуется  log n  +1

битов. Регистры же могут содержать произвольно большие целые числа.

Логарифмический критерий основан на грубом допущении, что цена выполнения команды (ее вес) пропорциональна длине ее операндов.

Рассмотрим, например, вес команды ADD*i . Просмотр целого числа i занимает время l(i).

Чтобы прочитать содержимое с(i) регистра i и определить его местоположение, необходимо время l(c(i)). Наконец, считывание содержимого c(i) требует время l(c(c(i))). Т.к. команда ADD*i прибавляет целое число c(c(i)) к целому числу c(0) в сумматоре, разумным весом, который следует придать команде ADD*i , является l(c(0)) + l(i) + l(c(i)) + l(c(c(i))).

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