Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 交换行&;复杂度为O(1)的矩阵中的列_C++ - Fatal编程技术网

C++ 交换行&;复杂度为O(1)的矩阵中的列

C++ 交换行&;复杂度为O(1)的矩阵中的列,c++,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. size\u t\R;//行数。 尺寸_t _C;//列数。 std::vector mat;//表示矩阵的T型变量数

对于家庭作业,我的任务之一是使用类类型对象中内置的矩阵相互交换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.
size\u t\R;//行数。
尺寸_t _C;//列数。
std::vector mat;//表示矩阵的T型变量数组。
例如,如果我有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;
    }
}
void swap\u行(常量大小\u t&r1、常量大小\u t&r2){
对于(大小i=0;i<\u C;i++)
{
温度=材料[i+(r1*C)];
mat[i+(r1*(u C)]=mat[i+(r2*(u C)];
材料[i+(r2*_C)]=温度;
}
}

但我认为这是O(n)复杂性,因此一个不可行的方法:p一种方法是对每个维度应用修改的行和列,如:

std::vector<size_t>(_R) row_i;
std::vector<size_t>(_C) col_i;
这将为您提供位于
的项目
T
,但通过修改行和列添加了取消引用

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

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

嘿,普雷斯托,下次你访问它时,第0行和第1行将被切换。不管你是3 x 3矩阵还是1000 x 1000矩阵,修改时间总是一个向量中两个整数的交换。

一个向量是无间接寻址的随机访问,所以你的问题总是向量中两行的O(_C)*O(2)=O(_C)


如果需要O(1),那么可以将矩阵表示为行数组,这样就可以交换两个行指针。交换两个col意味着,您得到了相同的结果O(_R)。

请告诉我们您尝试了什么将表示形式转换为纯向量,我认为这是不可能的。嗯,您至少需要尝试一下,然后我们可以更正您的代码并帮助您改进代码。如果我们只是给你一个你很难理解的代码,那又有什么意义呢。另一方面,如果你自己尝试,我们指出错误,这不仅会给你更多的练习,而且会帮助你理解你将遇到的所有问题以及如何解决这些问题如果你有一个额外的向量包含每行的开始,你只需要交换这些条目。O(1)交换,O(1)查找,但O(n)额外内存(如果n是行数)。请注意,这不会改变实际的矩阵,只会改变值查找,这通常已经足够好了,除非您需要使用特殊格式的矩阵(例如,对于LAPACK、BLAS、PETSc或其他库)。@Zeta的建议很好,但请记住,O表示法的含义远不止这些。这允许O(1)交换和仍然O(1)访问,但由于额外的查找,绝对访问时间稍慢。哪一个最好取决于你是经常交换还是很少交换。请记住,这会给你带来另一层间接性。根据互换的频率,您更愿意互换。无论哪种方法,在您尝试优化程序之前,都不要忘记运行探查器。如果允许,只需添加一个转置标志。@MiloYip:如果您需要转置矩阵,这会有所帮助,但如果您想交换两个特定行,则不会。这仍然是O(n),因为数组上的
std::swap
使用
swap\u range
。(它可以在std::vector上运行。你是对的,代码是错的。行交换将在
T*mat[\u R]上工作;对于(int i=0;/*…*/){mat[i]=new T[_C];}/*…*/标准::交换(材料[3],材料[4])用于交换第4行和第5行Nope,如果他有两级指针,交换两行只意味着将指针更改为行。。。。这将是一个解决方案。考虑一下使用@Component 10实现的算法。他们总是计算每个元素的索引。我的实现只使用一个间接方式来访问完整的行。
std::swap( row_i[0], row_i[1] );