3

我在过滤大型NSArray(19k 个项目)以在 iPhone 上进行交互式自动完成时遇到性能问题。

目前,每当用户在搜索框中键入一个字母时,我都会NSPredicate在一个单独的线程中开始使用 an 过滤数组并显示结果。当然,数据集对于 iPhone 来说太大了,要在用户点击第二个键之前完成过滤,所以不会显示预览,直到用户停止输入一两秒。

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

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

解决方案

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

4

1 回答 1

2

如果数据以某种方式排序,那么我建议将数组分成多个较小的数组。所以你可能有 AG、HM、NZ 阵列。

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

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

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

于 2012-06-21T14:41:33.670 回答