我整个下午一直在研究搜索算法,我想要一些意见。我所做的一些特定于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个条目的表现非常糟糕。
现在,对于我的默认显示,我可以简单地将已排序的数据缓存在内存中,然后显示和滚动效果很好,但对于I类搜索,根本没办法实现用户期望的流畅性能。
任何指针或提示?
答案 0 :(得分:1)
是。忘记文件并将其保存在数据库中。创建索引Everything成为一个简单的SQL语句。