我有一个充满PhRecords的数组。为简单起见,让我们考虑对象的结构如下:
@interface PhRecord : NSObject
@property (nonatomic, strong) NSArray *PhName; //Person's name
@property (nonatomic, strong) NSArray *PhNumbers; //Person will have 2/3 contact numbers
@property (nonatomic, strong) NSArray *PhTypes; //The types of the contact numbers
@end
我班上有一个属性可以通过电话簿收集上面指定格式的数组中的姓名和电话号码。假设数组是以下
@property (nonatomic, strong) NSArray *allContacts;
另外,我有方法使用以下方法将所有联系人作为PhRecords
- (NSArray *)getAllContacts;
我有一种方法,如果我给出联系电话,它会找到联系人的姓名和类型。
//Assume that both string1 and string2 don't have (,),*,#,+ and "<white space>"
- (void)findContactByPhoneNumber:(NSString *)phNum {
NSString *string1 = phNum;
NSArray *contacts = [self getAllContacts];
for(SDPhoneRecord *record in contacts) {
for(int j=0;j<record.PhNumbers.count;j++) {
NSString *string2 = [[record.PhNumbers objectAtIndex:j];
if([string2 rangeOfString:string1].location!=NSNotFound) {
NSLog(@"Name:%@,Type:%@",record.PhName,[record.PhTypes objectAtIndex:j];
}
}
}
}
如您所见,此搜索的时间复杂度为O(n ^ 2)。是否可以进行O(1)查找?如果我必须使用谓词,我怎样才能将它们用于这种要求,其中字符串的“范围”必须与字符串传递的参数进行比较?
答案 0 :(得分:3)
要改善“大O”,你需要消除循环,而不是简单地隐藏它们。这通常意味着使用某种“查看”机制,而不是“查找”机制 - 一种使用例如哈希表来定位项目的机制。 Objective-C中主要的这种机制是NS(Mutable)Dictionary,它在内部包含一个哈希表。
在某些情况下,可以使用数据属性来提高搜索效率,但缺少哈希表通常是最好的(也是最常用的)方法。
答案 1 :(得分:0)
如果电话号码属性等于提供的字符串,请使用NSArray objectsPassingTest
进行测试