2乘2矩阵的有效索引方法

时间:2009-10-10 12:31:09

标签: data-structures matrix

如果我在2乘2矩阵中填充1到4之间的数字,则有16种可能的组合。我想要做的是将值存储在对应于每个矩阵的大小为24的数组中。所以给了一个 2乘2矩阵,我想要一个有效的索引方法直接索引到数组。(我不想比较16个位置中的每一个的所有4个元素)。类似于位向量的东西?但无法弄清楚如何? 我想要一个4乘4的矩阵,也从1到9

填充

2 个答案:

答案 0 :(得分:2)

澄清:您正在寻找2x2矩阵的高效哈希函数。你想使用哈希函数的结果来比较矩阵,看它们是否相同。

首先,假设您实际上想要数字0到3而不是1到4 - 这使得它更容易,并且更具计算机效率。接下来,16是不对的。数字0-3有24种可能的排列。有4 ^ 4 = 256个可能的长度为4的字符串使用四个字母的字母表(您可以重复已经使用过的数字)。

任何一个都很容易编码成单个字节。令前2位表示(0,0)位置,接下来的2位表示(0,1),依此类推。比如,哈希你的2x2矩阵,只需:

hash = m[0][0] | (m[0][1] << 2) | (m[1][0] << 4) | (m[1][1] << 6

随机示例:二进制数54是00110110,表示像:

这样的矩阵
2 1
3 0

答案 1 :(得分:1)

当你需要效率时,有时代码清晰度会在窗口外显示:)

首先,你需要确保你想要效率 - 你有分析信息,以确保简单的比较代码对你来说效率太低了吗?


您可以简单地将其视为相同大小的字节数组。 memcmp比较了任意记忆:

数据结构,例如:

int matrix[2][2];

的存储方式与:

相同
int matrix[2*2];

可以动态分配为:

typedef int matrix[2*2];
matrix* m = (matrix*)malloc(sizeof(matrix));

我不建议您动态分配它们,我说明了原始类型中的字节实际上是如何在内存中布局的。

因此,以下内容有效:

matrix lookup[16];

int matrix_cmp(const void* a,const void* b) {
   return memcmp(a,b,sizeof(matrix));
}

void init_matrix_lookup() {
   int i;
   for(i=0; i<16; i++) {
      ...
   }
   qsort(lookup,16,sizeof(matrix),matrix_cmp));
}

int matrix_to_lookup(matrix* m) {
   // in this example I'm sorting them so we can bsearch;
   // but with only 16 elements, its probably not worth the effort,
   // and you could safely just loop over them...
   return bsearch(m,lookup,16,sizeof(matrix),matrix_cmp);
}