如何使用线程对这个元素列表进行分组?

时间:2013-10-01 19:10:16

标签: multithreading algorithm list

我有一个这样的清单:

[Header/Element]
[Element]
[Element]
[Header]
[Element]
[Element]
[Element]
[Header]
[Element]
...
[Element/Header]

所以这个列表在第一个位置可能有也可能没有[Header],最后可能也不包含[Header]元素。

我被分配了创建一个算法来在每个标题下对这些元素进行分组,因此,标题的外观可以启动一个新组,其中所有元素都对应于该组。如果列表的第一个元素不是标题(可能是一种可能),则应使用默认组,因此直到下一个标题的所有元素都进入该组。最后的元素也是如此:可能没有标题告诉您结束/开始组的位置。到目前为止,在整个列表中进行线性迭代并不是很困难。

真正的问题是,有谁知道如何使用多个线程进行此分组算法?我想要多个线程的原因是因为这个头/元素列表可能非常大,所以我认为让很多线程在列表的不同部分进行分组是个好主意。

问题是我不知道可以执行此操作的步骤是什么以及如何同步线程,特别是列表的布局方式(使用标题,然后是下面的X元素数量)。 / p>

那么,你们有没有人之前解决过这样的问题?我对X编程语言中的某些特定实现并不感兴趣,但主要是在我可以用来完成此任务的过程中(以及我应该如何同步这些线程以防止重叠)。我正在使用C#以防万一你真的想分享一些代码。

1 个答案:

答案 0 :(得分:0)

假设列表中有n项,请在索引i处开始每个帖子i*m
其中m = threadCount / n。或者,简单来说,将列表拆分为多个部分,让每个线程处理一个部分。

现在,让每个线程读取元素​​并将其存储在自己的列表中。

一旦你阅读了一个标题,就存储你到目前为止所拥有的元素(前一个主题将在结尾处获得这些列表)并开始一个新列表。

从这里开始就非常简单 - 只要你拿到一个标题就读取元素并分开。

完成后,将您当前忙碌的列表与下一个帖子中的第一个列表合并。

如果一个线程在标题上开始,则第一个列表将为空。

如果一个主题在一个标题上结束,那么当前列表将为空,所以它只会从下一个主题中获取第一个列表。

您应该注意一些细微的细节,例如如何在最后组合列表,以及知道列表何时最终确定,或者是否将与其他列表组合,但这应该很容易。

示例:

输入:

A
B
C
Header
D
E
F
Header

有4个线程,因此每个线程各得2个:

A
B

C
Header

D
E

F
Header

然后:

Thread Processes
1      A
2      C
3      D
4      F

Thread Processes
1      B
2      Header
3      E
4      Header

此处线程2会将C放入其原始列表中,线程4会将F放入其原始列表中,每个帖子都会开始一个新列表。

现在我们已经完成了,所以:

线程3会将其当前列表({D,E})与线程4的原始列表({F})合并,因此线程3将结束与{D,E,F}

线程2将其当前列表({})与线程3的原始列表(也是当前列表)组合在一起,因为我们在线程{{1中找不到头文件}} - 3),因此线程{D,E,F}将以2结束。

线程{D,E,F}会将其当前列表(1)与线程{A,B}的原始列表(2)合并,因此线程{C}将结束与1