如何有效过滤大型NSArray?

时间:2012-06-21 14:28:54

标签: cocoa-touch nsarray nspredicate nssortdescriptor

我在iPhone上过滤大量NSArray(19k项)进行交互式自动完成时出现性能问题。

目前,只要用户在搜索框中键入字母,我就会在单独的线程中使用NSPredicate开始过滤数组并显示结果。当然,在用户选中第二个键之前,iPhone的数据集很大,所以不会显示任何预览,直到用户停止键入一两秒钟。

[计算机科学Babble,你可以安全地跳过这部分]我想,框架正在做的是将NSPredicate应用于数组中的每个项目,因此需要O(n),其中n是数字数组项。但是,应该可以使用更有效的方法在O(log(n))中更多地解决问题。即在O(n * log(n))中对列表进行一次排序(这可以在开发时完成),查找需要在该列表中插入搜索字符串的位置O(log(n))并从那里开始迭代直到某个项目不以搜索字符串O(m)开头。得到有效的O(log(n)+ m),m <&lt;&lt; n算法。 DAWG会更好,但我不记得在工具包中看到过类似的东西。 [/ Computer Science Babble]

我想知道,如果有一个内置的方法让数组知道,它是按照过滤器测试的相同字段排序的,因此过滤器可以有效地应用于该排序的数组。

解决方案

我使用字典创建了一个非常简单的搜索索引,该字典将单个字符映射到其键以该字符开头的项目数组。至少在我的用例中,这足以实现实时显示自动完成。

1 个答案:

答案 0 :(得分:2)

如果数据以某种方式排序,那么我建议将数组分成多个较小的数组。所以你可能有A-G,H-M,N-Z阵列。

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

另一个建议是创建一个trie,它会让一切变得更好。虽然他们需要做一些工作:

http://en.wikipedia.org/wiki/Trie