• 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

  • 相关阅读:
    机器学习分类
    12.python中高阶函数以及内建函数(map,filter,sorted),和闭包
    python中的异常处理相关语句和迭代器
    和好朋友渐行渐远是什么感觉?
    MDX学习笔记(整理) MDX语法
    Cognos软件介绍文档(原创)
    隐藏
    android::Mutex::Autolock的使用
    Android中sp和wp的使用
    Day 07 字符编码,文件操作
  • 原文地址:https://www.cnblogs.com/qiyiyifan/p/10536094.html
Copyright © 2020-2023  润新知