Вы находитесь на странице: 1из 17

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ

ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение высшего
образования
«Тихоокеанский государственный университет»

Математические методы защиты информации и компьютерной безопасности

Лабораторная работа №1
“Разработка кодировочных схем”

Текстовый документ по лабораторной работе


по дисциплине «Теория кодирования, сжатия и восстановления информации»

Выполнил студент Л. Д. Гааз


КБ(c)-01

Проверила Е. В. Карачанская

Хабаровск – 2023 г.
Задачи:
1) Составить вероятностную схему по тексту на 300 символов.
2) Построить код. таблицу методом Шеннона-Фано
3) Построить код. таблицу методом Хемминга
4) Найти средние длины кодовых слов для каждой кодировки
5) Закодировать кодом Хэмминга (из 2-го задания) свою ФИО.

Исходный текст:
“Осень приносит уютные вечера, падающие листья и аромат свежей выпечки. Это время
для теплых свитеров и горячего какао, когда можно уютно устроиться с книгой под
одеяло. Осенние краски природы вдохновляют на прогулки и фотографии. Не забудьте
приготовиться к прохладным дням!

Ход работы:

1. Для выполнения лабораторной работы для начала необходимо было подсчитать


частоту и вероятность каждой буквы в тексте.
2. Для этого я воспользовался программой, написанной на языке Python.
def count_letter_frequency(text):
letter_count = {} # словарь для подсчета частоты встречи букв
total_letters = 0 # общее количество букв

# Преобразование текста в нижний регистр и удаление всех символов,


кроме букв
cleaned_text = ''.join(filter(str.isalpha, text.lower()))

# Подсчет частоты встречи каждой буквы


for letter in cleaned_text:
letter_count[letter] = letter_count.get(letter, 0) + 1
total_letters += 1

# Вычисление и вывод частоты и вероятности каждой буквы,


# отсортированных по убыванию частоты
sorted_letter_count = sorted(letter_count.items(), key=lambda x: x[1],
reverse=True)
total_probability = 0.0

for letter, count in sorted_letter_count:


frequency = count / total_letters
total_probability += frequency
print(f"Буква '{letter}': частота = {count}, вероятность =
{frequency:.5f}")
print(f"Суммарная вероятность: {total_probability:.5f}")
# Вычисление и вывод суммы частот всех букв
total_frequency = sum(count for _, count in letter_count.items())
print(f"Сумма частот всех букв: {total_frequency}")

text = input("Введите текст: ")


count_letter_frequency(text)

input("Нажмите Enter для выхода")

 Функция count_letter_frequency принимает введенный текст как аргумент.


 Создается словарь letter_count, который будет использоваться для подсчета
частоты каждой буквы в тексте, и переменная total_letters, чтобы отслеживать
общее количество букв.
 Строка cleaned_text создается для преобразования введенного текста в нижний
регистр и удаления всех символов, кроме букв. Для этого мы используем функцию
lower() для перевода текста в нижний регистр и функцию filter() в сочетании с
методом isalpha(), чтобы оставить только буквенные символы.
 Далее программа проходит по каждой букве в cleaned_text и увеличивает
соответствующее значение в словаре letter_count на 1, с помощью метода get().
Также обновляется общее количество букв total_letters.
 После того, как все буквы подсчитаны, мы создаем отсортированный список
(sorted_letter_count), используя функцию sorted(). Мы передаем ей items() словаря
letter_count и указываем ключ сортировки key=lambda x: x[1], чтобы сортировать
по значению (частоте) каждой буквы. Флаг reverse=True указывает, что мы хотим
сортировать в порядке убывания.
 Наконец, мы проходим по отсортированному списку sorted_letter_count и для
каждой пары буква-частота/количество выводим информацию о букве, частоте и
вероятности на экран. При этом выводятся данные в форматированной строке, где
используются фигурные скобки {} для вставки значений.
 В основной части программы запрашивается у пользователя ввод текста с помощью
функции input(), а затем происходит вызов функции count_letter_frequency с
введенным текстом как аргумент.
Получим следующий результат:

3. Все полученные данные я занес в Excel таблицу, а также подсчитал энтропию.


4. Теперь приступим к реализации метода “Шеннона — Фано”
5. Для этого расположим наши буквы и соответствующие им вероятности в порядке
убывания.
6. Затем будем разбивать список на две части, таким образом, чтобы сумма вероятностей
одной и второй части была примерно равна.
Здесь мы видим, что сумма вероятностей верхней части примерно равна 0,51529, тогда как сумма
вероятностей нижней части приблизительно равна 0,4847.

7. Теперь верхней части присваивается цифра “1”, а нижней части “0”.

8. Далее каждая из частей разбивается снова на две части по тому же принципу.


9. Этот процесс будет повторяться до тех пор, пока в каждой части не останется по одной
букве.

10. В конечном итоге мы получим следующий результат:


11. Осталось найти кодовые слова для каждой буквы. Для этого проходимся по нашей
полученной кодировочной таблице для каждой буквы слева на право.
12. Получим следующий результат:
Алгоритм Шеннона-Фано

13. Теперь посчитаем длину каждого кодового слова и умножим ее на вероятность


соответствующей буквы, для того чтобы в дальнейшем посчитать ср. длину кодовых слов.
14. Средняя длина будет равна сумме полученных значений.
В итоге получим результат Lср = 4,48467

15. Приступим к реализации метода “Хаффмана”


16. Для этого также расположим наши буквы и их вероятности в убывающем порядке.
17. Первым шагом выбираем две буквы с наименьшей вероятностью, при чем зеленым цветом
будет “1”, а желтым “0”.
18. Складываем эти две вероятности, а сами буквы объединяем в одну.
19. Далее берем тот же список, но с двумя объединенными буквами.
20. Располагаем наши вероятности также в убывающем порядке. В нашем случае при
сложении вероятностей двух букв, их объединение ушло вверх списка. Далее мы снова
складываем два символа с наименьшей вероятностью.
21. Такие преобразования будем выполнять и дальше.
Алгоритм Хаффмана

22. До тех пор, пока не останется два объединения букв сумма которых будет равна единице.

23. Теперь осталось присвоить каждой букве кодовое слова, путем рекурсивного прохода по
каждой букве. Справа на лево идем по каждой букве. Если буква находится в зеленой
области добавляем к ее кодовому слову “1” если в желтой, то “0”, если буква не содержится
не в зеленой не в желтой области, то ничего не присваиваем.
24. Получим следующий результат.
25. Теперь для вычисления средний длины кодовых слов, опять посчитаем длину и
произведения ее с вероятностью для каждой из букв.

26. В итоге получим среднюю длину кодовых слов равную Lср = 4,45847
27. Мы получили меньшее значение, чем при первом методе, что говорит об оптимальности
данного алгоритма.
28. Теперь закодируем наше ФИО с помощью данного алгоритма. Как и в предыдущих шагах
составим вероятностную таблицу для нашей ФИО.
29. Теперь применим наш алгоритм для букв из ФИО.

30. И составим кодировочную таблицу.

31. Осталось расставить полученные кодовые слова в том порядке, как идут буквы в нашей
ФИО.
Вывод:

В результате проделанной лабораторной работы была получена программа, с помощью


которой можно быстро подсчитать частоту и вероятность каждой буквы в введенном
тексте. Были получены навыки создания вероятностных и кодировочных таблиц двумя
различными методами: “Алгоритм Шеннона-Фано” и “Алгоритм Хаффмана”. А также
получены навыки шифрования своей ФИО последним из двух методов и подсчета средней
длины полученных кодовых слов.

Вам также может понравиться