有序数组查找元素优化方案
一般情况下查找元素我们这样写:
NSArray *arr = @[@1,@2,@3,@4,@5]; for (NSInteger i = 0; i < arr.count; i++) { if ([arr[i] integerValue] == 2) { NSLog(@"for 找到了"); } }
改进后:
- (BOOL)search:(NSNumber *)key array:(NSMutableArray *)arr{ if (arr.count <= 0) { return NO; } NSInteger i = arr.count - 1; NSNumber *firstObj = (NSNumber *)arr[0]; if ([firstObj integerValue] == [key integerValue]) { return 0; } NSLock * lock = [[NSLock alloc]init]; [lock lock]; arr[0] = key; //同上面for循环相比,i < arr.count的判断,在处理大批量数据时候,对性能提升比较大 while ([arr[i] integerValue] != [key integerValue]) {//该句代码和上面for循环中的if判断等价====== i--;//该句代码和上面的i+等价====== } arr[0] = firstObj; [lock unlock]; if (i == 0) { return NO; }else{ return YES; } }
仔细观察上述两段代码,同样是在有序数组中查找目标为 2 的元素,第一段代码是常规迭代处理,第二段代码是将要查找的元素设置为哨兵。同第一段代码相比第二种方式少了 i < arr.count 的判断,在小批量有序数组查询中对效率的提升并无明显影响,但是在处理大批量数据时候,对性能提升还是比较明显的。
多层for嵌套处理:
实际开发中应尽量避免使用双层 for 循环,客户端数据量比较小可能实际开发中并不是很注意这些。但是后端开发过程中,数据量比较大, 为了提升性能,有些公司后端开发中可能会直接规定避免使用多层 for 循环嵌套的形式。一般第二层或更深层的 for 循环可以使用字典替换。双层 for 循环嵌套的时间复杂度是 n 的二次方。但如果内部 for 循环用字典代替时间复杂度为 O(2n)( 实际是 O(n))。如: 两个数组中有且只有一个相同元素,寻找该元素。其中一个数组就可以先用字典做保存,遍历第一个数组的时候, 同字典中的数据做比较即可。
NSArray *arr1 = @[@1,@2,@3,@4,@5]; NSArray *arr2 =@[@5,@6,@7,@8]; NSMutableDictionary *dict = [NSMutableDictionary dictionary]; for (NSInteger i = 0; i < arr2.count; i++) { [dict setObject:arr2[i] forKey:[NSString stringWithFormat:@"%ld",i]]; } for (NSInteger i= 0 ; i < arr1.count; i++) { NSNumber *number = [dict objectForKey:[NSString stringWithFormat:@"%ld",i]]; if ([arr1[i] integerValue] == [number integerValue]) { NSLog(@"相同的数据为:%@",number); break; } }
作者:ZhengYaWei