给定两个列表l1,l2,显示如何在O(1)时间内合并它们。列表的数据结构取决于您的设计方式。通过合并我的意思是说列表的结合。
例如:List1 = {1,2,3} List2 = {2,4,5}
合并清单= {1,2,3,4,5}
答案 0 :(得分:11)
直接无法将两个已排序的列表合并到O(1)
中的一个已排序列表中。
关于你能做的最接近的事情是有一个“懒惰”合并,可以按需提取O(1)
中的每个连续元素,但是为了执行完全合并,它仍然是O(N)
(其中{ {1}}是元素的数量。)
你可以做的另一件事是物理上加入两个列表结束到一个列表,不执行任何merge algorithm,这样一个列表中的所有元素都来自于其他清单。事实上这可以在N
中完成(如果列表保持头尾指针),但这不是传统定义的合并。
O(1)
如果问题是关于什么样的集合表示允许在O(1)
中进行联合操作,那么是的,事实上这可以完成。在实践中有许多set representation可能,每个都有一些优点和缺点。
此专门表示的一个基本示例是disjoint-set data structure,它允许基本联盟和查找操作的O(1)
摊销时间。 O(α(n))
是Ackermann function的倒数;随着阿克曼函数的快速增长,其反α
增长非常缓慢。不相交集数据结构实质上为任何实际大小提供了摊销α
操作。
请注意,“disjoint”是一个关键点:它不能代表两个集合O(1)
和{1, 2, 3}
,因为这些集合不是不相交的。不相交的集合数据结构代表许多集合(不仅仅是两个),但是不允许两个不同的集合具有共同的元素。
另一个非常实用的集合表示是bit array,其中元素被映射到比特索引,而{2, 4, 5}
/ 0
分别表示不存在/存在。通过这种表示,联合只是一个按位 OR ;交叉点按位 AND 。渐近地,这不是最佳表示,但它在实践中可以是高度高效的集合表示。
答案 1 :(得分:9)
你要找的不是算法在O(1)时间内合并两个“列表”。如果您将“列表”视为“链接列表”,那么这不能比O(n)更快地完成。
您要求查找的是数据结构,用于存储此数据,支持在O(1)时间内合并。此数据结构不是列表。在“硬”O(1)时间内合并仍然是不可能的,但是有一些数据结构支持在摊销 O(1)时间内合并。也许最着名的例子是Fibonacci Heap。
答案 2 :(得分:0)
我不是那么有经验,所以如果我说些蠢话,请不要打我。
这会有用吗?由于你有两个链接列表,你如何连接 在第一个列表的最后一个元素上 第二个清单的第一个元素?我们还在谈论指针吧?列表的最后一个元素的指针现在指向第二个列表的第一个元素。
这有用吗?
编辑:但我们正在寻找工会。所以我猜它不会...
答案 3 :(得分:-1)
您利用PC是具有2 ^(内存/存储空间位)状态的有限状态机,从而声明所有内容O(1)
。