我试图实现一个字玩游戏使用的微控制器,它只允许30 to的数据。为此,我需要从允许单词的特定字典中查找单词,该字典在未压缩时大小几乎为4MB。
我不需要每次都给出正确的答案,这样我就可以在准确性上妥协。有什么方法可以使在30 of的空间内以最小的精度()安装一个4MB的字典?
我已经尝试过使用优化的‘trie’数据结构(如建议的这里 ),使用压缩的trie生成器这里,它将大小从4MB降到740 KB,但我想不出一种方法使其更小,而又不丢弃大量的单词。
“trie”总是能给我正确的答案。是否有一种的方法,通过与精确的交换来缩小尺寸,并制定出一种结构,在大多数情况下可能给我正确的答案?也许我可以用一个机器学习模型或者其他与之相关的东西?
我知道这几乎是不可能的。但是游戏的设计并不需要精确的答案。即使是25%的准确度也是合理的。
在字典符合那么大的尺寸之前,我可以省略最长的单词。但在这种情况下,这可能不是最好的方法。
发布于 2016-05-03 20:47:05
不幸的是,我必须同意这里出现的协商一致意见。我已经编写了一些类似的软件(一个拼字游戏机器人),所以我引用了我的代码并进行了一些计算。我使用SOWPODS字典,它实际上比您所描述的要小得多-- 267,751个单词,未压缩的占2707014字节。
使用trie数据结构对于实现AI来玩像拼字游戏这样的游戏至关重要,这不仅是因为它减少了内存中字典的大小,还因为它的基本结构大大降低了搜索功能的计算复杂度。当你尝试可能的排列,你可以立即停止,一旦你击中一片叶子在trie。我之所以提到这一点,是因为如果您试图为此使用Arduino,您将不可避免地需要确保代码在速度方面非常高效。
但是,为了使用trie来确保合理的性能,这也意味着您需要在节点之间建立连接,在32位架构上进行简单的实现,这些链接将占用每个节点4个字节。您可能会实现更高级的逻辑,以减少节点存储偏移量,每个偏移量为2个字节(2^15用来指向内存中的偏移量,并将额外的位作为该节点是否代表一个单词的指示)。但即使如此,这也意味着您需要trie来拥有15K节点(实际上,因为这是合理的,所以您也需要一些代码。:)
我试着限制单词的最大大小,看看有什么必要使节点数量下降到足够远……坏消息是,你只能存储4个字符的长度!以下是每个最大大小的节点数:
15: 589315
14: 572754
13: 546969
12: 508959
11: 456252
10: 387321
9: 304186
8: 212237
7: 126700
6: 63605
5: 25776
4: 8208
因此,从根本上说,当你减少字典的大小时,使用更复杂的算法就不再有价值了。只是没有足够的内存让它正常工作。
为了响应使用机器学习模型的想法,我的经验是,构建一个能够达到某种合理精度的功能模型通常需要相当大的内存,而获得合理的性能需要中等功能的硬件,即使只有执行预测。(培训非常昂贵,但你可以离线完成。)
甚至从磁盘中读取数据库也是不可能的,这取决于所需的效率。缓存只能将您带到目前为止。
老实说,我认为@TypeKatz的建议是最合理的。Arduino并不是为这类应用程序设计的,所以最好的方法是将计算成本高、内存密集型的处理卸载到外部设备上。您可以在串口上使用附加设备,或者投资于Wifi sheild,并与附近的服务器进行通信。
不管怎样,祝你好运!
发布于 2016-05-03 18:31:50
在一个30 4MB的空间中安装一个4MB的字典,以最小的准确性损失?
字典文件很可能是每行一个单词的格式,对吗?这是一种非常有效的存储单词列表的方法。
所以我想说,不,4MB的数据永远不会,永远不适合在30 So的空间内。没有压缩,没有有效存储,现在没有,永远没有。
想想看: 4MB实际上是你30 of限制大小的100倍以上。显然,您必须在磁盘上遍历字典,也许还需要缓存结果。
https://stackoverflow.com/questions/37011529
复制相似问题