IOS:Sqlite。快速查找记录
我正在制作一个拼字游戏,我正在根据单词词典验证单词 在我的第一次尝试中,我将字典加载到一个数组中,并进行了二进制搜索以进行验证 现在我改为使用sqlite,这样我就不必把整个dict都放在内存中,从而减少了加载时间 我面临两个挑战:IOS:Sqlite。快速查找记录,ios,objective-c,sql,xcode,sqlite,Ios,Objective C,Sql,Xcode,Sqlite,我正在制作一个拼字游戏,我正在根据单词词典验证单词 在我的第一次尝试中,我将字典加载到一个数组中,并进行了二进制搜索以进行验证 现在我改为使用sqlite,这样我就不必把整个dict都放在内存中,从而减少了加载时间 我面临两个挑战: 查询数据库以查看其中是否有单词的最有效方法是什么 如何找到一组字母的所有可能单词。。。当我把单词词典放在一个数组中时,我可以循环整个过程并验证每个单词。查询每一行(~700000)并使用sqlite进行验证将非常缓慢 “显而易见”的解决方案是建立一个索引。但是,如果
select word
from (select word
from words
where hash(word) = hash(YOURWORD)
) t
where t.word = YOURWORD
关键是先“欺骗”SQL编译器使用哈希索引,然后再进行比较
一个非常简单的哈希函数可能是前五个字母。所以,像“间谍”这样的词只有一个条目。但是,像“multi”这样的词会有很多含义。您的单词表将有两列,“单词”和“哈希”。然后,您将有一个关于散列的索引。为了获得最佳性能,请按哈希对单词表进行排序。在单词列表有序的情况下,所有匹配的单词很有可能出现在一个或两个页面上,从而最大限度地减少外部I/O
不幸的是,SQLite没有任何内置的哈希函数。您可以自己创建一个,方法是将字符串中的字符值成对相加。我已经回答了您前面的问题。我不是数据库专家,我对字母算法的工作原理有一些想法
N
是字母数,我们忽略长度小于2的单词,则您最多需要(如果没有字母重复)(n3)+(n4)+(n5)+…+(N N)
,如果N
是20,那就是几千个请求。。。让我们忽略这个想法吧(字掩码和~letestmask)==0
对于第二个问题,在每个单词中添加第二列,按字母顺序排列字母。然后对可用的分幅进行排序并搜索该列。这将为您提供用于搜索的所有分幅的所有可能单词
不幸的是,它对某些瓷砖不起作用。为此,您必须一次删除一个平铺,然后重新进行搜索。对于整个单词,您应该将每个单词单独列一行,并在其上建立索引。应该很快。然而,找到“所有可能的单词”需要一些实际的编程。谢谢回复。我把所有的单词都排在一行。如何构造查询以获得最佳性能?感谢构建索引并执行查询。应该很简单。问题
创建索引。。。在…(…)
上。对于“所有可能的单词”,一种方法是选择所有单词,例如,从分幅中选择与一个组合对应的三个字母前缀,然后旋转返回的部分匹配。可以创建一个单独的三个字母的列(带索引),也可以对原始列使用稍微高级的查询。@user1251004这不是一个真正的答案,只是一些想法。