【问题标题】:Efficient Indexing method for a 2 by 2 matrix2乘2矩阵的高效索引方法
【发布时间】:2009-10-10 12:31:08
【问题描述】:

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

【问题讨论】:

    标签: data-structures matrix


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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


      您可以简单地将其视为相同大小的字节数组。 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);
      }
      

      【讨论】:

      • 我没明白。请详细解释一下。
      猜你喜欢
      • 1970-01-01
      • 2013-10-21
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多