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