Я не думаю, что есть какая-либо свободно доступная реализация для этого (не то, что я знаю в любом случае, хотя я написал по крайней мере 3 подобных конструкции в коммерческом коде), так что вам придется свернуть свою собственную.
Замечание, сделанное Марсело о добавлении элементов в порядок, очень актуально, так как я предполагаю, что вы, вероятно, захотите сжать данные во время добавления - быстрый доступ к записям, уже похожим на добавляемую, дает гораздо лучшую производительность чем поиск «наиболее подходящей записи» (необходимой для сжатия-сходства) по всему набору.
Еще одна вещь, о которой вы, возможно, захотите прочитать, это «веревки» - концептуально иной тип, нежели струны, которые я уже предложил Марко Канту некоторое время назад. Ценой следующего указателя на «шпагат» (из-за отсутствия лучшего слова) вы можете объединять части строки без сохранения дублирующих данных. Основная проблема заключается в том, как извлечь части, которые можно объединить в новую «веревку», представляющую исходную строку. Как только эта проблема будет решена, вы можете в любое время восстановить данные в виде строки, сохраняя компактное хранилище.
Если вы не хотите идти по «веревочному» маршруту, вы также можете попробовать что-то под названием «сокращение префикса», что является простой формой сжатия - просто начните каждую строку с индекса предыдущей строки и количество символов, которые должны рассматриваться как префикс для новой строки. Помните, что вы должны не повторять это слишком далеко назад, иначе скорость доступа сильно пострадает. В одной простой реализации я сделал mod 16
для индекса, чтобы установить запись, с которой началось уменьшение префикса, что дало мне в среднем около 40% экономии памяти (это число, конечно, полностью зависит от данных).