Cocoa touch 如何有效地过滤大型NSArray?

Cocoa touch 如何有效地过滤大型NSArray?,cocoa-touch,nsarray,nspredicate,nssortdescriptor,Cocoa Touch,Nsarray,Nspredicate,Nssortdescriptor,在iPhone上过滤大型NSArray(19k项)以实现交互式自动完成时,我遇到了性能问题 目前,每当用户在搜索框中键入字母时,我都会在单独的线程中使用NSPredicate对数组进行过滤,并显示结果。当然,数据集太大,iPhone无法在用户按下第二个键之前完成过滤,因此在用户停止输入一两秒钟之前,不会显示预览 [Computer Science Babble,您可以安全地跳过这一部分]我想,框架正在做的是将NSPredicate应用于数组中的每个项,因此需要O(n),其中n是数组项的数量。但是

在iPhone上过滤大型
NSArray
(19k项)以实现交互式自动完成时,我遇到了性能问题

目前,每当用户在搜索框中键入字母时,我都会在单独的线程中使用
NSPredicate
对数组进行过滤,并显示结果。当然,数据集太大,iPhone无法在用户按下第二个键之前完成过滤,因此在用户停止输入一两秒钟之前,不会显示预览


[Computer Science Babble,您可以安全地跳过这一部分]我想,框架正在做的是将NSPredicate应用于数组中的每个项,因此需要O(n),其中n是数组项的数量。但是,应该可以使用更有效的方法在O(log(n))中解决问题。也就是说,在O(n*log(n))中对列表进行一次排序(这可以在开发时完成),查找需要在该列表O(log(n))中插入搜索字符串的位置,并从那里开始迭代,直到某个项不以搜索字符串O(m)开头。如果以某种方式对数据进行排序,那么我建议将数组分成多个较小的数组。所以你可能有A-G,H-M,N-Z数组

或者将所有内容填充到核心数据或SQLite数据库中,并使用查询来帮助加快速度。在处理如此大的数据集时,索引数据库选择将比尝试在内存中过滤数据更有效

另一个建议是创建一个trie,这将使一切变得更好。尽管要创建它们需要一些工作:


关于阵列的一篇很好的阅读在我想看看wise stackoverflow社区能想出什么之前,我正计划实施拆分。感谢SQLite的提示,这可能真的很好。