通过NSArray进行搜索的有效方法是什么

时间:2016-02-07 12:11:20

标签: ios objective-c binary-tree binary-search-tree prefix-tree

我的数组中有NSStrings:

i[0] = axxx
i[1] = axyz
i[2] = axxy
i[3] = abcd

我想传递一个搜索字符串来查找所有需要的字符串。例如,如果我传递“ax”然后它将返回3个字符串,如果我传递“axx”然后它将返回2个字符串。

此处的表现至关重要。该方法应如下所示:

- (NSArray *)searchString:(NSString *)search; 

Noramlly我使用NSPredicate,但这次我需要使用Prefix Tree或Binary Tree,我不确定但它应该更快。任何建议或实施链接。

3 个答案:

答案 0 :(得分:3)

希望这个解决方案能满足你。

- (NSArray *)searchString:(NSString *)search{

    NSIndexSet *indexes = [dataArray indexesOfObjectsPassingTest:
                           ^BOOL (id obj, NSUInteger i, BOOL *stop) {
                               NSString *myObj = obj;
                               return [myObj containsString:search];
                           }];
    NSArray *results = [dataArray objectsAtIndexes:indexes];

    return results;

}

答案 1 :(得分:0)

这是一个相当简单的问题。

正如Avi在评论中所建议的那样,它有两个部分:用于匹配的方法,以及用于搜索这些匹配的方法。

如果您的阵列已排序并且您正在寻找单个完美匹配,则可以使用二进制搜索。我相信这会给你O(log(n))的表现。 (时间随着元素数量的对数而增加。)

然而,你并不是在寻找一个完美的匹配。你正在寻找部分匹配。如果它们始终必须匹配字符串的开头,那么您仍然可以使用二进制搜索来查找第一个匹配项,然后在数组中上下线性搜索,直到第一个不匹配为止。这会比O(log(n))性能略差,但不如O(n)差。

如果您在条目中的任何位置匹配您的子字符串,我认为您将不得不测试数组中的每个元素。您只需测试每个元素,即可获得O(n)性能。

注意,O(n)性能通常被认为是好的。它适用于大型数据集。 (你想要避免O(n ^ 2)表现。这就是杀死你的原因。)

问题的第二部分是匹配速度。通过编写自己的字符串匹配例程,您可以获得比谓词略好的性能,该例程是针对您的完全匹配条件进行硬编码的,但性能提升可能是适度的。您必须提供有关匹配内容的更多详细信息,以便我们帮助完成此部分。

答案 2 :(得分:0)

缺少基本信息。如果你寻找“axx”,你期望“haxx”出现在你的结果中吗? “HaXX”? “Axxyyyz”? “AXX”?你有几根弦? 10? 100? 1000? 100000?你多久进行一次搜索?阵列多久更换一次?

第一步是确定哪个NSString方法将匹配您想要匹配的字符串。第二步是使用强力和测量(谓词通常比循环数组慢几倍)。第三步是弄清楚数据排序是否有帮助。