在c++中,在O(1)时间内交换2d数组的行或列

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

本文关键字:2d 交换 数组 时间 c++      更新时间:2023-10-16

我的问题是,如何在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]); }
};

编程中的每个问题都可以通过添加间接级别来解决(除了间接级别太多的问题);-)