合并两个非常大的列表

时间:2016-04-29 07:40:59

标签: algorithm list merge

给出一个大小为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很大,有没有办法在较小的空间复杂度下做到这一点?

2 个答案:

答案 0 :(得分:1)

感觉这可以用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)存储空间。

答案 1 :(得分:-1)

在Python中:

demo <- demo %>% 
      mutate(X = 
       ifelse(X == 0, 
              yes = (sort(demo$X[which.min(sort(demo$X)) + 1]/100)),
              no = X
              )
            )
demo.long <- reshape2::melt(demo,id.vars = "X") #reshapes the demo dataset to long format
ggplot(data = demo.long,
       aes(x = X, y = value, col = variable)
      ) + 
   geom_point() + 
   geom_smooth(method = drm, fct = L.4(), se = FALSE) +
   scale_x_log10() #plots out the dataset with the corresponding 4-parameter log-logit dose response curves