(Когда вы говорите «эффективный», вам, вероятно, нужно быть более явным с точки зрения пространства и времени. Допустим, вы имеете в виду эффективность времени (учитывая, что вы упомянули перестановки)).
Задача вычисления ответа на
String[] findStringsContaining(List<String> strings, String[] words)
может быть разделен и передан параллельным потокам выполнения, учитывая, что он является чисто функциональным и не имеет побочных эффектов на промежуточном этапе, а результаты объединяются в качестве последнего этапа. То есть Вы можете разбить на слова и / или список строк.
Вот как работает map-lower (и ваш случай не имеет значения, что все это происходит на одной машине).
Ваш маппер (назначенный потоку для каждого из слов):
boolean [] stringContainsWord (List<String> strings, String word);
Этот метод будет выполняться параллельно.
В этом случае логический массив будет иметь значение true для каждого индекса (списка), соответствующего данному слову.
и ваш редуктор (работает после завершения всех картографов):
List<String> getMatchingList(List<String>, List<boolean[]> mapperResults);
Если отбросить накладные расходы на потоки и предположить, что расходы на отображение карт незначительны для разумного числа входных слов, это даст вам O (n) (для преобразователя) + O (m) (для преобразователя) процесс времени, где n - количество элементов в вашем списке строк, а m - количество слов в вашем вводе.
Вы можете дополнительно распараллелить задачу, разделив ваш список строк и запустив p-потоки для каждого слова, и каждый поток будет искать подмножество вашего списка Strings, так что входной список для вашего преобразователя равен 1 / р элементы общего списка.
-
Альтернативный подход, который вы, возможно, захотите рассмотреть, особенно если список строк огромен, а содержимое - это язык (например, английский), заключается в оптимизации, учитывая тот факт, что большинство языков имеют довольно небольшой набор слов которые составляют большую часть предложений на этом языке. Например, если в вашем списке 2 миллиона английских предложений, есть вероятность, что список уникальных слов будет на много порядков меньше (скажем, несколько сотен).
В этом случае вы можете иметь карту слов -> предложений, и проверка на соответствие предложений для любого данного слова сводится к поиску на карте.
(Обратите внимание, что вы все еще можете комбинировать первоначальный подход с этим.)