В теории
- A массив суффиксов - это «лучший» ответ, поскольку он может быть реализован для использования линейного пространства и времени для обнаружения любых дублирующих подстрок. Однако наивная реализация на самом деле требует времени O (n ^ 2 log n) для сортировки суффиксов, и не совсем очевидно, как уменьшить это значение до O (n log n), не говоря уже о O (n), хотя вы можете прочитать связанные документы, если вы хотите.
- A дерево суффиксов может занимать немного больше памяти (хотя и по-прежнему линейно), чем массив суффиксов, но его легче реализовать для быстрой сборки, поскольку вы можете использовать что-то вроде radix сортировать идеи по мере добавления вещей в дерево (подробности см. в ссылке на википедию от имени).
- Алгоритм KMP также полезен для ознакомления, который предназначен для очень быстрого поиска определенной подстроки в более длинной строке. Если вам нужен только этот особый случай, просто используйте KMP, и вам не нужно сначала создавать индекс достаточности.
На практике
Полагаю, вы анализируете документ с реальными словами на естественном языке (например, на английском) и действительно хотите что-то делать с данными, которые вы собираете.
В этом случае вы можете просто выполнить быстрый n-грамм анализ для небольшого n, например, просто n = 2 или 3. Например, вы можете разбить ваш документ на список. слов, убирая знаки препинания, заглавные буквы и слова с запятой (работает, запускает оба -> «запустить»), чтобы увеличить семантические соответствия. Затем просто создайте хэш-карту (например, hash_map в C ++, словарь в python и т. Д.) Каждой смежной пары слов с учетом количества вхождений. В конце вы получаете очень полезные данные, которые очень быстро кодируются и не слишком быстро запускаются.