- •Министерство образования и науки российской федерации федеральное агентство по образованию
- •Захарова ю.Ф. Дискретная математика и ее приложения
- •Введение
- •Глава 1. Введение в теорию множеств.
- •1.1. Основные определения.
- •1.2. Задание множеств
- •1.3. Операции над множествами
- •1.4. Разбиения и покрытия
- •1.5. Представление множеств в эвм.
- •1.5.1. Включение множеств.
- •1.5.2. Объединение множеств.
- •1.5.3. Пересечение множеств.
- •Глава 2. Булева алгебра.
- •2.1. Основные элементарные функции.
- •2.2. Основные элементарные тождества.
- •2.3. Формы представления булевых функций.
- •2.4. Минимизация булевых функций.
- •2.4.1. Метод Куайна.
- •2.4.2. Метод Карно.
- •Глава 3. Исчисление высказываний и исчисление предикатов.
- •3.1. Исчисление высказываний.
- •3.2. Исчисление предикатов.
- •Глава 4. Теория сжатия текстовой информации.
- •4.1. Метод Хаффмена
- •4.1.1. Общие положения
- •4.1.2. Краткое описание метода Хаффмена.
- •4.1.3. Пример использования метода Хаффмена.
- •4.2. Метод Зива Лемпеля (lz-метод)
- •4.2.1. Основные определения
- •4.2.2. Краткое описание lz-метода
- •4.2.3. Пример lz-метода
- •4.3. Метод Зива-Лемпеля-Велча (lzw-метод)
- •4.3.1. Общие положения
- •4.3.2. Краткое описание lzw-метода
- •4.3.3. Пример lzw-метода.
- •4.4. Метод Барроуза-Уиллера.
- •4.4.1. Общие положения.
- •4.4.2. 1 Этап. Преобразование Барроуза-Уилера.
- •4.4.3. 2 Этап. Mtf–метод.
- •4.4.4. 3 Этап. Статистический кодер.
- •4.4.5. Модификации различных этапов.
- •4.4.6. Сравнение алгоритмов сжатия на базе bwt с другими методами.
- •Глава 5. Теория сжатия графической информации. Введение.
- •5.2. Волновой метод (wavelet-метод)
- •5.2.1. Описание метода
- •5.2.2. Пример волнового метода
- •5.3. Дискретное косинус-преобразование (дкп-метод).
- •5.3.1. Описание метода.
- •5.3.2. Пример дкп-метода.
- •5.4. Классический алгоритм jpg.
- •5.5. Фрактальный алгоритм.
- •Глава 6. Введение в криптографию. Введение.
- •6.1. Методы перестановки
- •6.1.1. Матрицы
- •6.1.2. Маршруты Гамильтона
- •6.1.3. Электрический монтаж
- •6.1.4. Особенности перестановки
- •6.2. Методы подстановки
- •6.2.1. Вектор замен
- •6.2.2. Таблицы Вижинера
- •6.3. Метод замены. Использование алгебры матриц.
- •6.4. Аддитивные методы
- •6.5. Стеганология
- •6.6. Ключ. Основные понятия, связанные с ключом и алгоритмом.
- •6.6.1. Основные понятия.
- •6.6.2. Ключ.
- •6.6.3. Случайные и псевдослучайные числа.
- •6.6.4. Действия по шифрованию информации.
- •6.7. Блочные и поточные шифры.
- •6.8. Алгоритмы des, Triple des и их заменяющие.
- •6.8.2. Алгоритм Triple des
- •6.8.3. Коммерческие алгоритмы, заменившие des
- •6.9. Системы с открытым ключом.
- •6.10. Электронная подпись.
- •6.11. Взлом защищенных файлов.
- •6.11.1. Атака на ключ
- •6.11.2. Атака на алгоритм.
- •6.11.3. Скомпрометированный пароль.
- •6.11.4. Подделка открытых ключей.
- •6.11.5. Не до конца удаленные файлы.
- •6.11.6. Вирусы и закладки.
- •6.11.7. Виртуальная память.
- •6.11.8. Нарушение режима физической безопасности. Радиоатака. Фальшивые даты подписи.
- •6.11.10. Утечка информации в многопользовательской среде.
- •Содержание
- •Глава 6. Введение в криптографию. 1
4.1.3. Пример использования метода Хаффмена.
Исходный текст (223 знака, прописные буквы для простоты заменены строчными, знаки препинания и переводы строк удалены, межсловный пробел заменен подчеркиванием, в каждой строке по 50 символов):
ехали_меаведи_на_велосипеде_а_за_ними_кот_задом_на
перед_а_за_ним_комарики_на_воздушном_шарике_а_за_н
ими_раки_на_хромой_собаке_волки_на_кобыле_львы_в_а
втомобиле_зайчики_в_трамвайчике_жаба_на_метле_едут
_и_смеются_пряники_жуют
По этому тексту получаем следующую статистику:
е17 х2 а24 л7 и20 _40 м12 д7 в9
н11 о13 с4 п3 з6 к11 т7 р7 у3
ш2 й3 б4 ы2 ь1 ч2 ж2 ю2 я2
или после сортировки по убыванию частот
_40 а24 и20 е17 о13 м12 н11 к11 в9
л7 д7 т7 р7 з6 с4 б4 пЗ йЗ
у3 х2 ш2 ы2 ч2 ж2 ю2 я2 ь1
Кодовые последовательности после применения алгоритма Хаффмена:
_ 111 а 010 и 000 е 1100 о 1000 м 0110 и 0010 к 0011 в 11010 л 10100 д 10101 т 10010 р 10011 з 110110 с 101100 б 101101 п 011110 и 011100 у 011101 х 1101110 ш 1101111 ы 1011110 ч 1011111 ж 1011100 ю 1011101 я 0111110 ь 0111111
Применяя эти кодовые последовательности для кодирования текста, получаем такой двоичный текст (длина строки — 64 бита):
110011011100101010000011101101100101011101011001010100011100100101111101011001010010001011000000111101100101011100111010111110110010111001000001100001110011100010010111110110010101011000011011100100100111101100100111100101011110101111101100101110010000011011100111000011001010011000001100011100100101111101010001101101010101110111011110010100001101111101111010100110000011110011101011111011001011100100000110000111100110100011000111001001011111011101001110000110100001110011110110010001011010100011110011111010100010100001100011100100101110011100010110110111101010011001111010001111111101010111101111101011101011010100101000011010001011010001010011001111101100100111001011111000001100011111010111100101001101001101101001001110010111110000011110011110111000101011010101110010010111011011001001010100110011111001010101110110010111000111101100011011001011101100101011000111110111011110100110111110001000000110001111011100011101101110110010
Получилось немного меньше 119 байтов, так что исходный текст сокращен почти вдвое (правда, если не считать самой кодовой таблицы)
По методу Хаффмена получается максимальное сжатие, и, казалось бы, ни о каком дальнейшем улучшении уже не может быть и речи. Вспомним, однако, что минимизируется математическое ожидание последовательности независимых символов, — код Хаффмена никак не использует информацию о закономерностях чередования символов в кодируемом тексте, закономерностях сложных и плохо описываемых математическими моделями.
4.2. Метод Зива Лемпеля (lz-метод)
4.2.1. Основные определения
"Символ": фундаментальный элемент данных. В обычных текстовых файлах это отдельный байт. В растровых изображениях это индекс, который указывает цвет данного пиксела. Будем ссылаться на произвольный символ как на "K".
"Поток символов": поток символов такой, как файл данных.
"Цепочка": несколько последовательных символов. Длина цепочки может изменяться от 1 до очень большого числа символов. Будем указывать произвольную цепочку как "[...]K".
"Префикс": почти то же самое, что цепочка, но подразумевается, что префикс непосредственно предшествует символу, и префикс может иметь нулевую длину. Будем ссылаться на произвольный префикс, как на "[...]".
"Корень": односимвольная цепочка. Для большинства целей это просто символ, но иногда это может быть иначе. Это [...]K, где [...] пуста.
"Код": число, определяемое известным количеством бит, которое кодирует цепочку.
"Поток кодов": выходной поток кодов, таких как "растровые данные".
"Элемент": код и его цепочка.
"Таблица цепочек": список элементов обычно, но не обязательно, уникальных.
