Java 以低内存占用存储大型词典的方法+;快速查找(在Android上)
我正在开发一个android文字游戏应用程序,它需要一个大的(约250000字的字典)可用。我需要:Java 以低内存占用存储大型词典的方法+;快速查找(在Android上),java,android,algorithm,data-structures,complexity-theory,Java,Android,Algorithm,Data Structures,Complexity Theory,我正在开发一个android文字游戏应用程序,它需要一个大的(约250000字的字典)可用。我需要: 合理快速的查找(例如,最好是恒定时间),有时需要每秒查找200次以解决字谜,可能需要在0.2秒内更频繁地查找20次以检查用户刚刚拼写的单词 编辑:查找通常会询问“是否在词典中?”。我也希望在单词中支持最多两个通配符,但这非常简单,只需生成通配符可能包含的所有字母并检查生成的单词(即26*26查找一个包含两个通配符的单词) 因为它是一款移动应用程序,所以使用尽可能少的内存,只需要少量的初始下
- 合理快速的查找(例如,最好是恒定时间),有时需要每秒查找200次以解决字谜,可能需要在0.2秒内更频繁地查找20次以检查用户刚刚拼写的单词
- 因为它是一款移动应用程序,所以使用尽可能少的内存,只需要少量的初始下载就可以下载字典数据,这是最重要的
什么是做我需要的事情的好方法?你会想要某种类型的。我想也许a会很好。它们提供了非常快速的查找和较低的内存使用率。提供有关TST的更多信息。它还讨论了排序,因此并非所有内容都适用。可能更适用一些。正如文章所说,TSTs 结合数字化的时间效率 试与空间效率 二叉搜索树
如表所示,查找时间与使用哈希表非常相似。我假设您希望检查给定单词是否属于字典 看一看 bloom过滤器可以执行“X是否属于预定义集”类型的查询,并且存储需求非常小。如果对查询的回答是肯定的,那么出错的概率很小(并且可以调整);如果对查询的回答是否定的,那么保证答案是正确的 根据维基百科的文章,你可能需要少于4MB的空间来存储250000个单词的字典,错误概率为1%
如果单词实际包含在字典中,bloom过滤器将正确回答“在字典中”。如果字典中没有这个词,布鲁姆过滤器可能会以很小的概率错误地给出“在字典中”的答案。你也可以用更低级的方法实现你的目标。。。如果这是一个文字游戏,那么我怀疑你正在处理27个字母。因此,假设一个字母表不超过32个字母,即每个字母5位。通过使用5位/字母的普通编码,您可以将12个字母(12 x 5=60位)塞进一个Java长度 这意味着,实际上,如果单词长度不超过12个字母/单词,则可以将字典表示为一组Java长字符。如果您有250000个单词,那么这个集合的一个简单表示就是一个单独的、经过排序的long数组,它应该需要250000个单词x 8个字节/word=2000000~2MB内存。然后通过二进制搜索进行查找,考虑到数据集的小规模,这种搜索应该非常快(不到20次比较,因为2^20会将您带到100万以上) 如果单词的长度超过12个字母,那么I将把>12个字母的单词存储在另一个数组中,其中1个单词将以明显的方式由2个串联的Java长字符表示
注意:之所以这样做有效,而且可能比trie更节省空间,而且至少实现起来非常简单,是因为字典是常量。。。如果需要修改数据集,搜索树是好的,但是如果数据集是常数,则可以使用简单的二进制搜索方式运行。
也可以使用C和C++中的结构,而
< P>一种非常有效的存储目录的方法是(DWWG)。 以下是一些链接:- 源代码描述