У меня есть огромный список многобайтовых последовательностей (давайте назовем их словами), которые мне нужно сохранить в файле и которые я должен иметь возможность быстрого поиска. Огромные означает: около 2 миллионов из них, каждый длиной 10-20 байт.
Кроме того, каждое слово должно иметь значение tag , связанное с ним, чтобы я мог использовать его для ссылки на дополнительные (внешние) данные для каждого элемента (следовательно, словарь проверки орфографии здесь не работает так, как только обеспечивает хит-тест).
Если бы это было только в памяти, и если бы памяти было много, я мог бы просто сохранить все слова в хешированной карте (словарь, пары ключ-значение) или в отсортированном списке для двоичного поиска.
Однако я бы хотел сильно сжать данные, а также предпочел бы не считывать данные в память, а искать в файле.
Поскольку слова в основном основаны на английском языке, существует определенная вероятность того, что некоторые «слоги» встречаются в словах чаще, чем другие, что, вероятно, полезно для эффективного алгоритма.
Может кто-нибудь указать мне эффективную технику или алгоритм для этого?
Или даже примеры кода?
Обновление
Я полагаю, что DAWG или что-то подобное направляет путь к общим суффиксам таким образом, для меня не будет работать, потому что тогда я не смогу пометить каждый полный путь слова отдельным значением. Если бы я обнаружил общие суффиксы, мне пришлось бы поместить их в их собственный словарь (справочную таблицу), чтобы узел trie мог ссылаться на них, но узел сохранял бы свой собственный конечный узел для хранения значения тега этого пути.
На самом деле, это, вероятно, путь:
Вместо того, чтобы строить узлы дерева только для отдельных символов, я мог бы попытаться найти часто используемые последовательности символов, а также создать узел для них. Таким образом, отдельные узлы могут покрывать несколько символов, что может привести к лучшему сжатию.
Теперь, если это жизнеспособно, как я на самом деле найду часто используемые подпоследовательности во всех моих фразах?
Приблизительно с 2 миллионами фраз, состоящих обычно из 1-3 слов, будет трудно выполнить все перестановки всех возможных подстрок ...