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

时间:2015-02-09 13:33:18

标签: c++

因此,对于家庭作业而言,我所承担的任务之一是使用在类类型对象中构建的矩阵相互交换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”是否为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

2 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是将修改行和列应用于每个维度,例如:

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] ) ];
}

这会在Trow处为您提供col项,但会通过修改行和列添加去引用。

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

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

并且嘿presto,下次你访问它时,第0行和第0行1将被切换。如果你有3 x 3矩阵或1000 x 1000就没关系,修改时间总是在向量中交换两个整数。

答案 1 :(得分:-2)

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

如果你想要O(1)而不是将矩阵表示为行数组,那么你可以交换两个行指针。然后交换两个cols意味着,你得到相同的结果O(_R)。