【发布时间】:2009-10-10 12:31:08
【问题描述】:
如果我在 2×2 矩阵中填充 1 到 4 的数字,则有 16 种可能的组合。我想要做的是将值存储在与每个矩阵对应的大小为 24 的数组中。所以给定一个 2 x 2 矩阵,我想要一种有效的索引方法来直接索引到数组中。(我不想比较 16 个位置中的每个位置的所有 4 个元素)。类似于位向量的东西?但无法弄清楚如何? 我想要一个 4 x 4 矩阵也从 1 填充到 9
【问题讨论】:
如果我在 2×2 矩阵中填充 1 到 4 的数字,则有 16 种可能的组合。我想要做的是将值存储在与每个矩阵对应的大小为 24 的数组中。所以给定一个 2 x 2 矩阵,我想要一种有效的索引方法来直接索引到数组中。(我不想比较 16 个位置中的每个位置的所有 4 个元素)。类似于位向量的东西?但无法弄清楚如何? 我想要一个 4 x 4 矩阵也从 1 填充到 9
【问题讨论】:
澄清一下:您正在寻找 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
【讨论】:
当您需要效率时,有时代码清晰性会消失 :)
首先你需要确定你想要效率 - 你有分析信息来确保简单的比较代码对你来说太低效了吗?
您可以简单地将其视为相同大小的字节数组。 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);
}
【讨论】: