
- •Самарский государственный архитектурно-строительный университет
- •«Защита информации»
- •Оглавление
- •1.Постановка задачи
- •2.Аналитическая часть
- •3. Конструкторская часть
- •3.1.Формирование таблицы частот
- •3.2.Построение дерева Хаффмена
- •3.3. Кодирование выбранного для проверки слова
- •3.4. Декодирование сообщения
- •Библиографический список
Министерство образования и науки РФ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
Самарский государственный архитектурно-строительный университет
Факультет информационных систем и технологий
Кафедра прикладной математики и вычислительной техники
Отчет по лабораторной работе № 1
по дисциплине:
«Защита информации»
-
ВЫПОЛНИЛ студент группы
ПРОВЕРИЛ проф., д.т.н.
Прохорова О. В.
оценка
Самара
2013 г.
Оглавление
1. Постановка задачи 3
2. Аналитическая часть 4
4
3. Конструкторская часть 7
3.1. Формирование таблицы частот 7
3.2. Построение дерева Хаффмена 7
3.3. Кодирование выбранного для проверки слова 9
3.4. Декодирование сообщения 9
Библиографический список 12
1.Постановка задачи
Взять ФИО студента, подсчитать по тексту частоту встречающихся символов.
Построить дерево Хаффмена. Определить коды символов.
Составить слово из символов полученного алфавита. Закодировать его.
Отдать закодированное слово для декодирования вместе со словарем и частотой букв.
Получить для декодирования словарь и код, декодировать полученное сообщение, построив дерево Хаффмена.
Оформить отчет.
2.Аналитическая часть
Алгоритм Хаффмена применяется при передаче информации по сети при удаленном доступе (протокол Тelnet ) . Предположим, что у нас есть алфавит из n символов. Нужно закодировать сообщение в виде строки бит. Присвоим каждому символу алфавита определенную последовательность бит (код). Затем соединим отдельные коды символов, составляющих сообщение, и получим кодировку сообщения. Пусть символам назначены следующие коды: A = 010; B = 100; C = 000; D = 111. Сообщение ABACCDA кодируется как 010100010000000111010.
Такая кодировка считается неэффективной. Более эффективным считается подход, который использует частоту повторения кода, а именно: чаще всего повторяющемуся символу присваивается более короткий код, а менее частому более длинный. Введем в рассмотрение таблицу следующего вида:
Таблица 1.1. Назначение кодов, соответствующих частоте повторения символов
-
Символ
Частота
Код
А
3
0
B
1
110
C
2
10
D
1
111
При использовании этих кодов сообщение ABACCDA кодируется как 0110010101110, что требует лишь 13 бит. В очень длинных сообщениях, которые содержат символы, встречающиеся чрезвычайно редко, экономия существенна. Обычно коды создаются не на основе частоты вхождения символов в отдельно взятом сообщении, а на основе их частоты во всем множестве сообщений.
Отметим, что если используются коды переменной длины, то код одного символа не должен совпадать с началом кода другого символа. Такое условие должно соблюдаться, если декодирование происходит слева направо.
Такой подход к кодированию на основе учета частоты повторения символов в сообщениях позволяет реализовывать оптимальное кодирование информации. Операция предполагает использование структуры бинарного дерева. Каждый лист представляет символ исходного алфавита. Каждый узел представляет соединение символов из потомков данного узла.
На рис. 1.1 приведено бинарное дерево, построенное с использованием рассмотренного выше примера. Каждый узел содержит символ и его частоту. Бинарное дерево строится снизу вверх, учитывая тот факт, что число предшественника узла со стороны левого поддерева меньше числа узла, а число предшественника узла со стороны правого поддерева больше числа левого предшественника узла. Здесь листья есть символы сообщения, через запятую от символа обозначена его частота.
ACBD,7
A,3
CBD,4
C,2
BD,2
B,1 D,1
Рис. 1.1. Дерево Хаффмена
Такие деревья называются деревьями Хаффмена, по имени изобретателя этого метода кодирования. Как только дерево построено, код любого символа алфавита может быть определен просмотром дерева снизу вверх, начиная с листа, представляющего этот символ. Начальное значение кода – пустая строка. Каждый раз, когда мы поднимаемся по левой ветви, к коду начиная справа слева приписывается 0; каждый раз при подъеме по правой ветви к коду начиная справа слева приписывается 1, т.е. А имеет код 0; B имеет код 110 и т.д.
Алгоритм декодирования работает в обратном порядке. Проход по дереву начинается с корня дерева. Каждый раз, когда встречается 0, двигаемся по левой ветви, и каждый раз, когда встречается 1 , двигаемся по правой ветви, отнимая от кода слева соответствующий символ 0 или 1. Дойдя до листа, все откинутые от кода сообщения цифры образуют код расшифрованного символа. Повторяем этот процесс опять от корня к листу, но уже с меньшим кодом. Процесс повторяется до тех пор, пока в коде сообщения не останется цифр.