我的问题与以下内容密切相关: Removing duplicate chess games and then storing unique games in Postgresql
我想存储大量国际象棋PGN,以避免像Kempchee这样的重复项。
引用Kempchee ““我有很多国际象棋游戏(大约500万个)存储在多个pgn文件中(便携式游戏符号)。如果您不熟悉PGN,其结果基本上是一个csv文件在解析后会显示,其中的几个字段包含有关玩家,位置等的信息,然后是一个较大的文本字段,其移动之间有一定的距离(可能有一个空格)。每个游戏中会有一行包含此类数据。”
特别是对我而言,我将跟随树结构用作数据结构:
问题在于,国际象棋游戏可以通过不同的移动顺序转换为同一游戏。我设想如果另一个树枝转入另一个节点中已有的游戏,那我将设置指针以跳到该节点。原因是我想统计某个游戏已达到多少次,并使其仅从单个节点分支以节省内存。
我可以使用FEN比较游戏,这在这里可以得到最好的描述: https://www.chessprogramming.org/Forsyth-Edwards_Notation
简而言之,它与pgn不同,它仅显示国际象棋游戏的当前位置以及一些特殊细节。因此,即使棋子都在同一位置,一个游戏也可能具有铸造特权,而另一游戏则不能使它成为另一种游戏。
因此,通过一种比较游戏和大型数据集的方法,如何在不重复遍历每个插入节点的每个可能节点的情况下,将树中的重复项合并在一起?
其他详细信息:
我正在用Java编程
https://lichess.org/analysis#explorer:我想模仿Lichess在右下角所做的事情,该状态指出了多少名玩家以获胜/输失/平局比率玩过X棋。我一直未能找到完全依靠自己的代码的指南。