- •Дискретная математика
- •6.050102 “Компьютерная инженерия” содержание
- •1 Теория множеств 7
- •2 Математическая логика 15
- •3 Формальные теории 35
- •4 Теория графов 47
- •5 Элементы теории чисел 80
- •6 Теория алгоритмов 121
- •Введение
- •1 Теория множеств
- •1.1 Множества и подмножества
- •1.1.1 Элементы множества
- •1.2 Аксиомы теории множеств
- •1.3 Способы задания множеств
- •1.4 Операции над множествами
- •1.5 Элементы алгебры множеств
- •1.5.1 Определение алгебры множеств
- •1.5.2 Основные законы алгебры множеств
- •1.5.3 Принцип двойственности
- •2 Математическая логика
- •2.1 Функции алгебры логики (булевые функции)
- •2.1.1 Способы задания булевых функций
- •2.1.2 Логические функции одной переменной
- •2.1.3 Логические функции двух переменных
- •2.2.6 Функционально полные системы булевых функций
- •2.3 Алгебра буля
- •2.3.1 Определение алгебры. Теорема Стоуна
- •2.3.2 Законы алгебры логики
- •2.3.3 Разложения функций по переменным
- •2.3.4 Приведение логических функций
- •2.3.5 Импликанты и имплициенты булевых функций
- •2.3.6 Методы минимизации логических функций
- •2.4 Алгебра жегалкина
- •2.4.1 Преобразование функций в алгебре Жегалкина
- •2.4.2 Переход от булевой алгебры к алгебре Жегалкина
- •3 Формальные теории
- •3.1 Основные принципы построения формальных теорий исчисления
- •3.2 Определение исчисления высказываний
- •3.2.1 Метатеоремы исчисления высказываний
- •3.2.2 Схемы исчисления высказываний
- •3.3 Исчисление предикатов
- •3.3.1 Определение формальной теории pl
- •3.3.2 Принцип резолюции в исчислении предикатов
- •3.3.3 Схемы доказательств в исчислении предикатов
- •4 Теория графов
- •4.1 История теории графов
- •4.2 Основные определения
- •4.3 Способы представления графов
- •4.3.1 Матрицей смежности
- •4.3.2 Матрицей инцидентности
- •4.4 Пути в графах
- •4.4.1 Задача о кратчайшем пути
- •4.4.2 Алгоритм Дейкстры нахождения кратчайшего пути в графе
- •4.5 Транспортные сети
- •4.5.1 Потоки в транспортных сетях
- •4.5.2 Задача нахождения наибольшего потока в транспортной сети
- •4.5.3 Алгоритм Форда и Фалкерсона нахождения максимального потока транспортной сети
- •4.5.4 Транспортная задача
- •4.6 Обходы в графах
- •4.6.1 Эйлеровы графы
- •4.6.2 Алгоритм Флёри нахождения эйлерова цикла
- •4. Если получился цикл, но не ейлеров, то отбрасываем данную последнюю вершину и повторяем пункт 2.
- •4.6.3 Гамильтоновы циклы
- •4.6.4 Метод ветвей и границ.
- •4.6.5 Метод ветвей и границ в задаче о коммивояжёре
- •4.7 Деревья
- •4.7.1 Построение экономического дерева
- •4.7.2 Алгоритм Краскала
- •5 Элементы теории чисел
- •5.1 Модулярная арифметика
- •5.1.1 Алгоритм Евклида для нахождения наибольшего общего делителя
- •5.1.2 Вычисление обратных величин
- •5.1.3 Основные способы нахождения обратных величин
- •5.1.4 Китайская теорема об остатках
- •5.2 Кодирование
- •5.2.1 Оптимальное кодирование
- •5.3 Обнаружение и исправление ошибок
- •5.3.1 Общие понятия
- •5.3.2 Линейные групповые коды
- •5.3.2 Код Хэмминга
- •5.3.3 Циклические коды
- •5.3.4 Построение и декодирование конкретных циклических кодов
- •5.4 Сжатие информации
- •5.4.1 Исключение повторения строк в последующих строках
- •5.4.2 Алгоритм lzw
- •6 Теория алгоритмов
- •6.1. Основные понятия
- •6.1.1 Основные требования к алгоритмам
- •6.1.2 Блок–схемы алгоритмов
- •6.1.3 Представление данных
- •6.1.4 Виды алгоритмов
- •6.1.5 Правильность программ
- •6.1.6 Эффективность алгоритмов
- •6.1.7 Сходимость, сложность, надежность
- •6.2 Универсальные алгоритмы
- •6.2.1 Основные понятия
- •6.2.2 Машины Тьюринга
- •6.2.3 Рекурсивные функции
- •6.2.5 Тезис Черча-Тьюринга
- •6.2.6 Проблема самоприменимости
- •6.3 Языки и грамматики
- •6.3.1 Общие понятия
- •6.3.2 Формальные грамматики
- •6.3.3 Иерархия языков
- •6.4 Параллельные вычисления
- •Рекомендованная литература
5.4.2 Алгоритм lzw
Алгоритм кодирования последовательности неодинаковых символов.
Предложен Дж. Зивом (J.Ziv), А. Лемпелом (A. Lempel) 1977 г., доработан Терри А. Велчем (Terry A.Welch) 1984 г.
Основан на кодировании подстроки в строке.
Создается таблица строк:
Таблица 5.17 – Проинициализированная таблица строк
Элемент |
Префикс |
Суффикс |
0 1 2 … 255 |
-1 -1 -1 … -1 |
0 1 2 … 255 |
Из однобайтных значений в столбце “Суффикс” алгоритм по мере прохождения файла строит многобайтовые образцы.
Пример.
Пусть обрабатывается строка: Going, going, gone!
После инициализации таблицы строк программа сжати читает букву “G” (код 71) из входного файла и записывает 71 в выходной файл.
Затем читается “o” (код 111) и ищется в таблице строк элемент с префиксом 71 и суффиксом 111. Так как такого элемента нет, то он добавляется в таблицу и выводится суффикс 111 в выходной файл. Послде этого суффикс 111 переносится в префикс и читается новое значение суяяикса из входного файла.
Следующая буква “i” (код 105) становится новым суффиксом. Ищется элемент с префиксом 111 и суффиксом 105. Так как такого элемента нет, то он добавляется в таблицу, а суффикс - в выходной файл. Теперь таблица строк содержит 258 элементов, а выходной файл содержит значения 71, 11, 105:
Таблица 5.18 – Таблица из 258 элементов
Элемент |
Префикс |
Суффикс |
Строка |
0 1 2 … 255 256 257 |
-1 -1 -1 … -1 71 111 |
0 1 2 … 255 111 105 |
Go oi |
Программа будет добалять двух симольные последовательности в балицу, пока не дойдет до 9 – й буквы (“o” во втором слове going ). В этой точке балица содержит 264 элемента:
Таблица 5.19 – Таблица из 264 элементов
Элемент |
Префикс |
Суффикс |
Строка |
0 1 2 … 255 256 257 258 259 260 261 262 263 |
-1 -1 -1 … -1 71 111 105 110 103 44 32 103 |
0 1 2 … 255 111 105 110 103 44 32 103 111 |
Go oi in ng g, ,# #g go |
Суффикс 111 (из элемента 263) перемещается в префикс и читается новый суффикс “i” (код 105) из входного файла. При поиске элемента с префиксом 111 и суффиксом 105 находится совпадение в элементе 257. Поэтому программа делает сжатие:
- значение 257 назначается префиксу и читается новый суффикс “n” (код 110) из входного файла.
Не найдя в таблице строк элемента с префиксом 257 и суффиксом 110, программа добавляет его в таблицу.
Окончательная таблица будет иметь следующий вид:
Таблица 5.20 – Окончательная таблица после обработки всей строки
Элемент |
Префикс |
Суффикс |
Строка |
0 1 2 … 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 |
-1 -1 -1 … -1 71 111 105 110 103 44 32 103 257 259 261 263 110 101 33 |
0 1 2 … 255 111 105 110 103 44 32 103 111 110 44 103 110 101 33 -1 |
Go oi in ng g, ,# #g go oin ng, ,#g gon ne e! ! |
Чтобы получить выходной файл нужно просмотреть содрежимое столбца “Префикс”, начиная с элемента 256 и заканчивая последним.
Наш выходной файл будет содержать 15 – ть значений вместо 20 – ти.
Достоинство LZW:
так как при декодировании программа строит таблицу строк идентичную таблице сжатия, то ее хранить отдельно не нужно.