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

C++ Best optimize way to check matches in multidimensional array

本文关键字:最佳 方法 优化 检查 数组 C++      更新时间:2023-10-16

我有多维数组,例如:

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

现在我喜欢通过预先定义的规则来查找匹配,例如:
查找所有水平的"22"个数字,并在原始数据中查找大于2的数字(数组中的第1行)或找到所有垂直的"14"个数字,并在垂直线(第1、2、3行)中找到大于2的数字也按次细序(行[1,0],[2,1],[3,2])
现在我知道我可以扫描阵列中的每个规则并保持macing向量
,但假设阵列是15x15,我有20个规则,这可能会非常混乱
有某种模式或算法吗
最后我喜欢模拟一些类似老虎机匹配支付线的东西

将每个规则分成两部分。

  • 第一部分仅取决于单元格的内容
  • 第二部分取决于模式

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

例如,采用以下规则:1)行中有两个以上的"22",2)列中有两条以上的"14"。扫描阵列,查找22或14。请注意,从数组中读取每个数字一次并进行所有比较要高效得多,因为一旦值在CPU缓存中,其他比较就"免费"了。这两个位掩码将是"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等