博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios-数组查找元素优化方案
阅读量:5335 次
发布时间:2019-06-15

本文共 1894 字,大约阅读时间需要 6 分钟。

有序数组查找元素优化方案

一般情况下查找元素我们这样写:

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

 

转载于:https://www.cnblogs.com/qiyiyifan/p/10536094.html

你可能感兴趣的文章
MATLAB作图方法与技巧(一)
查看>>
上海淮海中路上苹果旗舰店门口欲砸一台IMAC电脑维权
查看>>
Google透露Android Market恶意程序扫描服务
查看>>
给mysql数据库字段值拼接前缀或后缀。 concat()函数
查看>>
迷宫问题
查看>>
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
泛型子类_属性类型_重写方法类型
查看>>
eclipse-将同一个文件分屏显示
查看>>
对闭包的理解
查看>>
练习10-1 使用递归函数计算1到n之和(10 分
查看>>
Oracle MySQL yaSSL 不明细节缓冲区溢出漏洞2
查看>>
windows编程ASCII问题
查看>>
.net webService代理类
查看>>
Code Snippet
查看>>
Node.js Express项目搭建
查看>>
zoj 1232 Adventure of Super Mario
查看>>
1201 网页基础--JavaScript(DOM)
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>