【问题标题】:How to merge two linked lists in O(1) time in c?如何在c中以O(1)时间合并两个链表?
【发布时间】:2010-08-15 15:58:04
【问题描述】:

给定两个列表 l1,l2,展示如何在 O(1) 时间内合并它们。列表的数据结构取决于您如何设计它。通过合并我的意思是说列表的联合。

例如:List1 = {1,2,3} List2 = {2,4,5}

合并列表 = {1,2,3,4,5}

【问题讨论】:

  • 这可能吗?
  • 听起来这是你的“facebook电话采访”的一部分。 ;)
  • 我可以使用从 Honest Mike 的 Parallel Dimension 商店购买的计算机在 O(0) 内完成。
  • @tyler .. :O 你怎么知道..??我正在为此做准备..
  • @vaibhav 我在你家有摄像头。

标签: c linked-list


【解决方案1】:

关于“合并”两个排序列表

O(1) 中将两个排序列表合并为一个排序列表是直接不可能的。

你能做的最接近的事情是有一个“惰性”合并,它可以按需提取O(1) 中的每个连续元素,但要执行完全合并,它仍然是O(N)(其中N 是元素的数量)。

您可以做的另一件事是物理上加入两个列表末端到末端到一个列表中,不执行任何merge algorithm,这样一个列表中的所有元素都在另一个列表中的所有元素之前.这实际上可以在O(1) 中完成(如果列表维护头和尾指针),但这不是传统定义的合并。


O(1) 中的集合并集

如果问题是关于什么样的集合表示允许O(1) 中的联合操作,那么是的,这实际上可以做到。在实践中有许多set representation 可能,每个都有一些优点和缺点。

这种特殊表示的一个重要示例是disjoint-set data structure,它允许基本UnionFind 操作的O(α(n)) 摊销时间。 αAckermann function 的倒数;当 Ackermann 函数增长得非常快时,它的反函数 α 增长得非常慢。不相交集数据结构本质上为任何实际大小提供了摊销的O(1) 操作。

注意“disjoint”是这里的关键:它不能代表两个集合{1, 2, 3}{2, 4, 5},因为这些集合不是不相交的。不相交的集合数据结构表示许多集合(不仅仅是两个),但不允许两个不同的集合具有共同的元素。

另一个非常实用的集合表示是bit array,其中元素映射到位索引,0/1 分别表示缺席/存在。使用这种表示,联合只是按位 OR;按位 AND 相交。渐近地说,这不是最好的表示,但在实践中它可以是一种高性能的集合表示。

【讨论】:

  • 为什么不可能?只需将 l1 的 next 指针指向 l2 的头部即可。
  • @GregS 这是追加操作,而不是合并操作(联合)。合并/联合将消除重复元素。
  • @Greg 如果 l1 和 l2 有重复项怎么办?
  • @Johannes 根据问题中给出的示例,它显然不应该是一个多重集。
  • 谢谢,你说得对,海报明明用了“联合”这个词。
【解决方案2】:

您正在寻找的不是在 O(1) 时间内合并两个“列表”的算法。如果您将“列表”理解为“链表”,那么这将不会比 O(n) 更快。

你被要求找到的是一个 数据结构 来存储这些数据,它支持在 O(1) 时间内进行合并。这个数据结构不会是一个列表。在“硬”O(1) 时间内合并通常仍然是不可能的,但是有些数据结构支持在 amortized O(1) 时间内进行合并。也许最著名的例子是Fibonacci Heap

【讨论】:

  • 但问题是指union 运算符而不是merge 尽管它的标题
  • 联合和合并在数据结构的上下文中经常被视为同义词。
【解决方案3】:

我不是那么有经验,所以如果我说一些愚蠢的话,请不要打我。

这行得通吗?既然你有两个链接列表,你如何连接 在第一个列表的最后一个元素上 第二个列表的第一个元素?我们还在谈论指针对吗?列表最后一个元素的指针现在指向第二个列表的第一个元素。

这行得通吗?

编辑:但我们正在寻找工会。所以我猜它不会...

【讨论】:

    【解决方案4】:

    您利用 PC 是具有 2^(内存/存储空间位)状态的有限状态机这一事实,从而声明所有内容 O(1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      相关资源
      最近更新 更多