Алгоритмы, основанные на хеше, вероятно, дадут вам лучшую производительность, если вам нужно будет проверять большое количество текста на наличие вхождений в огромном наборе
HashSet
будет хорошей первой попыткой, поскольку поиск (проверка, содержится ли ключ в наборе) будет между O (1) и O (n).
Тем не менее, я бы настоятельно рекомендовал изучить преимущества использования [Bloom Filter][1]
.Он будет хорошо служить в качестве предварительного фильтра, поскольку он обеспечивает предсказуемую производительность O (k).Поскольку фильтр будет иметь небольшой процент ложных срабатываний, вам также потребуется запустить второй этап.
Посмотрите на Guava BloomFilter для хорошей реализации.
Еще одно преимущество фильтра Блума состоит в том, что он не содержит исходного набора данных, а представляет собой только уменьшенный хеш, что означает, что его размер минимален.Это означает, что он больше подходит для распределенных систем, поскольку копирует очень эффективно.В такой среде, как Apache Spark, вы бы даже установили ее как переменную широковещания, поскольку после ее создания она обычно постоянна во времени.