Algorithm 在树中组合重复项

Algorithm 在树中组合重复项,algorithm,data-structures,duplicates,Algorithm,Data Structures,Duplicates,我的问题与: 我想储存一大套国际象棋PGN,以避免像凯姆切这样的重复 引用Kempchee的话:“我有大量的国际象棋游戏(大约500万)存储在几个pgn文件中(便携式游戏符号)。如果您不熟悉PGN,解析后的结果基本上是一个csv文件,其中几个字段包含有关玩家、位置等的信息,然后是一个较大的文本字段,其中的移动由一些delimeter分隔,可能是一个空格。每个游戏将有一行包含此类数据。” 但对于我来说,我使用以下树结构作为我的数据结构: 问题是,国际象棋游戏可以通过不同的移动顺序转换到同一个游

我的问题与:

我想储存一大套国际象棋PGN,以避免像凯姆切这样的重复

引用Kempchee的话:“我有大量的国际象棋游戏(大约500万)存储在几个pgn文件中(便携式游戏符号)。如果您不熟悉PGN,解析后的结果基本上是一个csv文件,其中几个字段包含有关玩家、位置等的信息,然后是一个较大的文本字段,其中的移动由一些delimeter分隔,可能是一个空格。每个游戏将有一行包含此类数据。”

但对于我来说,我使用以下树结构作为我的数据结构:

问题是,国际象棋游戏可以通过不同的移动顺序转换到同一个游戏中。我设想,如果另一个树分支转换成另一个节点中预先存在的游戏,我将设置指针以跳转到该节点。原因是,我想要一个计数器,计算某个游戏被访问的次数,并让它仅从单个节点分支以节省内存

我可以比较使用FEN的游戏,这在这里描述得最好:

简而言之,它不同于pgn,因为它只显示国际象棋游戏的当前位置以及一些特殊细节。因此,即使这些棋子都在同一个地方,一个游戏可能有铸造特权,而另一个游戏不能使它成为不同的游戏

因此,通过一种比较游戏和大型数据集的方法,我如何在不遍历每个可能节点的情况下组合树中的重复项

额外详细信息:

我正在用Java编程


:我想模仿Lichess在右下角所做的,在那里,它说明了有多少玩家玩了具有赢/输/平比例的move X。我一直未能找到完全依赖自己代码的指南

您可以将FEN字符串保存在哈希表(map)中。查找将有(接近)O(1)。不过需要注意的是:一个游戏可能会合并到另一个游戏中,然后再次出现分歧。通常情况下,在棋盘状态和生成的Zobrist散列中会包含Casting和en passant状态。是的,wildplasser在FEN中也给出了这些细节。吉姆,我也想过,但是我遇到了一个问题,在所有的比赛中我的内存都用完了。我可能只会减少我使用的游戏数量。你可以将FEN字符串保存在哈希表(map)中。查找将有(接近)O(1)。不过需要注意的是:一个游戏可能会合并到另一个游戏中,然后再次出现分歧。通常情况下,在棋盘状态和生成的Zobrist散列中会包含Casting和en passant状态。是的,wildplasser在FEN中也给出了这些细节。吉姆,我也想过,但是我遇到了一个问题,在所有的比赛中我的内存都用完了。我可能会减少游戏的使用量。