В подобных случаях вы хотите удалить как можно больше ненужных данных. Предполагая, что заказ имеет значение:
- Перво-наперво, убедитесь, что у вас есть индекс B-дерева, построенный на базе данных фраз, сгруппированных по фразе. Это ускорит время поиска диапазона.
- Пусть
n = 2
(или 1, если вы в этом)
- Разделите текстовый блок на фразы длиной
n
и выполните запрос по фразам в словаре, которые начинаются с любой из пар фраз ('My Phrase%'
). Благодаря индексу это не будет выполнять 4521 миллион сравнений строк.
- Запомните фразы, которые точно совпадают
- Пусть
n = n + 1
- Повторите с шага 3, используя сокращенный словарь, пока сокращенный словарь не станет пустым
Вы также можете вносить небольшие оптимизации здесь и там, в зависимости от того, какие совпадения вы ищете, например, не совпадение через знаки препинания, только фразы определенной длины слова и т. Д. В любом случае, я бы ожидал узкое место здесь - доступ к диску, а не фактические сравнения.
Кроме того, я почти уверен, что основал этот алгоритм на существующем, но я не помню его название, поэтому бонусные баллы могут получить те, кто может его назвать. Я думаю, что это как-то связано с хранилищем данных / майнингом и вычислением частот и шаблонов?