
74.Сжатие информации. Метод Хаффмана.
Сжатие сокращает объем пространства, требуемого для хранения файлов в ЭВМ, и количество времени, необходимого для передачи ин¬формации по каналу установленной ширины пропускания. Рассматривается обратимое сжатие или сжатие без наличия помех, где первоначальный текст может быть в точности восстановлен из сжатого состояния. Необратимое или ущербное сжатие используется для цифровой записи аналоговых сигналов, таких как человеческая речь или рисунки. Обратимое сжатие особенно важно для текстов, записанных на естественных и на искусственных языках, поскольку в этом случае ошибки обычно недопустимы. Существует много веских причин осуществлять сжатие данных, так как более быстрая передача данных и сокращение пространства для их хранения позволяют сберечь значительные средства и зачастую улуч¬шить показатели ЭВМ. Существуют два основных способа проведения сжатия: статистический и словарный. Лучшие статистические методы применяют кодиро¬вание Хаффмана, лучшие словарные – метод Зива-Лемпела. В статистическом сжатии каждому символу присваивается код, основанный на вероятности его появления в тексте. Высоковероятные символы получают короткие коды, и наоборот. В словарном методе группы последовательных символов или «фраз» заменяются кодом. Замененная фраза может быть найдена в некотором «словаре». Метод Хаффмана. В этом методе при сжатии данных каждому символу присваивается оптимальный префиксный код, основанный на вероятности его появления в тексте. Префиксные коды – это коды, в которых никакое кодовое слово не является префиксом любого другого кодового слова. Эти коды имеют переменную длину. Алгоритм Хаффмана можно разделить на два этапа:
1)определение вероятности появления символов в файле;
2)нахождение оптимального префиксного кода. На первом этапе необходимо прочитать файл полностью и подсчитать вероятности появления символов в файле (иногда подсчитывают, сколько раз встречается каждый символ). Если при этом учитываются все 256 сим¬волов, то не будет разницы в сжатии текстового или файла иного формата. Далее находятся два символа a и b с наименьшими вероятностями появления и заменяются одним фиктивным символом x, который имеет вероятность появления, равную сумме вероятностей появле¬ния символов a и b. Затем, используя эту процедуру рекурсивно, находится оптимальный префиксный код для меньшего множества символов (где символы a и b заменены одним символом x). Код для исходного множества символов получается из кодов замещающих символов путем добавления 0 или 1 перед кодом замещающего сим¬вола, и эти два новых кода принимаются как коды заменяемых сим¬волов. Например, код символа a будет соответствовать коду x с до¬бавленным нулем перед этим кодом, а для символа b перед кодом символа x будет добавлена единица.
Huffman(C)
1.n ←|c|
2.Q ←C
3.For i=q to n-1 do
4.Выделить память для нового узла z
5.x ←min(Q); z^.left ←x
6.y ←min(Q); z^.Right ←y
7.z^.f ←x^.f+y^.f
8.Insertt(Q,z)
9.End for
10.Return min(Q)