【问题标题】:Swapping elements between more than 2 arrays在超过 2 个数组之间交换元素
【发布时间】:2018-01-24 06:41:10
【问题描述】:

在单个数组 (x) 中交换元素是计算机科学中的经典问题。在像 C 这样的低级语言中,直接(但绝不仅仅是,例如 XOR)解决方案是使用临时变量:

x[0] = tmp
x[0] = x[1]
x[1] = tmp

上述算法交换了 x 的第一个和第二个元素。

在两个子数组 x 和 y 之间交换元素是类似的

x[0] = tmp
x[0] = y[1]
y[1] = tmp

对于 3 个数组的情况,如果添加了数组 1 的元素必须与数组 2 的元素交换并且数组 2 的元素必须与数组 3 的元素交换的附加限制,那该怎么办?数组 1 和 3 中的元素不会相互交换。

如何将这种方法(加上限制)推广到 k 个数组?

【问题讨论】:

  • 我在 R 中工作,但在我的示例中,索引从 0 开始(而不是像在 R 中那样为 1)
  • 这让我们想起了Tower of Hanoi 问题,请参阅链接中的 Frame–Stewart 算法以获得通用方法。

标签: r swap


【解决方案1】:

您可以创建一个重复您的指令集的 for 循环:

l=list(x = c(1,2,3,4,5),y = c(5,4,3,2,1),z = c(6,7,8,9,10))

swap_elements <- function(l)
{
  for(i in 1:(length(l)-1))
  {
    tmp = l[[i]][1]
    l[[i]][1] = l[[i+1]][2]
    l[[i+1]][2] = tmp
  }
  return(l)
}

输出:

> swap_elements(l)
$x
[1] 4 2 3 4 5

$y
[1] 7 1 3 2 1

$z
[1]  6  5  8  9 10

【讨论】:

  • 我目前拥有的 for 循环。到目前为止,它仅适用于 2 个数组
  • 那么你有一个推广到 k 数组的解决方案?我不确定你在找什么。
  • 你的解决方案比我的更简洁(没有概括)。谢谢。
【解决方案2】:

如果数组堆叠成矩阵,您可以滞后行以创建所需的操作

k <- 6

#generate dummy data with k rows and 3 columns
mat <- matrix(seq_len(3*k), nrow=k, byrow=TRUE)
mat

#lag the matrix
mat[c(seq_len(k)[-1], 1),]

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多