【问题标题】:How to filter a large NSArray efficiently?如何有效地过滤大型 NSArray?
【发布时间】:2012-06-23 19:42:04
【问题描述】:

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

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

[Computer Science Babble,你可以放心地跳过这部分]我猜,框架正在做的是将 NSPredicate 应用于数组中的每一项,因此需要 O(n),其中 n 是数组项。但是,应该可以使用更有效的方法在 O(log(n)) 中更多地解决问题。 IE。在 O(n*log(n)) 中对列表进行一次排序(这可以在开发时完成),查找需要在该列表中插入搜索字符串的位置 O(log(n)) 并从那里开始迭代直到一个项目不以搜索字符串 O(m) 开头。产生一个有效的 O(log(n) + m),其中 m

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

解决方案

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

【问题讨论】:

标签: cocoa-touch nsarray nspredicate nssortdescriptor


【解决方案1】:

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

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

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

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

【讨论】:

  • 分手是我计划实施的,然后我才想看看聪明的 stackoverflow 社区能想出什么。虽然感谢 SQLite 提示,这可能真的很整洁。
猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2016-01-29
  • 1970-01-01
  • 2020-10-25
相关资源
最近更新 更多