Чем являются несжатые коды, что такое переполнение счетчика

Если сжимаемые символы являются кодами ASCII, то им можно просто присвоить свои значения для представления в несжатом виде. В общем случае, когда алфавит имеет произвольный размер, несжатые коды двух разных размеров можно также легко построить. Рассмотрим, например, алфавит размера n = 24. Первым 16 символам можно присвоить числа от 0 до 15 в их двоичном разложении. Эти символы потребуют только 4 бита, но мы закодируем их пятью битами. Символам с номерами от 17 до 24 присвоим числа 17 - 16 - 1 = 0,18 - 16 - 1 = 1, и до 24 - 16 - 1 = 7 в двоичном представлении из 4 бит. Итак, мы получим шестнадцать 5-битовых кода 00000, 00001,...,01111, за которыми следуют восемь 4-битовых кода 0000, 0001,...,0111.

Переполнение счетчика

Счетчики частот символов сохраняются на дереве в виде чисел с фиксированной разрядностью. Поля разрядов могут переполниться. Число без знака из 16 двоичных разрядов может накапливать счетчик до числа 216 — 1 = 65535. Простейшее решение этой проблемы заключается в наблюдении за ростом счетчика в корне дерева, и, когда он достигает максимального значения, следует сделать изменение масштаба всех счетчиков путем их целочисленного деления на 2. На практике это обычно делается делением счетчиков листьев с последующим вычислением счетчиков всех внутренних узлов дерева.

Каждый внутренний узел равен сумме своих потомков. Однако при таком методе целочисленного деления понижается точность вычислений, что может привести к нарушению свойства соперничества узлов дерева. После уполовинивания счетчиков листьев, три внутренних узла пересчитаны. Полученное дерево, однако, не удовлетворяет свойству Хаффмана, поскольку счетчики перестали быть упорядоченными. Поэтому после каждой смены масштаба требуется перестройка дерева, которая, по счастью, будет делаться не слишком часто.

Поэтому компьютерные программы общего назначения, использующие метод сжатия Хаффмана должны иметь многоразрядные счетчики, чтобы их переполнение случалось не слишком часто. Стоит отметить, что после смены масштаба счетчиков, новые поступившие для сжатия символы будут влиять на счетчики сильнее, чем сжатые ранее до смены масштаба (примерно с весом 2). Это не критично, поскольку из опыта известно, что вероятность появления символа сильнее зависит от непосредственно предшествующих символов, чем от тех, которые поступили в более отдаленном прошлом.

-----------------------------