Iphone 在Objective-C中搜索字符串的最快方法是什么?

Iphone 在Objective-C中搜索字符串的最快方法是什么?,iphone,objective-c,ios,Iphone,Objective C,Ios,我正在为iOS应用程序实现一种自动完成功能。我用于自动完成值的数据是一个逗号分隔的文本文件,包含大约100000个字符串。这就是我现在正在做的: 读取文本文件,并使用100000NSString创建一个NSArray 当用户键入时,执行[数组包含对象:文本] 当然,有更好/更快的方法来进行此查找。有什么想法吗?当然有!但它不是“在Objective-C中”:很可能,您需要自己编写代码 其思想是将字符串列表转换为一种数据结构,这种数据结构可以让您非常快速地按前缀进行搜索。在后缀树中搜索可能的补全非

我正在为iOS应用程序实现一种自动完成功能。我用于自动完成值的数据是一个逗号分隔的文本文件,包含大约100000个字符串。这就是我现在正在做的:

  • 读取文本文件,并使用100000
    NSString
    创建一个
    NSArray
  • 当用户键入时,执行
    [数组包含对象:文本]

  • 当然,有更好/更快的方法来进行此查找。有什么想法吗?

    当然有!但它不是“在Objective-C中”:很可能,您需要自己编写代码

    其思想是将字符串列表转换为一种数据结构,这种数据结构可以让您非常快速地按前缀进行搜索。在后缀树中搜索可能的补全非常快,但结构本身并不容易构建。在互联网上快速搜索发现,在Objective C中没有现成的实现,但如果时间不紧迫,您可以自己编写,甚至可以自己编写


    也许更简单的方法是按字母顺序对字符串排序,并对迄今为止输入的前缀进行二进制搜索。虽然没有后缀树那么有效,但排序数组方法对于100K字符串是可以接受的,因为在17次检查中,您就找到了正确的位置。

    最简单的可能是二进制搜索。请参见
    -[NSArray indexOfObject:inSortedRange:options:usingComparator:][/code>

    特别是,我会尝试这样的方法:

    • 对保存到文件中的数组进行预排序
    • 加载数组时,可能需要
      @选择器(比较:)
      (如果您担心数组意外未排序或某些边缘情况下Unicode排序顺序发生变化)。假设数组已大致排序,则该值应约为O(n)
    • 要查找第一个潜在匹配项,
      [array indexOfObject:searchString InStoredRange:[NSRange){0,[array count]}选项:NSBinarySearchingInsertionIndex | NSBinarySearchingFirstEqual Using Comparator:@selector(compare:)]
    • 遍历数组,直到条目不再包含searchString作为前缀。您可能需要进行大小写/区分字符/不区分全半角的比较,以确定它是否是前缀(NSAnchoredSearch | NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch | NSWidthInsensitiveSearch)

    这可能无法“正确”处理所有区域设置(特别是土耳其语),但将
    比较:
    替换为
    本地化比较:
    ,也不会进行天真的字符串折叠。(它只有9行长,但需要大约一天的工作时间才能恢复正常,大约有40行代码和200行测试,所以我可能不应该在这里分享。)

    你可以尝试跳过甚至与第一个字母不匹配的字符串,如果你的单词是zebra,那么从苹果到酸奶搜索没有意义。我不确定实现这个的最佳方法,也许是多维数组?第一维可以是第一个字母,第二维可以是第二个字母,等等,直到第三个或第四个字母,然后你可以只包含单词的其余部分。如果你不需要排序,我认为在检查集合是否包含对象时,集合会更快。但它仍然没有针对字符串进行优化。您可能应该研究诸如二叉树之类的东西。如果您需要定制代码,那么无论您使用的是什么平台/语言,通用方法都是类似的。总有一种更快的方法。不过,您是否在UI中看到了滞后?我对autocomplete做了完全相同的事情(使用较小的输入数组),并且没有明显的延迟,尽管使用了简单的搜索算法。+1用于指出Objective-C是C,当查看性能密集型任务时,您不必害怕降到C:)我还将支持二叉树,这可能是最容易实现的。NDTrie()和PJTernarySearchTree()在Objective-C中正是如此!经过一些测试,PJTernarySearchTree比NDTrie更快、内存效率更高,但这可能只是基于间接数据集特征的轶事证据。:)