Похоже, вы понимаете принцип кодов префиксов.
Многие люди (смущенно) называют все коды префиксов "кодами Хаффмана".
Существует многодругие виды префиксных кодов - ни один из них не сжимает данные в меньшее количество бит, чем сжатие Хаффмана (если мы пренебрегаем издержками передачи таблицы частот), но многие из них довольно близки (с некоторыми видами данных) и имеют другие преимуществанапример, работает намного быстрее или гарантирует некоторую максимальную длину кода («префиксные коды с ограниченной длиной»).
Если у вас большое количество уникальных символов, накладные расходы таблицы частот Хаффмана становятся большими - возможно, некоторыедругой префиксный код может обеспечить лучшее сетевое сжатие.
Многие люди, выполняющие сжатие и декомпрессию в аппаратных средствах, имеют фиксированные пределы для максимального размера кодового слова - многие алгоритмы сжатия изображений и видео задают «код Хаффмана с ограниченной длиной».
Самые быстрые префиксные коды - универсальные коды -- фактически включает в себя последовательность битовых последовательностей, которые могут быть предварительно сгенерированы без учета фактических частот символов.Программы сжатия, использующие эти коды, как вы упомянули, связывают наиболее частый входной символ с самой короткой битовой последовательностью, следующий наиболее часто встречающийся входной символ с следующей закороченной битовой последовательностью и т. Д.
Например, некоторые программы сжатия используют коды Фибоначчи (разновидность универсального кода) и всегда ассоциируют наиболее часто встречающийся символ с битовой последовательностью «11», следующий наиболее часто встречающийся символ с битовой последовательностью«011», следующий за «0011», следующий за «1011» и т. Д.
Алгоритм Хаффмана создает код, во многих отношениях похожий на универсальный код - оба являются префиксными кодами,Но, как указывает Cyan, алгоритм Хаффмана немного отличается от этих универсальных кодов.Если у вас есть 5 разных символов, дерево Хаффмана будет содержать 5 разных битовых последовательностей - однако точные битовые последовательности, сгенерированные алгоритмом Хаффмана , зависят от точных частот.Один документ может иметь количество символов {10, 10, 20, 40, 80}, что приводит к битовым последовательностям Хаффмана {0000 0001 001 01 1}.Другой документ может иметь количество символов {40, 40, 79, 79, 80}, что приводит к битовым последовательностям Хаффмана {000 001 01 10 11}.Несмотря на то, что обе ситуации имеют ровно 5 уникальных символов, фактический код Хаффмана для наиболее часто встречающегося символа в этих двух сжатых документах сильно отличается - код Хаффмана «1» в одном документе, код Хаффмана «11» в другом документе.Однако, если вы сжали эти документы с помощью кода Фибоначчи, код Фибоначчи для наиболее часто встречающегося символа всегда одинаков - «11» в каждом документе.
В частности, для Фибоначчи первые 33-битовый код Фибоначчи - «31 нулевой бит, за которым следуют 2 однобитных», представляющий значение F (33) = 3,524,578.Таким образом, 3 524 577 уникальных символов могут быть представлены кодами Фибоначчи длиной 32 бита или менее.
Одна из наиболее противоречивых особенностей префиксных кодов заключается в том, что некоторые символы (редкие символы) «сжимаются» в гораздо более длинныебитовые последовательности.Если у вас фактически есть 2 ^ 32 уникальных символа (все возможные 32-битные числа), невозможно получить какое-либо сжатие, если вы заставите компрессор использовать префиксные коды, ограниченные 32 битами или менее.Если у вас фактически есть 2 ^ 8 уникальных символов (все возможные 8-битные числа), невозможно получить какое-либо сжатие, если вы заставите компрессор использовать префиксные коды, ограниченные 8 битами или менее.Позволяя компрессору расширять редкие значения - использовать более 8 бит для хранения редкого символа, который, как мы знаем, можно хранить в 8 битах - или использовать более 32 бит для хранения редкого символа, которыймы знаем, что может храниться в 32 битах - это освобождает компрессор от использования менее 8 бит - или менее 32 бит - для хранения более частых символов.
В частности, если я использую коды Фибоначчи для сжатия таблицы значений,где значения включают все возможные 32-битные числа,
нужно использовать коды Фибоначчи длиной до N бит, где F (N) = 2 ^ 32 - решение для N я получаю
N = 47 бит для наименее часто используемого 32-разрядного символа.