【问题标题】:Search array of NSObjects containing Arrays搜索包含数组的 NSObjects 数组
【发布时间】:2014-01-13 10:44:04
【问题描述】:

我有一个充满 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) 查找?如果我必须使用谓词,我该如何使用它们来满足这种要求,其中字符串的“范围”必须与字符串传递的参数进行比较?

【问题讨论】:

  • 有可能接近 O(n)。您需要做的就是为您的 PhNumbers 对象使用 NSDictionary 或其他有效搜索的对象。
  • 好的,我会相应地修改数据结构。非常感谢您的建议!

标签: objective-c arrays search


【解决方案1】:

要改进“大 O”,您需要消除循环,而不是简单地隐藏它们。这通常意味着使用某种“查看”机制,而不是“查找”机制——一种使用例如哈希表来定位项目的机制。 Objective-C 中主要的此类机制是 NS(Mutable)Dictionary,其内部包含一个哈希表。

在某些情况下,可以利用数据的属性来提高搜索效率,但哈希表通常是最好的(也是最通用的)方法。

【讨论】:

    【解决方案2】:

    使用 NSArray objectsPassingTest 测试电话号码属性是否等于提供的字符串

    【讨论】:

    • 平等不能是关系。例如,我可能提供 1234567,但联系人可能提供 001-1234567。我可以使用 objectsPassingTest 检查范围吗?
    • 使用 objectsPassingTest 等不会改进算法的“大 O”,只是隐藏其中的一部分(通常比直接循环效率稍低)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多