2012-06-21 48 views
3

我在与过滤大NSArray(19K项目)在iPhone上的交互式自动完成一个性能问题。如何高效过滤大型NSArray?

目前,每当用户键入一个字母到搜索框中,我开始过滤在单独的线程使用NSPredicate阵列和显示结果。当然,数据集对iPhone来说很重要,因为用户在第二个按键后才能完成过滤,因此不会显示任何预览,直到用户停止输入一两秒。我猜,框架正在做的是将NSPredicate应用到数组中的每个项目,因此需要O(n),其中n是数字数组项。但是,应该可以使用更有效的方法在O(log(n))中更多地解决问题。即排序列表一旦O(N *的log(n))(这可以在开发时进行),查找其中一个需要插入该列表中澳搜索字符串(的log(n)),并从那里开始迭代直到一个项目不以搜索字符串O(m)开始。导致高效O(的log(n)+ M),具有m < <Ñ算法。 DAWG会更好,但我不记得在工具包中看到类似的东西。 [/计算机科学Bab]]

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

解决方案

我使用单个字符映射到项目,其关键与字符开头的数组的字典创建了一个非常简单的搜索索引。至少在我的使用情况下,这是足够的优化,以实现实时显示自动完成。

+0

一个很好的阅读有关阵列http://ridiculousfish.com/blog/posts/array.html – vikingosegundo

+0

有趣的阅读。谢谢。 – Chris

回答

2

如果数据被以某种方式来分类,然后我建议打破阵列分成多个较小的阵列。所以你可能有A-G,H-M,N-Z阵列。

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

另一个建议是建立一个线索,这将让一切更好。虽然他们是一些工作创造:

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

+0

分手是我计划实施之前,我想看看明智的stackoverflow社区可以提出什么。不过谢谢SQLite技巧,这可能非常简洁。 – Chris