Поймите, что с помощью встроенного набора у вас будет сжатие на уровне пути в зависимости от характера ваших данных.Конечно, это зависит от реализации контейнера.
Посмотрите на некоторую информацию о радикальных деревьях, деревьях цифрового поиска, красно-черных деревьях и т. Д. Вы увидите, что вам не нужно хранить каждое и каждоеСтрока, а точнее шаблоны.Например, давайте упростим вашу проблему: у нас есть только 3 символа, которые могут появляться не более 2 раз каждый, а каждая строка имеет длину 6 символов.Три возможные строки:
AABBCC, AABCBC и AACBCB
С этими примерами мы могли бы избежать использования максимум 6 + 3 + 4 = 13 узлов вместо полных 18 узлов,не важно, но я тоже не знаю, что ты делаешь.Как и при любом типе сжатия, чем больше шаблонов префиксов используется повторно, тем больше у вас сжатия.
Редактировать: числа 13 и 18 получены из сжатия на уровне пути.Например, в прямом C (для аргумента / обсуждения), если я реализую свой класс хранения строк как обертку вокруг массива, я, вероятно, просто буду иметь массив символьных указателей, каждый указатель будет ссылаться на место в памяти, которое содержит шаблон.В приведенном выше примере это займет 18 символов (6 * 3 = 18).Если добавить размер массива (скажем, что sizeof (char *) равен 4, нашему массиву потребуется 3 * 4 байта памяти = 12 + 18 или 30 байтов для хранения наших шаблонов.
Если яВместо этого я сохраняю шаблоны в своего рода дереве цифрового поиска, я делаю небольшой компромисс: узлы в моем дереве будут больше 1 байта за штуку (1 байт для символа в узле, 4 байта для «следующего»)указатель в каждом узле, по 5 байт.) Первый шаблон, который мы храним, - AABBCC. Это 6 узлов в дереве. Далее - AABCBC. Мы повторно используем путь AAB из первого дерева и нам нужны только 3 дополнительных узла для CBC.последний шаблон - AACBCB. Мы повторно используем AA и нам нужно 4 новых узла для CBCB. Это всего 13 узлов * 5 байт = 65 байт памяти. Однако, если у вас много длинных повторяющихся шаблонов в префиксе вашегоданные, то вы увидите какое-то префиксное сжатие на уровне пути.
Если это не так, я бы посмотрел на сжатие Хаффмана или LZW. Это потребует от вас создания диктатаСписок шаблонов, с которыми связаны целые числа.Когда вы сжимаете, вы создаете словарь и создаете целочисленные идентификаторы для каждого шаблона в вашем тексте.Затем вы заменяете шаблоны в вашем тексте на целочисленные идентификаторы.Когда вы распаковываете, вы делаете наоборот.У меня нет времени, чтобы описать эти алгоритмы более подробно, поэтому вам нужно их найти.
Это компромисс в простоте / времени.Если ваши данные позволят это, используйте более короткий метод и просто используйте встроенный контейнер.Если нет, вам нужно что-то более приспособленное к вашим данным.