
- •§ 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
- •Дельта – алгоритм
- •Арифметическое кодирование
Утверждение 2.
Умножение и деление (их можно выполнить с помощью сложений и вычитаний) совершаются за T2 (n). Грубая оценка временных затрат на всю программу составит O(T4 (n)).
O([T(n) lg T(n) lg lg T(n)]2) - более точная оценка.
§ 1. Структуры данных. Определение.
Список - это конечная последовательность элементов, взятых из некоторого подходящего множества.
Простейшей его реализацией является структура последовательно связанных компонент, изображенная на рис. 4.
Каждая компонента в этой структуре состоит из двух ячеек памяти. Первая ячейка содержит сам элемент (сам элемент тоже может быть сложной структурой), вторая - указатель следующего элемента. Это можно реализовать в виде двух массивов :
1) Вставка.
Ниже приведенная процедура позволяет вставить новую компоненту в список.
free - номер незанятой ячейки в массивах name и next, а pos - индекс той компоненты в списке, после которой надо вставить элемент:
procedure Add ( elem, free, pos )
begin
name[ free ] elem;
next [ free ] next [ pos ];
next [ pos ] free;
end;
Любой разумный перевод в команды РАМ приведет к тому, что время выполнения процедуры Add не будет зависеть от размера списка.
Сложность O(1).
2) Удаление.
Для того, чтобы удалить компоненту, следующую за компонентой в ячейке I , можно положить next[I] = next [next [I] ]. Индекс удаленной компоненты можно поместить в список незанятых ячеек памяти.
Сложность O(1).
3) Конкатенация (сцепление) двух списков, в результате чего образуется единственный список.
Конкатенацию можно выполнить за ограниченное (постоянной величиной) число шагов, включив в представление списка еще один указатель. Этот указатель дает индекс последней компоненты списка и тем самым позволяет обойтись без просмотра всего списка для определения его последнего элемента.
4) Расцепление списка, стоящего после некоторого элемента, результатом которой будут два списка.
Расцепление можно выполнить за ограниченное (постоянной величиной) время, если известен индекс компоненты, непосредственно предшествующей месту расцепления.
Сложность O(1).
1.1. Очередь и стек. Определение.
Стеком (или магазином) называют список , элементы которого удаляют и добавляют только на конце списка, т.е. по принципу “последний вошел - первый вышел”.
Часто стек реализуется в виде одного массива. Например, список
Elem 1, Elem 2, Elem 3
м
ожно
хранить в массиве name (рис. 6).
Переменная top является указателем последнего элемента, добавленного к стеку. Чтобы добавить (ЗАТОЛКНУТЬ- PUSH) новый элемент в стек, значение top увеличивают на 1, а затем помещают новый элемент в name [ top ]. Т.к. массив name имеет конечную длину l, перед попыткой вставить новый элемент следует проверить, что top <l-1.
Чтобы удалить (ВЫТОЛКНУТЬ- POP) элемент из вершины стека, надо просто уменьшить значение top на 1. Не обязательно физически стирать элемент, удаляемый из стека.
Чтобы узнать, пуст ли стек, достаточно проверить, не имеет ли top значение, меньшее 0.
Время выполнения операций PUSH и POP и проверка пустоты не зависят от числа элементов в стеке - O(1).