因此,对于家庭作业而言,我所承担的任务之一是使用在类类型对象中构建的矩阵相互交换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
答案 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] ) ];
}
这会在T
,row
处为您提供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)。