Сжатие информации в компьютерных сетях
66
верхней границы 29999 (999...);
нижней границы 10000 (000...).
Так как наиболее значимые разряды в обоих регистрах не
совпадают, то вводится новый символ кодируемого сообщения Н и
пересчитывается верхняя и нижняя границы. Теперь старшие разряды
верхней и нижней границ совпадают и в силу природы алгоритма не
изменятся до завершения процедуры кодирования. Поэтому старший
разряд (цифра 1) выводится в буферный регистр в качестве первой цифры
кода, отображающего кодируемое сообщение. Это осуществляется
сдвигом содержимого обоих регистров влево на одну позицию и
“втягивания” девятки на место младшей цифры верхней границы, и нуля -
на место младшей цифры нижней границы. Далее по мере работы
алгоритма верхняя и нижняя границы становятся все ближе и ближе друг к
другу и при совпадении старших цифр в регистрах они выводятся в код
сообщения.
После того, как обработаны все символы сообщения, необходимо
выдвинуть два дополнительных разряда из регистра верхней или нижней
границ, так как часть информации о кодируемом сообщении все еще
находится в регистрах. В нашем примере выдвигаются две цифры регистра
нижней границы. Теперь декодер будет в состоянии обработать входную
последовательность.
При декомпрессии декодер должен использовать три регистра.
Первые два такие же как и у кодера, а третий регистр кода - для хранения
очередных битов декодируемого сообщения. В регистры границ из всех
возможных значений интервалов заносятся границы того символа, при
котором число в регистре кода находится между значениями верхней и
нижней границ. Интервал между границами расположен не между
значениями 0,0 и 1,0, а между двумя положительными 16-битовыми
целыми числами. Текущая вероятность для обрабатываемого символа
определяется путем деления (Число - Нижняя_Граница) на
(Верхняя_Граница - Нижняя_Граница +1).
Хотя большинство вычислителей работает с 32-х битовыми
числами, весьма целесообразно, после подсчета частот символов в
сообщении, осуществлять нормирование частот таким образом, чтобы вес
любого символа не занимал более одного байта. Это связано с тем, что за
счет ограничения весов можно производить все арифметические
операции, используя целые 16-разрядные числа. При этом программа
выполняется несколько быстрее и занимается меньший объем памяти для
хранения значений частот. Исключается также возможность переполнения
16-битовых регистров. Следует обратить внимание на то, чтобы счетчик с
ненулевым значением в процессе масштабирования не был обращен в
нуль. В таком случае его полагают равным 1.