- •§ 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
- •Дельта – алгоритм
- •Арифметическое кодирование
§ 5. Порядковые статистики Определение.
k-ым наименьшим элементом последовательности a1, a2,..., an называется такой элемент b этой последовательности, что ai < b не более чем для k-1 значений i и ai b не менее чем для k значений i.
Задача. Найти k-ый наименьший элемент в n-элементной последовательности.
C
пособ
0.
Упорядочить последовательность в порядке неубывания ее элементов и взять k-ый элемент. Сложность O(nlog2n). [ Л1, с.113 ]
Cпособ 1.
Алгоритм 5.1
Вход. Последовательность S из n элементов, принадлежащих линейно упорядоченному множеству, и kN, 1kn.
Выход. k-ый наименьший элемент последовательности S.
Метод. Применяется рекурсивная процедура SELECT.
S
Procedure SELECT(k, S ):
if | S | < 50 then
begin
упорядочить S;
return k-ый наименьший элемент в S
end
else
begin
разбить S на S / 5 последовательностей по 5 элементов в каждой;
при этом останется не более четырех неиспользованных элементов;
упорядочить каждую пятиэлементную последовательность;
пусть M – последовательность медиан этих пятиэлементных множеств;
m SELECT( M /2 , M );
пусть S1, S2, S3 – последовательности элементов из S, соответственно меньших,
равных и больших m;
if S1 k then return SELECT( k, S1 )
else
if ( S1 + S2 k ) then return m
else return SELECT( k – S1 – S2 , S3 )
end
Теорема 5.2.
Алгоритм 5.1 находит k–ый наименьший элемент в n–элементной последовательности S за время O(n).
Корректность алгоритма доказывается индукцией по S .
Пусть T(n) – время, затраченное на выбор k–ого наименьшего элемента из последовательности длины n. M n/5. Следовательно, рекурсивный вызов процедуры SELECT( M /2 , M ) занимает время, не большее T(n/5).
Покажем, что S1 3n/4 , S2 3n/4.
Не менее n/ 10 элементов последовательности M больше или равны m и для каждого из них найдутся в S два различных элемента, которые также соотносятся с m. Следовательно,
S1 n 3 n/ 10 , т.е. при n 50 длина последовательности S1 меньше 3n/4. Аналогичное рассуждение применимо и к S3. Поэтому рекурсивный вызов в строке 10 или 12 занимает времени не более T(3n/4). Все остальные операторы тратят не более O(n) времени. Таким образом , для некоторой постоянной c
§ 6. Вхождение образца
Задача. [ Ахо, с.367]
Определить вхождение слова длины n в строку длины m.( n << m)
char str[m], x[n];
Способ 1.
k = 0; r = 0;
while ( ( str [r + k] == x [k] ) && k < n) k++ ;
if (k == n) begin
слово нашлось
end;
else {r++ ;}
Cложность O(nm).
Алгоритм начинает работу с первого символа цепочки текста str. Если str1 = x1, то рассматривается вторая позиция цепочки текста, k = 1. Если str1 x1, то k = 0, r = 1.
Допустим, что после прочтения i символов k = j. Это означает, что последние j символов цепочки str1…stri совпадают с x1…xj, а последние s символов str1…stri не являются префиксом цепочки x1…xn для s > j . Если stri+1=xj+1 , то k = j+1 . Если stri+1 xj+1 , то k равно наибольшему t, такому, что x1…xt - суффикс цепочки str1…stri+1.
Способ 2.
Чтобы облегчить нахождение значения t , вводится функция f, принимающая целочисленные значения.
