在由向量表示的矩阵中交换两列

时间:2015-02-21 23:08:58

标签: c++ matrix time-complexity stdvector

我有以下问题: 我有一个代表二维矩阵的向量,我有行数和列数以及其他一些无关紧要的东西。

// A synomon for the type of the grayvalues
typedef unsigned int grayvalue_t;
static_assert(std::numeric_limits<grayvalue_t>::max()<=
              std::numeric_limits<size_t>::max(),
              "grayvalue_t maximum should be smaller than size_t maximum");

// Number of rows
size_t _R;
// Number of columns
size_t _C;
// Maximum grayvalue
grayvalue_t _MAX_G;
// Pixels' grayvalues
std::vector<grayvalue_t> _pixels;

我被要求在O(1)中交换两个给定的行(由索引给出),这不是问题因为我可以使用memcpy并在两个连续的内存块之间替换,但问题是我m还要求在O(1)时间内交换两个给定的列(再次通过索引),但在这种情况下,矩阵的列不是向量中的连续内存块。

/// swaps between rows r1 and r2
/// Time complexity: O(1)
void swap_rows(const size_t& r1, const size_t& r2) {

}

/// swaps between columns c1 and c2
/// Time complexity: O(1)
void swap_cols(const size_t& c1, const size_t& c2) {

}

我错过了什么吗? 想得到一些帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

与许多其他CS问题一样,答案是:再多一层间接。

一个选项是维护一个映射,该映射将矩阵中的列索引映射到向量中的实际索引。也就是说,您的矩阵列不会始终按顺序存储,而行的元素将保持连续。地图开始将0映射到0 1到1,依此类推。要交换两列,只需在地图中交换它们的条目即可。如果您还需要逐行遍历整个数组,则需要查看有关列顺序的地图。