我有一个这样的清单:
[Header/Element]
[Element]
[Element]
[Header]
[Element]
[Element]
[Element]
[Header]
[Element]
...
[Element/Header]
所以这个列表在第一个位置可能有也可能没有[Header],最后可能也不包含[Header]元素。
我被分配了创建一个算法来在每个标题下对这些元素进行分组,因此,标题的外观可以启动一个新组,其中所有元素都对应于该组。如果列表的第一个元素不是标题(可能是一种可能),则应使用默认组,因此直到下一个标题的所有元素都进入该组。最后的元素也是如此:可能没有标题告诉您结束/开始组的位置。到目前为止,在整个列表中进行线性迭代并不是很困难。
真正的问题是,有谁知道如何使用多个线程进行此分组算法?我想要多个线程的原因是因为这个头/元素列表可能非常大,所以我认为让很多线程在列表的不同部分进行分组是个好主意。
问题是我不知道可以执行此操作的步骤是什么以及如何同步线程,特别是列表的布局方式(使用标题,然后是下面的X元素数量)。 / p>
那么,你们有没有人之前解决过这样的问题?我对X编程语言中的某些特定实现并不感兴趣,但主要是在我可以用来完成此任务的过程中(以及我应该如何同步这些线程以防止重叠)。我正在使用C#以防万一你真的想分享一些代码。
答案 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
。