Параллельный алгоритм может выглядеть так:
- Сортировка списка терминов по алфавиту с использованием алгоритма параллельной сортировки
- Разделите отсортированный список терминов на куски, чтобы все интересные термины были в одном кусочке. Если я не ошибаюсь, поскольку каждый чанк начинается с одного и того же символа, у вас никогда не будет интересных совпадений между двумя чанками (совпадения и префиксы всегда будут иметь один и тот же первый символ, верно?)
- Для каждого чанка найдите термины, которые являются префиксами и / или соответствиями, и примите соответствующие меры. Это должно быть легко, так как совпадающие термины будут рядом друг с другом (поскольку большой список отсортирован, каждый блок тоже будет).
Некоторые заметки:
Для этого требуется алгоритм параллельной сортировки. Очевидно, они существуют, но я не знаю о них больше, так как мне никогда не приходилось использовать их напрямую. Ваш пробег может меняться.
Второй шаг (разделение рабочей нагрузки на куски), по-видимому, не может быть распараллелен. Вы можете реализовать его с помощью модифицированных бинарных поисков, чтобы определить, где меняется первый символ, поэтому, надеюсь, эта часть будет дешевой, но это может быть не так, и вы, вероятно, не будете знать наверняка, пока не измерите.
Если у вас будет много блоков, и один из них будет самым большим, ваша производительность будет отстойной.
Рассматривали ли вы сохранить алгоритм однопоточным, но изменить его так, чтобы первый шаг сортировал список?
В настоящее время алгоритм, описанный в этом вопросе, имеет вид O (n ^ 2) , поскольку он проходит по списку один раз для каждого элемента в списке. Если список отсортирован, то дубликаты могут быть найдены за один проход по списку (дубликаты будут рядом друг с другом) - включая сортировку, это общая стоимость O (n log n) . Для больших наборов данных это будет намного, намного быстрее. Надеюсь, это будет достаточно быстро, чтобы вы могли избежать нескольких потоков, что будет много работы.