0

我有一个这样的列表:

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

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

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

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

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

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

4

1 回答 1

0

假设列表中有项目,则在 index 处n启动每个线程, 其中. 或者,更简单地说,将列表分成几部分,让每个线程处理一个部分。ii*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}.

Thread2会将其当前列表 ( {}) 与 thread3的原始列表(也是当前列表,因为我们在 thread 3-中没有找到标题{D,E,F})组合,因此 thread2将以{D,E,F}.

线程1会将其当前列表 ( {A,B}) 与线程2的原始列表 ( {C}) 结合起来,因此线程1将以{A,B,C}.

于 2013-10-01T19:23:33.137 回答