list split(int size,list l){
...........
}
需要编写一个例程,以便它可以将原始的链表分成多个较小的大小的链表(作为函数参数提供)。
是否有可能比o(n)复杂度更好地做到这一点。由于链表不是索引数据结构。我们可以利用多线程
答案 0 :(得分:2)
没有。使用线程没有用,因为O(n)
是由搜索位置引起的,而不是实际的分割,这可以在O(1)
中完成。因此,即使您使用了线程(不知道您希望如何实现这一点),您最终会得到O(n)
,因为每个线程都必须搜索它分割列表的节点。
答案 1 :(得分:0)
要使用链接列表,您必须访问所有节点,然后才能创建其他列表。我不认为这可以在O(n)中完成。
答案 2 :(得分:0)
无论手头的数据结构和算法如何,使用恒定数量的线程永远不会降低渐近复杂度。 O(n)
仍为O(n)
。
要真正降低它,你需要一个可变数量的线程,这主要是理论上的兴趣,并且在实践中不可能因为核心数量是固定的。
(不计算链表遍历根本无法并行化的事实。)
如果列表是双向的并且其大小是事先已知的,则可以让两个线程并行地从两端执行拆分,并且每个线程处理一半的元素。最后,必须连接在中间形成的两个部分子列表。这有点复杂,因为其中一个子列表可能比尺寸短。
这将提供2
的最大加速(理论上),并且不会推广到更多线程。
如果事先不知道元素的数量,则需要同步线程以使它们不会交叉,可能会导致灾难性的性能下降。
如果你坚持更多的并行性,你可以考虑使用p
额外指向中间节点的增强链表结构。这将允许p
个线程同时开始处理列表的p
部分。
无论如何,对于列表的任何更改(例如子列表中的拆分!),您必须更新这些指针的位置。一种偏执的方式。