簡體   English   中英

在C ++中以O(1)時間交換2d數組的行或列

[英]Swap rows or columns of a 2d array in O(1) time in c++

我的問題是,如何在O(1)時間內交換2D數組的兩行或兩列?,我在互聯網上搜索時發現了memcpy函數,但我不知道如何使用它。 例如

給定一個矩陣:

1 2 3 
4 5 6 
7 8 9

如果我們交換第1行和第2行

4 5 6
1 2 3
7 8 9

您可以在行和列上都使用間接數組。 換句話說,使用元素i,j

data[rowix[i]][colix[j]]

而不是簡單

data[i][j]

這仍然是元素訪問的O(1)(盡管具有較大的常量因子),但也允許您在常量時間內交換行和列(只需交換索引數組元素)。

在C ++中

template<int ROWS, int COLS, typename T>
struct Mat2d {
    T data[ROWS][COLS];
    int colix[COLS], rowix[ROWS];
    Mat2d() {
        for (int i=0; i<ROWS; i++) {
            for (int j=0; j<COLS; j++) {
                data[i][j] = T();
            }
        }
        for (int i=0; i<ROWS; i++) rowix[i] = i;
        for (int j=0; j<COLS; j++) colix[j] = j;
    }
    T& operator()(int i, int j) { return data[rowix[i]][colix[j]]; }
    T operator()(int i, int j) const { return data[rowix[i]][colix[j]]; }
    void swapRows(int i1, int i2) { std::swap(rowix[i1], rowix[i2]); }
    void swapCols(int j1, int j2) { std::swap(colix[j1], colix[j2]); }
};

編程中的每個問題都可以通過添加一個間接級別來解決(除非存在過多的間接級別);-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM