目前,我正在使用逐元素交换的迭代方法,这似乎是非常低效的。是否可以在恒定时间内交换两个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;
}
}
答案 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)时间。仅当N
和M
不变时,这是固定时间。
替代策略是代码将指针交换到数组。
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