Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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#_.net_Algorithm - Fatal编程技术网

C# 存储大前缀树的最佳方法

C# 存储大前缀树的最佳方法,c#,.net,algorithm,C#,.net,Algorithm,我要写的程序,将代表人工智能玩棋盘游戏对玩家。我想把所有玩过的游戏都保存在前缀树中,以便搜索类似的游戏。但我担心这棵树会变得太大而无法保存在记忆中。那么什么是最好的存储方式呢。并且能够快速搜索它。我不认为将其写入文件是一个好的解决方案。可能是在DB的某个国王?< /P> < P>你所要寻找的是一个嵌入式数据库,其中大部分都是用C++编写的,但也有一些有C包装。我推荐(这是一种包装) 我建议您为每个前缀树生成一个唯一的散列,其中生成的散列具有正确表示相似前缀树的位置:换句话说,两个相似前缀树的散列

我要写的程序,将代表人工智能玩棋盘游戏对玩家。我想把所有玩过的游戏都保存在前缀树中,以便搜索类似的游戏。但我担心这棵树会变得太大而无法保存在记忆中。那么什么是最好的存储方式呢。并且能够快速搜索它。我不认为将其写入文件是一个好的解决方案。可能是在DB的某个国王?< /P> < P>你所要寻找的是一个嵌入式数据库,其中大部分都是用C++编写的,但也有一些有C包装。我推荐(这是一种包装)

我建议您为每个前缀树生成一个唯一的散列,其中生成的散列具有正确表示相似前缀树的位置:换句话说,两个相似前缀树的散列应该彼此非常接近。你所指的游戏被称为Tic-Tac-Toe,因此散列类似的Tic-Tac-Toe游戏应该很容易,这里有一些参考资料(我没有真正阅读它们,我只是快速搜索了“散列Tic-Tac-Toe”,这些是结果):

然后散列存储在Berkeley DB中,前缀树存储在aux文件中,或者如果需要,也可以将其存储在值中。由于Berkeley DB存储键值对,因此可以将哈希设置为键,并将值设置为任何值(即前缀树或包含前缀树的aux文件的路径)。然后,您所要做的就是查找类似的哈希并从aux文件中检索相应的树


Berkeley DB按顺序存储相似的键,因此您可以依赖这样一个事实,即它不会移动键并破坏哈希的局部性。由于本地性不会被破坏,您可以进行额外的优化,检索一大页的键值对,并减少在磁盘上进行的查找和查找的次数

我有多大?目前内存限制在500gb左右。根据游戏的不同,可能没有解决方案,除非不存储所有变体。例如,国际象棋有太多的字段组合,所以最后你必须编程,而不是使用查找表。英语不是我的母语,我不知道英语中的游戏名称直接翻译为海洋象棋。但我的目标是50x50甚至更大的板子的更难的版本。你用的是什么样的树?如果您使用的是Trie(您使用的“前缀树”似乎暗示了类似的东西),即使在很多游戏中,它也会保持非常小的大小,因为常用前缀只存储一次。如果您仍然没有足够的空间,请查看DAWG(有向无环单词图),它将序列中更常见的部分存储在一起。@IordanTanev:那么非英语名称是什么?此外,正如人们所说,变异树往往呈指数增长,因此,如果要增加电路板大小,无论如何都会耗尽内存。