Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何快速地从游戏板中获取模式?_C++_Performance_Pattern Matching - Fatal编程技术网

C++ 如何快速地从游戏板中获取模式?

C++ 如何快速地从游戏板中获取模式?,c++,performance,pattern-matching,C++,Performance,Pattern Matching,对于我最近的项目,我现在正在寻找一种有效的方法来构造和存储电路板信息,同时考虑模式匹配的用法 我有一个正方形的电路板,为了进行模式匹配,我使用了两个代表电路板一个字段的位字段。要匹配的图案具有菱形,可以围绕板上任何可能的场居中。(因此,中心不是静态的,我需要能够为任何中心执行此操作) O周围的菱形区域示例: ..X.. .XXX. XXOXX .XXX. ..X.. 如果钻石的一部分在游戏区域之外,则位将设置为11。钻石可以有不同的半径,上述示例的半径为2。 系统效率的另一个重要方面是,我必须

对于我最近的项目,我现在正在寻找一种有效的方法来构造和存储电路板信息,同时考虑模式匹配的用法

我有一个正方形的电路板,为了进行模式匹配,我使用了两个代表电路板一个字段的位字段。要匹配的图案具有菱形,可以围绕板上任何可能的场居中。(因此,中心不是静态的,我需要能够为任何中心执行此操作)

O周围的菱形区域示例:

..X..
.XXX.
XXOXX
.XXX.
..X..
如果钻石的一部分在游戏区域之外,则位将设置为11。钻石可以有不同的半径,上述示例的半径为2。 系统效率的另一个重要方面是,我必须能够快速旋转/镜像模式,使其成为所有8种可能的对称。 因此,实际上不在模式中存储中心点的信息可能是有益的,因为我的算法无论如何都不需要这样做,这可能是一个有价值的省时方法。因为现在一些位转移魔法可以快速旋转/镜像模式

由于这种模式匹配必须以较高的频率进行,因此如果实施不当,它可能会成为我整个项目的严重瓶颈。 当我试图为所有这些工作建立一个好的模型时,我想,有三个重要的关键领域需要考虑,但它们当然是紧密相连的

A.如何在电路板实现中存储数据

目前,这是以一种相当困难的方式完成的,这种方式太难以如此高的频率读取。但是,以任何可能的方式为整个电路板实际存储和更新2位数据不会有任何问题或时间限制。 最简单的方法是将整个电路板存储在一个大小为电路板两倍的位集中,然后每两位代表一个字段的值。但是,没有必要按照特殊的顺序或仅在一个位集中执行,即使一开始这样做看起来很自然。 无论如何,这是我最容易理解的部分,因为这可以在没有任何性能问题的情况下完成,它最好地服务于问题的其他两个关键部分

B.模式中的数据是如何存储的

这已经更加困难了。如前所述,我的意图是将它们存储在适当大小的位集中,但问题是它们的顺序如何。 似乎有两种方式很快就会浮现在脑海中:

a) (这可以在有或没有中心点C的情况下进行)

(b)

如果我们只是讨论模式,b)显然更优越。模式的旋转是通过一个简单的旋转移位(每次旋转总共3位操作)完成的,甚至镜像模式也可以通过大约12位操作完成。使用a)时,此类操作要耗时得多。 但是b)也有一些严重的缺点。。。这导致:

C.如何将数据从板实现读取到模式

从以上两种订购模式位的潜在方法来看,现在a)显然更优越。a) 可以由一组位操作从一个潜在数组中读取,如a中所述。您可以将每一行(通过位集使所有其他位为零)位移到适当的位置,并将它们与一些OR操作放在一起。即使在靠近电路板边缘的地方,这也可以很快完成。 当然,问题是,这仍然只能得到一种可能的图案对称性,但旋转/镜像并不是那么容易做到。这可以通过将每个模式保存8次来避免,但这看起来非常粗糙,可能会在其他地方引起麻烦。 对于b)这要困难得多。。。老实说,我看不出有什么方法可以不逐个检查每一个细节就快速完成。但是,当增加模式大小(如半径15)时,这需要花费很长时间,如果经常这样做,尤其是位集的[]运算符相当慢。 我想到的一个可能的解决方案是用CUDA编写,每个线程围绕一个字段生成一个模式,每个线程块围绕这个中心检查一个固定位置。但由于我以前没有使用过CUDA,我不知道这有多合理,但如果并行进行,这听起来比串行迭代所有位置更合理

由于我仍然没有找到一个令人满意的解决方案,我想在这里问一下,是否有人知道如何做得更好: -旋转/镜像模式(类型a) -或者快速读取类型b的模式(可能通过在步骤a中以更好的方式排列数据,我在这里很灵活) -或者CUDA的想法是否真的能解决这个问题 -或者是完全不同的方式,我没有想到,因为我相信聪明的人以前也会这样做

如果重要的话:我正在使用VS Pro 2013进行编码,不介意使用boost。如果CUDA能有效地解决这个问题,我也会使用它

编辑: 可以所以我继续思考整件事。也许还有其他一些方法可以让整个过程更高效,通过更高效的批量工作。 首先,我通常需要的是:在一个给定的棋盘位置上(我们说的是每秒10k的位置),我需要一个大的位置集(棋盘上的每个空字段,所以大多数字段)所有的图案,从15号到3号。我只需要数据库匹配的最大模式,但在任何情况下,我可能经常需要它们中的大多数。因此,有两件事可以节省一些时间:

1) 一些有效的方法来使用较大的图案,以生成较小尺寸的图案。这实际上应该是可能的,当使用b)中的位排序时,如果使用正确的方法。。。然后只需要几次操作就可以切断外环。。。 2) 由于相邻字段通常需要它们的特定模式,如果有某种方法可以在某种批处理操作中创建它们的模式。。。但是我
...0...
..123..
.45678.
9ABCDEF
.GHIJK.
..LMN..
...O...
...0...
..N14..
.ML235.
KJI.678
.HFC9A.
..GDB..
...E...