4
我一直在研究搜索算法整个下午,我想一些意见。我正在做的一些特定的iOS,但一般的概念不是。我想显示一组数据,一个目录。在目录中我有部门和人员。我知道这听起来像是一本教科书的例子,听我说。我保证,这不是功课。 (我可以提供我正在工作的屏幕截图。)快速搜索和排序
我有一个条目数组,其中有两种目录条目。我需要按名称对条目进行排序,然后将数组拆分为更小的数组,其中每个子数组包含以相同字母开头的条目。
此外,我需要考虑用户可能输入的搜索字符串。
我一般的过程是这样的:
过滤所有,如果有一个匹配的类型和搜索字符串的条目。对于此步骤,我使用NSPredicate:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == %i AND searchableContents B[cd] %@", type, searchString]; if (!searchString || searchString.length == 0) { predicate = [NSPredicate predicateWithFormat:@"type == %i", type]; } NSArray *array = [_directoryContents filteredArrayUsingPredicate:predicate];
按字母顺序排序结果。
array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [((BRKDirectoryEntry *)obj1).comperableTitle compare:((BRKDirectoryEntry *)obj2).comperableTitle]; }];
将结果分解为更小的数组。对于表演,如果我们搜索,我会跳过这一步,但它似乎没有帮助。
if(alphabetized) { array = [self _alphabetizedArrayFromPresortedArray:array]; }
的本上共有950项的性能是深不可测的。
现在,对于我的默认显示,我可以简单地将已排序的数据缓存在内存中,然后显示和滚动执行得很好,但对于search-as-I类型,根本无法实现平滑用户期望的性能。
任何指针或提示?
我仍然对有多少人问“我正在做XYZ,它太慢了,我怎么能让它更快?好像其他人的猜测有很大的机会。有一种瑞士军刀不能输的方法。 [*让程序本身告诉你答案。*](http://stackoverflow.com/a/378024/23771)这里是一个[*简短的例子*](http://stackoverflow.com/a/4299378/23771 )(在Python中,但你会明白)。 – 2014-08-29 00:21:27
只是一个小提示:使用谓词比快速枚举慢得多,如下所示:https://www.objc.io/issues/7-foundation/collections/(部分**枚举和高阶消息传递**) ,我想你可以简化这行代码 如果(!搜索字符串|| searchString.length == 0) 到 如果(!searchString.length) – Duc 2015-12-19 00:26:41