有序數組查找元素優化方案
一般情況下查找元素我們這樣寫:
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
鏈接:https://www.jianshu.com/p/ceed2daebc47