Одним из основных шагов в сжатии файлов, таких как ZIP, является использование предыдущего декодированного текста в качестве справочного источника. Например, закодированный поток может сказать: «Следующие 219 выходных символов такие же, как символы из декодированного потока 5161 байт назад». Это позволяет представить 219 символов всего тремя байтами или около того. (В ZIP есть нечто большее, чем сжатие Хаффмана, но я говорю только о сопоставлении ссылок.)
Мой вопрос заключается в том, что такое стратегия (и) для алгоритма сопоставления строк. Даже просмотр исходного кода из zlib и тому подобного не дает хорошего описания алгоритма сопоставления сжатия.
Задачу можно сформулировать так: при заданном блоке текста, скажем, 30 КБ, и входной строке найдите самую длинную ссылку в 30 КБ текста, которая точно соответствует началу входной строки». Алгоритм должен быть эффективным при повторении, т. е. 30-килобайтный блок текста будет обновляться путем удаления некоторых байтов спереди и добавления новых байтов сзади и выполнения нового сопоставления.
Меня гораздо больше интересуют обсуждения алгоритма (алгоритмов) для этого, не исходного кода или библиотек. (у zlib очень хороший исходный код!) Я подозреваю, что может быть несколько подходов с разными компромиссами.