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