У меня есть список около 300 тыс. общих слов, хранящихся в массиве. Итак, 1 элемент массива = 1 слово.
С другой стороны, у меня есть огромный список строк, которые МОГУТ содержать один или несколько из этих 300 тыс. слов внутри них. Пример строки: ifdxawesome453
.
Теперь мне нужно проверить каждую из этих длинных строк против общих слов. Если в этой строке найдено слово, немедленно вернитесь. Итак, мне нужно снова проверить слова 300k ifdxawesome453
и посмотреть, содержится ли в нем какое-либо из них.
Так что я делаю:
huge_list_of_words.any? do |word|
random_long_word.include?(word)
end
В то время как это нормально для небольших образцов случайных длинных слов, если у меня есть миллионы, то для завершения задания требуется несколько часов.
Есть ли способ сделать это быстрее? Единственный способ, которым я думал, - это, если я выберу, скажу 10k наиболее распространенных слов из этих 300k и сначала сравним их, и если совпадение не найдено, сравните с полным списком.
Другой способ, который резко ускорил работу, состоял в том, чтобы сгруппировать массив из 300 тыс. слов по размеру. Когда я сравниваю длинное случайное слово против него, я сначала проверяю, есть ли размер слова и отфильтруйте более длинные слова. Затем меня оставляют индексы равного размера или меньше слов и ищут их, начиная с слова с наименьшим размером.