将链表拆分为小于o(n)复杂度的列表

时间:2015-09-28 07:26:45

标签: java algorithm linked-list

list split(int size,list l){

...........
}

需要编写一个例程,以便它可以将原始的链表分成多个较小的大小的链表(作为函数参数提供)。

是否有可能比o(n)复杂度更好地做到这一点。由于链表不是索引数据结构。我们可以利用多线程

3 个答案:

答案 0 :(得分:2)

没有。使用线程没有用,因为O(n)是由搜索位置引起的,而不是实际的分割,这可以在O(1)中完成。因此,即使您使用了线程(不知道您希望如何实现这一点),您最终会得到O(n),因为每个线程都必须搜索它分割列表的节点。

答案 1 :(得分:0)

要使用链接列表,您必须访问所有节点,然后才能创建其他列表。我不认为这可以在O(n)中完成。

答案 2 :(得分:0)

无论手头的数据结构和算法如何,使用恒定数量的线程永远不会降低渐近复杂度。 O(n)仍为O(n)

要真正降低它,你需要一个可变数量的线程,这主要是理论上的兴趣,并且在实践中不可能因为核心数量是固定的。

(不计算链表遍历根本无法并行化的事实。)

如果列表是双向的并且其大小是事先已知的,则可以让两个线程并行地从两端执行拆分,并且每个线程处理一半的元素。最后,必须连接在中间形成的两个部分子列表。这有点复杂,因为其中一个子列表可能比尺寸短。

这将提供2的最大加速(理论上),并且不会推广到更多线程。

如果事先不知道元素的数量,则需要同步线程以使它们不会交叉,可能会导致灾难性的性能下降。

如果你坚持更多的并行性,你可以考虑使用p额外指向中间节点的增强链表结构。这将允许p个线程同时开始处理列表的p部分。

无论如何,对于列表的任何更改(例如子列表中的拆分!),您必须更新这些指针的位置。一种偏执的方式。