Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.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
IOS:Sqlite。快速查找记录_Ios_Objective C_Sql_Xcode_Sqlite - Fatal编程技术网

IOS:Sqlite。快速查找记录

IOS:Sqlite。快速查找记录,ios,objective-c,sql,xcode,sqlite,Ios,Objective C,Sql,Xcode,Sqlite,我正在制作一个拼字游戏,我正在根据单词词典验证单词 在我的第一次尝试中,我将字典加载到一个数组中,并进行了二进制搜索以进行验证 现在我改为使用sqlite,这样我就不必把整个dict都放在内存中,从而减少了加载时间 我面临两个挑战: 查询数据库以查看其中是否有单词的最有效方法是什么 如何找到一组字母的所有可能单词。。。当我把单词词典放在一个数组中时,我可以循环整个过程并验证每个单词。查询每一行(~700000)并使用sqlite进行验证将非常缓慢 “显而易见”的解决方案是建立一个索引。但是,如果

我正在制作一个拼字游戏,我正在根据单词词典验证单词

在我的第一次尝试中,我将字典加载到一个数组中,并进行了二进制搜索以进行验证

现在我改为使用sqlite,这样我就不必把整个dict都放在内存中,从而减少了加载时间

我面临两个挑战:

  • 查询数据库以查看其中是否有单词的最有效方法是什么

  • 如何找到一组字母的所有可能单词。。。当我把单词词典放在一个数组中时,我可以循环整个过程并验证每个单词。查询每一行(~700000)并使用sqlite进行验证将非常缓慢

  • “显而易见”的解决方案是建立一个索引。但是,如果内存中的二进制搜索不起作用,我不确定索引是否能解决这个问题。它将占用大约相同的内存量

    如果您可以搜索可能的匹配项,从外部内存一次获取少量,然后快速进行比较,这不是很好吗

    这在数据库中是可能的。其思想是创建一个“哈希”函数。具有相同哈希值的所有内容都将存储在words表中。然后,它将被提取到内存中进行搜索

    一旦获得具有相同哈希的单词集,您可以自己进行搜索,或者这可能会起作用:

    select word
    from (select word
          from words
          where hash(word) = hash(YOURWORD)
         ) t
    where t.word = YOURWORD
    
    关键是先“欺骗”SQL编译器使用哈希索引,然后再进行比较

    一个非常简单的哈希函数可能是前五个字母。所以,像“间谍”这样的词只有一个条目。但是,像“multi”这样的词会有很多含义。您的单词表将有两列,“单词”和“哈希”。然后,您将有一个关于散列的索引。为了获得最佳性能,请按哈希对单词表进行排序。在单词列表有序的情况下,所有匹配的单词很有可能出现在一个或两个页面上,从而最大限度地减少外部I/O


    不幸的是,SQLite没有任何内置的哈希函数。您可以自己创建一个,方法是将字符串中的字符值成对相加。

    我已经回答了您前面的问题。我不是数据库专家,我对字母算法的工作原理有一些想法

  • 使用DB只是为了加快搜索速度,即减少结果数量,然后在内存中检查DB结果

  • 对于数据库中的每个单词,还将保存一个哈希。该散列将是一个数字或字符串

  • 如果您有一组字母,例如{a,b,b,c,x,t,u,v},您将计算一组可以从这些字母创建的哈希,对于每个可能的哈希,您将向数据库询问所有结果

  • 测试结果是否只包含集合中的字母(我们在前面的问题中已经讨论过)

  • 一些可能的哈希函数:

  • 没有重复的有序元音,例如hash(transformers)=“aeo”。从上面的集合中,您将得到可能的散列“,”a“,”u“,”au“,”ua“。请注意,没有元音的单词很少,因此“”请求不会产生问题

  • 带重复的有序元音,例如hash(request)=“ee”。从集合{w,h,y,a,a,x,e}可以得到散列“,”a“,”e“,”y“,”aa“,”ae“,”ea“,”ey“,”ya“,”ye“,”aae“,”aay“。一般来说,请求越多,结果越少

  • 无重复的有序字母,例如哈希(Transformers)=“aefmnorst”。如果
    N
    是字母数,我们忽略长度小于2的单词,则您最多需要(如果没有字母重复)
    (n3)+(n4)+(n5)+…+(N N)
    ,如果
    N
    是20,那就是几千个请求。。。让我们忽略这个想法吧

  • ASCII字母的位掩码(忽略任何非ASCII字母)。位置0处的位表示单词包含“a”,位置1处包含“b”等。如果我们为字母创建相同的位掩码,我们可以选择诸如
    (字掩码和~letestmask)==0


  • 对于第二个问题,在每个单词中添加第二列,按字母顺序排列字母。然后对可用的分幅进行排序并搜索该列。这将为您提供用于搜索的所有分幅的所有可能单词


    不幸的是,它对某些瓷砖不起作用。为此,您必须一次删除一个平铺,然后重新进行搜索。

    对于整个单词,您应该将每个单词单独列一行,并在其上建立索引。应该很快。然而,找到“所有可能的单词”需要一些实际的编程。谢谢回复。我把所有的单词都排在一行。如何构造查询以获得最佳性能?感谢构建索引并执行查询。应该很简单。问题
    创建索引。。。在…(…)
    上。对于“所有可能的单词”,一种方法是选择所有单词,例如,从分幅中选择与一个组合对应的三个字母前缀,然后旋转返回的部分匹配。可以创建一个单独的三个字母的列(带索引),也可以对原始列使用稍微高级的查询。@user1251004这不是一个真正的答案,只是一些想法。