切换行&具有O(1)复杂度的矩阵中的列

Switching rows & columns in a matrix with O(1) complexity

本文关键字:复杂度 换行 amp 具有      更新时间:2023-10-16

因此,对于家庭作业,我的任务之一是用类类型对象中构建的矩阵交换2行或2列,并使用这3个参数来定义它:

size_t _R;// Number of rows.
size_t _C;// Number of columns.
std::vector<T> mat;// array of T type variables to represent the matrix.

例如,如果我有3行3列,int向量数组为1,2,3,4,5,6,7,8,9,那么交换行0和1会使其看起来像4,5,6,1,2,3,7,8,9。

因此,实现交换不是问题所在,但我不明白的是,在O(1)复杂性的情况下,你打算如何实现交换
我想做的是在行/列中的每个类型之间单独切换,但那将是O(n),对吧?因为这取决于每行/每列中的项目数量。

编辑:我尝试的示例代码:

void swap_rows(const size_t& r1, const size_t& r2) {
    for (size_t i = 0; i < _C; i++)
    {
        T temp = mat[i + (r1 * _C)];
        mat[i + (r1 * _C)] = mat[i + (r2 * _C)];
        mat[i + (r2 * _C)] = temp;
    }
}

但我相信这是O(n)的复杂性,因此是不可行的:p

一种方法是将修改行和列应用于每个维度,如:

std::vector<size_t>(_R) row_i;
std::vector<size_t>(_C) col_i;

然后,它们分别被初始化为例如{0, 1, 2}。然后,您可以通过以下集合取消引用来访问您的项目:

T getItem( size_t row, size_t column )
{
    return mat[ ( row_i[row] * _C ) + col_i[col] ) ];
}

这将在rowcol处为您提供项目T,但通过修改行和列添加了取消引用。

现在,例如,要交换两行,您只需要说:

std::swap( row_i[0], row_i[1] );

嘿,很快,下次你访问它时,行0&1将被切换。不管你是有一个3 x 3矩阵还是1000 x 1000矩阵,修改时间总是只交换向量中的两个int。

向量是无间接的随机访问,因此对于向量中的2行,问题始终是O(_C)*O(2)=O(_C)。

如果希望O(1)将矩阵表示为行数组,则可以交换两个行指针。交换两个列意味着,得到相同的结果O(_R)。