Это правильно, но это не так удивительно, как звучит.
Для декодирования потока байтов в кодировке Хаффмана необходимо передать два фрагмента данных. Требуется закодированный поток (конечно), но также и словарь, который позволит вам правильно построить дерево Хаффмана для выполнения декодирования.
Использование больших токенов для кодирования ваших данных всегда приведет к меньшему потоку кодирования. К сожалению, если у вас нет данных с некоторыми довольно специфическими и особыми характеристиками, более крупные токены также приведут к неожиданному увеличению размера словаря. Вырожденный случай (на который указывает ответ Марка Байерса) приведет к тому, что весь несжатый поток данных будет одним токеном, а закодированный поток - одним битом, что приведет к абсолютному отсутствию сжатия.
Таким образом, кодирование Хаффмана (как и почти все) является упражнением в компромиссах. Нахождение баланса между эффективностью закодированного файла и размером словаря может быть непростым делом. Я никогда не проводил фактический анализ, основанный на характеристиках данных, чтобы выяснить, какие могут быть различные идеальные размеры токенов, но я думаю, что байты, как правило, используются, потому что это простая точка для разделения и, как правило, приводит к некоторому реальному сжатию. Я знаю, что еще в колледже я делал это однажды как упражнение с четырьмя байтовыми токенами, но я не могу честно сказать, что это было лучше, чем один байтовый токен.
Конечно, также можно обманывать, и вместо динамического построения словаря, чтобы получить действительно жадное сжатие, вы можете использовать предварительно построенное дерево и сжимать его. В таком случае вы бы не передавали словарь, но декодер также должен иметь тот же словарь для декодирования данных.