Одновреммено кодирует буквы, смещения и длины арифметиком. Работает с неким увеличенным алфавитом.
Если из потока извлекается символ с кодом ≤255, то символ кладётся непосредственно, если код больше то он трактуется
как размер совпадающей цепочки и следом извлекается смещение. Очень красивая задумка.
Правда частоты для смещений не обновляются. Я пытался сделать это обновление, выигрыш от него не велик (смешения носят почти случайных характер).
Для кодирования смещений и длин, используется один интервал, но это так же не влияет на качество результатов.
Надо сказать, несмотря на всю красоту, на сильно избыточных текстовых файлах, он не сильно выигрывает у моего LZW без сборосов.
Хочется исправить все косяки, но пока небыло времени.
Самое медленное место этого исходника в бинарном дереве поиска. В нём применяется целый лес деревьев, по одному на
каждый из 256 символов. Но деревья не балансируются, а удаление ведёт к ещё большему дисбалансу. Можно во много
раз ускорить адаптивный арифметический кодер. В декодере так и вообще применятеся бинарный поиск, хотя ни то ни другое
там не нужно совсем. На фоне дерева эти вещи незаметны. Стоит его отбалансировать и скорость вырастет в разы.
lzari.cpp