切换行&具有O(1)复杂度的矩阵中的列
Switching rows & columns in a matrix with O(1) complexity
因此,对于家庭作业,我的任务之一是用类类型对象中构建的矩阵交换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] ) ];
}
这将在row
、col
处为您提供项目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)。
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 函数复杂度分析
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 具有嵌套 if-else 的循环的时间复杂度
- C++中 std::map 的运行时复杂度是多少?
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 切换行&具有O(1)复杂度的矩阵中的列
- 调用恒定复杂度O(1)5行函数会显著影响性能,原因如下
- 从数据库中搜索时间复杂度为O(1)O(logn)的行