Java 将链表拆分为比o(n)复杂度更好的较小列表

Java 将链表拆分为比o(n)复杂度更好的较小列表,java,algorithm,linked-list,Java,Algorithm,Linked List,需要编写一个例程,以便它可以将原始链表划分为多个大小较小的链表(作为函数参数提供) 有没有可能比o(n)复杂度做得更好。因为链表不是索引数据结构。我们可以利用多线程吗?否。使用线程是没有用的,因为O(n)是由搜索位置引起的,而不是实际的拆分,这可以在O(1)中完成。因此,即使您使用线程(不知道您希望如何实现这一点),您也会得到O(n),因为每个线程都必须搜索它拆分列表的节点。要使用链表,您必须访问所有节点,然后只有您才能创建其他列表。我不认为这可以在O(n)中完成。无论数据结构和现有算法如何,使

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


有没有可能比o(n)复杂度做得更好。因为链表不是索引数据结构。我们可以利用多线程吗?

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

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

无论数据结构和现有算法如何,使用恒定数量的线程永远不会降低渐进复杂性<代码>O(n)保留
O(n)

要真正降低它,您将需要可变数量的线程,这主要是理论上的兴趣,而在实践中是不可能的,因为内核的数量是固定的

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


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

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

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


如果你坚持有更多的并行性,你可以考虑一个增强的链表结构,它有“代码> P<代码>额外的指向中间节点的指针。这将允许

p
线程同时开始处理列表的
p
部分


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

你的意思可能是不到O(n)。
list split(int size,list l){

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