Алгоритмическое

Feb 17, 2023 10:45

Экспериментирую с архиваторами, алгоритмами сжатия данных, с ориентированными на сжатие текста.

Есть моя реализация PPM, которая сжимает тексты лучше WinRar и 7zip. Написана она just for fun, на практике не применима, работает в 20 раз медленнее, чем те же WinRar и 7zip. Внутри использует полу-байтовое суффиксное дерево (suffix tree), оно просто быстрее байтового суффиксного дерева. Это основной вариант, он рабочий, его можно пощупать, протестировать, запаковать что-то и распаковать.

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

А в это время существует мой старый алгоритм битового разбора в Patricia Tree, которое требует намного меньше узлов, чем даже в основном алгоритме. Намного, в десятки раз меньше.

При этом, просасывание файла через парсер для разбора на полную глубину (для контекстов длиной 1000+ битов) выполняется в три раза быстрее, чем в битовом суффиксном дереве на глубину 128 битов. То есть, и узлов меньше, оперативной памяти для разбора текста требует меньше, ещё и работает очень быстро.

Надо их как-то скрестить между собой.

Есть два тестовых файла, enwik8 на 10^8 байтов дампа википедии, и enwik9 на 10^9 байтов дампа википедии. То есть, на 100 Mb и 1000 Mb. В Patricia Tree каждый бит имеет индекс, и у меня не реализован скользящий буфер битов для Patricia Tree, так что хочется засосать весь большой файл в буфер целиком. Оказалось, что Int32 не хватает, чтобы индексировать биты такого большого буфера, нужно использовать int64.

Возникают любопытные проблемы, когда ворочаешь такими большими объёмами данных!

забавы, сжатие данных, алгоритмы, лытдыбр, программирование

Previous post Next post
Up