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

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

lzari.cpp

Hosted by uCoz