ios-數組查找元素優化方案


有序數組查找元素優化方案

一般情況下查找元素我們這樣寫:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM