Как упаковать биты при сжатии Хаффмана? - PullRequest
1 голос
/ 07 декабря 2011

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

Мне удалось построить сжатие три, поэтому у меня есть таблица со всеми символами и их соответствующим сжатым представлением в битах. Например:

а = 0010 б = 01101 с = 0011 д = 1101 е = 101

Теперь моя идея состоит в том, чтобы хранить биты в контейнере (например, переменную char или int) и затем выводить их в файл.

Я знаю, как упаковывать / распаковывать биты в char или int, используя побитовые операции. Однако проблема, с которой я сталкиваюсь, заключается в том, что количество бит в сжатой версии не будет соответствовать количеству битов, которые у меня есть.

Предположим, я хочу сжать строку "abc", используя таблицу выше. Я бы начал с сжатия 'a', поэтому упаковывал 0010 в переменную типа char. Затем я бы сжал 'b', но для этого нужно 5 бит, и у меня осталось только 4 бита в моей переменной char. Я мог бы использовать другую переменную, но было бы беспорядок, чтобы отслеживать, какая переменная использует сколько битов.

Использование int даст мне 32 бита для работы, но та же проблема возникнет, когда я подойду к пределу.

1 Ответ

1 голос
/ 08 декабря 2011

Обходного пути нет.У вас есть , чтобы отслеживать биты, оставшиеся в вашей структуре хранения.

Это не совсем беспорядок.На самом деле это довольно легко попробовать.Просто сохраните верхние биты в оставшемся хранилище, а затем сохраните младшие биты в новом хранилище.На каждом шаге вам нужно знать, сколько осталось битов.

Я бы также предложил использовать типы uint32 вместо char из-за их высокой емкости.Это потребует меньше тасования и, следовательно, улучшит скорость.

...