一个并行算法可能看起来像这样:
- Sort the list of terms alphabetically using a parallel sort algorithm
- Divide the sorted list of terms into chunks, such that all interesting terms are in the same chunk. If I m not mistaken, so long as each chunk starts with the same character, you ll never have interesting matches across two chunks (matches and prefixes will always have the same first character, right?)
- For each chunk, find terms that are prefixes and/or matches, and take appropriate action. This should be easy, since matching terms will be right next to each other (since the big list is sorted, each chunk will be too).
一些注记:
这需要一种并行排序算法。显然这样的算法已经存在,但是我对它们不太了解,因为我从来没有直接使用过它们。你的结果可能会有所不同。
第二步骤(将工作负载拆分成块)本身似乎不可并行化。您可以使用修改后的二分搜索来实现它,以找到第一个字符更改的位置,因此希望这部分很便宜,但可能不是,并且在测量之前您可能不会确定。
如果您最终得到许多块,并且其中一个显然是最大的,那么您的性能将会很糟糕。
您是否考虑将算法保持单线程,但更改第一步以对列表进行排序?
目前,问题中描述的算法为O(n^2),因为它每个元素循环一次列表。如果列表已排序,则可以在一次遍历列表中找到重复项(重复项将紧挨着彼此) - 包括排序,总成本为O(n log n)。对于大型数据集,这将快得多。希望它快到足以避免多个线程,这将是很多工作。