2017-06-01 1 views
1

現在、私は非常に非効率的であるように要素ごとにスワップする反復メソッドを使用しています。 2つの2D配列を一定時間で入れ替えることは可能ですか?Cで一定時間に2つの行列を入れ替える方法は?

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

私はO(1)a & bを交換したいと思います。

さらに、bからaに上書きしたい場合は、同じソリューションを適用できますか?

以下は、 'a'を 'b'で繰り返し使用するコードです。コードの下

は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; 
    } 
} 
+4

CまたはC++?一つを選ぶ! –

+3

ポインタを有効なソリューションに交換するでしょうか? – CIsForCookies

+0

私はswap()をC++で使ってみました。しかし、それは "マッチング機能がない"と不平を言っていました。私はスワップ(a、b)を使った。 – user3243499

答えて

1

2つの2D配列を一定の時間で入れ替えることはできますか?

2次元配列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 
+0

AとBを入れ替えるのではなく、オーバーライドしようとするとどうなりますか?そのような場合は、ポイントを変更するだけで実際の値が上書きされないため、すべての値を繰り返し処理する必要があると私は考えています。 – user3243499

+0

@ user3243499このコードは 'A'と' B'を入れ替えないので、 'B'へのポインタで' A'へのポインタを入れ替えます。投稿ごとに「上書き」すると、元のAの内容が破棄され、スワップの代用とはなりません。 – chux

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を使用することもできます。

+0

20行すべてを反復処理してから、aポインタとbポインタを使用してスワップする必要がありますか?または、swap(a、b)を直接スワップすることができますか? – user3243499

+1

@ user3243499 'swap()'は標準のCライブラリ関数ではありません。'swap(a、b)'は_function_として 'a'と' b'を入れ替えることはできません。 – chux

+0

変更点「ポインタとして保存」 –

関連する問題