Data structures 2×2矩阵的高效索引方法

Data structures 2×2矩阵的高效索引方法,data-structures,matrix,Data Structures,Matrix,如果我在一个2乘2的矩阵中填入从1到4的数字,有16种可能的组合。我要做的是将值存储在与每个矩阵对应的大小为24的数组中。所以给一个 2乘2矩阵,我想要一种高效的索引方法直接索引到数组中(我不想比较16个位置的所有4个元素)。类似于位向量的东西?但不知道怎么做? 我希望它适用于一个4乘4的矩阵,也可以从1填充到9,以澄清:您正在为2x2矩阵寻找一个有效的哈希函数。您希望使用哈希函数的结果来比较矩阵,看看它们是否相同 首先,假设你想要的是0到3的数字,而不是1到4的数字-这使它更简单,更具计算机科

如果我在一个2乘2的矩阵中填入从1到4的数字,有16种可能的组合。我要做的是将值存储在与每个矩阵对应的大小为24的数组中。所以给一个 2乘2矩阵,我想要一种高效的索引方法直接索引到数组中(我不想比较16个位置的所有4个元素)。类似于位向量的东西?但不知道怎么做?
我希望它适用于一个4乘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

澄清一下:您正在寻找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

当您需要效率时,有时代码的清晰性就会消失:)

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


您可以简单地将其视为相同大小的字节数组
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);
}
矩阵查找[16];
int矩阵_cmp(常数无效*a,常数无效*b){
返回memcmp(a、b、sizeof(矩阵));
}
void init_矩阵_查找(){
int i;

对于(i=0;i当您需要效率时,有时代码清晰性会消失:)

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


您只需将其视为大小相同的字节数组。
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);
}
矩阵查找[16];
int矩阵_cmp(常数无效*a,常数无效*b){
返回memcmp(a、b、sizeof(矩阵));
}
void init_矩阵_查找(){
int i;

例如:(i=0;i不明白。请详细解释。我不明白。请详细解释。