【问题标题】:Merging two very large lists合并两个非常大的列表
【发布时间】:2016-08-24 06:26:30
【问题描述】:

给定一个大小为 2n -1 个元素的列表,该列表如下所示:

x1, x2, x3, ....., xn, y1, y2, y3, ....y(n-1)

将其转换为:

x1, y1, x2, y2, x3, y3, ........., y(n-1), xn

我可以为每个列表使用两个迭代器,并以 O(n) 时间复杂度和 O(n) 空间复杂度获得解决方案。但是如果我的 n 非常大,有没有办法以较小的空间复杂度做到这一点?

【问题讨论】:

标签: algorithm list merge


【解决方案1】:

在 Python 中:

lst = 'x1 x2 x3 x4 x5 y1 y2 y3 y4 y5'.split()

lst
Out[9]: ['x1', 'x2', 'x3', 'x4', 'x5', 'y1', 'y2', 'y3', 'y4', 'y5']

out = sum((list(xy) for xy in zip(lst[:len(lst)//2], lst[len(lst)//2:])), [])

out
Out[11]: ['x1', 'y1', 'x2', 'y2', 'x3', 'y3', 'x4', 'y4', 'x5', 'y5']

【讨论】:

  • 这会占用O(n) 额外的空间,这是 OP 明确想要避免的。
【解决方案2】:

感觉这可以用 O(1) 空间和 O(n) 时间完成,但算法远非微不足道。基本上取一个不合适的元素,比如 x2,看看它在最终排列中需要放在哪里,取出那里的元素(即 x3)并放入 x2。 现在看看 x3 需要去哪里等等。

当循环关闭时,取出下一个不合适的元素(如果有的话)。

举个例子:

x1 x2 x3 y1 y2      x2 is out of place so take it into temp storage
x1 -- x3 y1 y2      temp: x2       needs to go where x3 currently is
x1 -- x2 y1 y2      temp: x3       needs to go where y2 currently is
x1 -- x2 y1 x3      temp: y2       needs to go where y1 currently is
x1 -- x2 y2 x3      temp: y1       needs to go into the empty slot
x1 y1 x2 y2 x3      all elements in place -> finished

如果数组索引从 0 开始,则元素在 k 处的最终位置由下式给出

2k            if k < n
2(k-n) + 1    if k >= n

困难在于找出循环中尚未处理的元素。例如,如果 n = 4,则有 3 个循环:

0 -> 0
1 -> 2 -> 4 -> 1
3 -> 6 -> 5 -> 3

目前我没有一个简单的解决方案。

如果每个数组元素有一个可用的存储空间,这很简单,但我们又回到了 O(n) 存储空间。

【讨论】:

  • 我无法准确地描述这一点。你能解释一下使用 3-4 个元素吗?
  • 看起来很整洁。但是我如何确保我没有丢失任何元素?另外,找到我的元素去哪里的复杂性是什么?
  • 对我有什么想法吗?
  • 完成一个循环后如何知道“下一个不合适的元素”?
  • 如果你拿一个元素,你怎么知道“它需要在最终安排中的位置”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 2020-12-31
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多