C ++最佳优化方法来检查多维数组中的匹配

时间:2014-03-01 20:37:59

标签: c++ multidimensional-array matching

我有多维数组,例如:

int arr[4][3] ={{12, 29, 11, 22},
                {14, 22, 22, 22},
                {14, 14, 67, 22},
                {14, 18, 14, 45}};

现在我想通过预先定义的规则找到匹配例如:
找到所有在水平方向上的“22”数字,在原始数据中找到2个以上的数字(数组中的第1行) 要么 找到垂直的所有“14”数字,在垂直线上找到2个以上的数字(第1,2,3行) 以及斜边顺序(行[1,0],[2,1],[3,2])
现在我知道我可以扫描每个规则的数组并保持macing矢量
但是说阵列是15x15而且我有20条规则它可能非常凌乱 这有什么样的模式或算法吗? 最后,我喜欢模拟像老虎机匹配支付线的东西

1 个答案:

答案 0 :(得分:1)

将每条规则分成两部分。

  • 第一部分仅取决于细胞的内容。
  • 第二部分取决于模式。

仅扫描整个阵列一次。对于匹配第一部分的单元,在掩码中设置一个位。扫描完成后,使用逻辑运算来匹配第二部分中的模式。根据规则,您可能为数组中匹配的每个值都有一个位掩码。

例如,遵守1)以上的规则超过两个' 22'在行中,2)超过两个' 14'在专栏中。扫描阵列寻找22或14.请注意,从阵列中读取每个数字并进行所有比较效率要高得多,因为一旦值在CPU缓存中,其他比较就是" free" 。两个位掩码将是' 22'位掩码和' 14'位掩码。

有很明显的算法可以在一行或一列中找到多个位。对于R x C矩阵。

A1[C]
A2[C]
for r in 0 .. R-1
   A2 |= (A1 & Matrix.row(r))
   A1 |= Matrix.row(r)

最后,A2将是具有两个或更多位的所有列的掩码。要查找大于2的数字,只需添加A3等