2017-06-01 34 views
1

目前,我正在使用交換元素的迭代方法,這看起來效率很低。是否有可能在同一時間交換兩個二維數組?如何在C中定時交換兩個矩陣?

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

我想交換a & bO(1)

此外,如果我只想覆蓋ba,可以應用相同的解決方案嗎?

下面是我用來迭代地用'b'覆蓋'a'的代碼。

下面的代碼是用來用b來覆蓋:

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

下面是我用來交換一個代碼和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

我嘗試在C++中使用swap()。但它抱怨「沒有匹配的功能」。我用swap(a,b); – user3243499

回答

1

是否可以在固定時間內交換兩個二維數組?

交換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 
+0

如果我嘗試重寫而不是用B交換A,該怎麼辦?在這種情況下,我認爲我們需要遍歷每個值,因爲只是改變點數不會覆蓋任何實際值。 – 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

更改「將它們存儲爲指針」 –