
- •§ 8. Диафантовы множества.
- •Теорема Лагранжа.
- •8.1. Разрешимость в натуральных числах.
- •Определение.
- •Определение.
- •Теорема 8.1.
- •Теорема 8.2.
- •Необходимость.
- •Достаточность.
- •8.2. Нумерация кортежей.
- •Канторова нумерация.
- •Геделево кодирование.
- •Определение.
- •Теорема 8.3.
- •Теорема 8.4.
- •Определение.
- •0.2. Машина с неограниченными регистрами (мнр) [Ктл, c.16]
- •0.3. Равнодоступные адресные машины (рам) [Ахо, с.22]
- •Типы операндов.
- •Команды.
- •0.4. Интерпретация программы как функции.
- •0.6. Вычислительная сложность рам-программ.
- •Определение.
- •Определение.
- •Определение.
- •Логарифмический критерий.
- •0.7. Модификации рам.
- •0.8. Неветвящиеся программы и равномерный весовой критерий.
- •Определение.
- •0.9. Неветвящиеся программы и логарифмический весовой критерий.
- •0.10. Ветвления.
- •0.11. Операции с двоичными векторами фиксированной длины. Определение.
- •Определение.
- •0.12. Машина Тьюринга (k-ленточная).
- •Определение.
- •Определение.
- •0.13. Связь мт и рам.
- •Теорема 0.1.
- •Утверждение 1.
- •Утверждение 2.
- •§ 1. Структуры данных. Определение.
- •1) Вставка.
- •2) Удаление.
- •1.1. Очередь и стек. Определение.
- •Определение.
- •1.2. Множества. Представление множеств.
- •1) Применение списков.
- •3) Представление в виде массивов.
- •4) Представление в виде графа.
- •Определение.
- •Определение.
- •§ 2. “Разделяй и властвуй”.
- •Теорема 2.1
- •§ 3. Динамическое программирование
- •Алгоритм 3.1.
- •§ 4. Редактирующее расстояние
- •Алгоритм 4.1.
- •Алгоритм 4.2.
- •§ 5. Порядковые статистики Определение.
- •Алгоритм 5.1
- •Теорема 5.2.
- •§ 6. Вхождение образца
- •Определение.
- •Алгоритм 6.1a.
- •Алгоритм 6.1б. Вычисление функции отказов.
- •Теорема 6.2.
- •Алгоритм 6.1.Б вычисляет f за o(n) шагов.
- •Конец пока
- •Алгоритм lz
- •Дельта – алгоритм
- •Арифметическое кодирование
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 x0 do begin
if x1
then d d-1;
JUMP endif
else d d+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))).