Энтропийное кодирование двоичного потока - PullRequest
3 голосов
/ 29 апреля 2009

Я хочу сжать двоичный поток. Я знаю, что после каждого «1» существует более высокая вероятность нахождения «0», а после каждого «0» - более высокая вероятность нахождения «1». Как мне это закодировать? Я думал о кодах Райса, но я не получил так далеко ... Заранее спасибо за любой ответ.

1 Ответ

3 голосов
/ 29 апреля 2009

Вы пробовали простое кодирование Хаффмана? Возможно, это не сильно сэкономит, но если один из кодов «10» и «01» имеет гораздо более высокие вероятности, чем «00» или «11», вы можете переназначить его на «0», а остальные на «10» , '110' и '111'.

Конечно, это не лучший выбор, поскольку он разбивает ваш поток на 2-битные порции и оптимизирует только один случай. Однако его можно уточнить, рассчитав / измерив вероятности для большего входного набора, такого как 4 или 8 битов, например в случае 8 битов 10101010 и 01010101 будут использоваться чаще, чем 00000000 и 11111111.

Вы могли бы получить еще лучшие результаты с арифметическим кодированием или некоторым сжатием, которое действительно использует некоторую модель, основанную на вероятностях битов.

Другой простой подход - инвертировать каждый второй бит. Поскольку вероятность, о которой вы упомянули, будет стремиться ко многим чередующимся частям потока, таким как 0101010, это даст вам много частей потока, таких как 111111, которые обычно сжимаются лучше обычными алгоритмами сжатия. Но успех этого метода зависит от того, насколько велик «разрыв вероятности».

...