使用我不能分为segads。至于上面的例子,如果设置了5个线程,那么第一个段将占用2个第一个对象,第二个第3个和第4个,因此它们不会找到重复,但是如果我们合并它们的第2个和第3个,则会有重复。
从第一线开始可能会有更复杂的战略......啊没关系,难以解释。当然,问题本身就在我的计划中。
临屋 修改
InChunk,然后继续分析该块直到最后。 ; /
答案 0 :(得分:4)
我认为将要删除的项目分开的过程将需要查看该部分的结尾并继续前进以包含通过它的重复项。例如,如果你有:
1 1 2 . 2 4 4 . 5 5 6
你分成3个块,然后分割过程需要1 1 2
但是看到还有另一个2
所以它会生成1 1 2 2
作为第一个块。它会再次向前移动3并生成4 4 5
,但会看到有前进的副本并生成4 4 5 5
。第三个线程只有6
。它会变成:
1 1 2 2 . 4 4 5 5 . 6
块的大小将不一致但随着整个列表中的项目数量变大,这些小的变化将是无关紧要的。最后一个线程可能只有很少的事情要么完全没有改变,但是再次,随着元素数量的增加,这不应该影响算法的性能。
我认为这种方法比某种线程处理重叠块更好。使用这种方法,如果你有很多重复,你可以看到它必须处理超过2个连续的块,如果你不幸的假设副本。例如:
1 1 2 . 2 4 5 . 5 5 6
由于2s和5s,一个线程必须处理整个列表。
答案 1 :(得分:2)
我会使用基于块的分区,任务队列(例如ExecutorService
)和私有哈希表来收集重复项。
池中的每个线程将根据需要从队列中获取块,并将1添加到与私有哈希表中项的键对应的值。最后,它们将与全局哈希表合并。
最后只需解析哈希表,看看哪些键的值大于1。
例如,块大小为3且项目为:
1 2 2 2 3 4 5 5 6 6
假设池中有2个线程。线程1将占用1 2 2,线程2将占用2 3 4.专用哈希表将如下所示:
1 1
2 2
3 0
4 0
5 0
6 0
和
1 0
2 1
3 1
4 1
5 0
6 0
接下来,线程1将处理5 5 6,线程2将处理6:
1 1
2 2
3 0
4 0
5 2
6 1
和
1 0
2 1
3 1
4 1
5 0
6 1
最后,副本分别为2,5和6:
1 1
2 3
3 1
4 1
5 2
6 2
由于每个线程的私有表,这可能占用一些空间,但是允许线程并行操作,直到最后的合并阶段。