我在与过滤大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]]
我想知道,如果有一个内置的方式让数组知道,它是由过滤器正在测试的相同字段排序,因此过滤器可能是有效地应用于该排序的数组。
解决方案
我使用单个字符映射到项目,其关键与字符开头的数组的字典创建了一个非常简单的搜索索引。至少在我的使用情况下,这是足够的优化,以实现实时显示自动完成。
一个很好的阅读有关阵列http://ridiculousfish.com/blog/posts/array.html – vikingosegundo
有趣的阅读。谢谢。 – Chris