如何在C中以恒定时间交换两个矩阵?

时间:2017-06-01 13:45:10

标签: c

目前,我正在使用逐元素交换的迭代方法,这似乎是非常低效的。是否可以在恒定时间内交换两个2D阵列?

int a[20][100];
int b[20][100];

我想交换a& O(1)。{/ p>中的b

此外,如果我只想将b覆盖为a,是否可以应用相同的解决方案?

以下是我用迭代方式覆盖'a'和'b'的代码。

下面的代码用于覆盖a b:

for(x = 0;x<row;x++){
    for(y=0;y<col;y++){ 
       a[x][y] = b[x][y];
    }
}

以下是我用来交换a和b的代码:

for(x = 0;x<row;x++){
    for(y=0;y<col;y++){ 
       temp = a[x][y];
       a[x][y] = b[x][y];
       b[x][y] = temp;
    }
}

2 个答案:

答案 0 :(得分:6)

您需要将它们存储为指针。例如:

int a_store[20][100];
int b_store[20][100];

int (*a)[20][100] = &a_store;
int (*b)[20][100] = &b_store;

现在交换它们很容易。您也可以在堆上分配它们,或者在C ++中使用std::vector

答案 1 :(得分:1)

  

是否可以在恒定时间内交换两个2D阵列?

交换2个2D阵列A[N][M],B[N][M]需要O(N * M)时间。仅当NM不变时,这是固定时间。

替代策略是代码将指针交换到数组。

int main(void) {
  size_t N = 3, M = 4;
  // ...
  int A[N][M];
  memset(A, 1, sizeof A);
  int B[N][M];
  memset(B, 2, sizeof B);

  int (*Ap)[N][M] = &A;
  int (*Bp)[N][M] = &B;
  printf("A:%x %x B:%x %x \n", (*Ap)[0][0], (*Ap)[N-1][M-1], (*Bp)[0][0], (*Bp)[N-1][M-1]);

  // Swap pointers in O(1)
  int (*t)[N][M] = Ap;
  Ap = Bp;
  Bp = t;

  printf("A:%x %x B:%x %x \n", (*Ap)[0][0], (*Ap)[N-1][M-1], (*Bp)[0][0], (*Bp)[N-1][M-1]);
  return 0;
}

输出

A:1010101 1010101 B:2020202 2020202 
A:2020202 2020202 B:1010101 1010101