快速的找到一个对象

标题是快速的找到对象,并不是真的找到你的另一半,是object吐舌头

那么我来进行一个小小的实验,怎么快速的找到需要的对象,定义一个数组

 NSArray *numberArray =@[@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@1,@12,@13,@14,@15,@16,@17,@18,@19,@20];

使用循坏,看看几种循坏那种效率更高

1、最普通的方式,这个方式用的最多的时候我们不管数组里面是什么元素,尽管遍历就是

NSArray *numberArray = @[@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@1,@12,@13,@14,@15,@16,@17,@18,@19,@20];
    for (int i=0; i<numberArray.count; i++) {
        if ([numberArray[i] isEqual:@19]) {
            NSLog(@"%d",i);
        }
    }
    CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime);
    NSLog(@"Linked in %f ms", linkTime *1000.0);



查找19这个元素只用了0.429034ms,很快啊

2、再试下for  in  加强for循环试试,一般使用这个是因为我们知道数组里面元素什么类型

for (NSNumber *temp in numberArray) {
        if ([temp isEqual:@19]) {
            NSInteger index = [numberArray indexOfObject:temp];
            NSLog(@"%ld",index);
            
        }
    }


哇,只用了0.331998ms,真的是很快啊

3、我们使用第三种遍历方式试试

[numberArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj isEqual:@19]) {
            NSLog(@"%ld",idx);
            
        }
    }];

这种是使用block方式遍历,用了0.397980ms,也挺快

4、还有一种二分法查找元素

- (NSInteger)seachObj:(id)obj inArr:(NSArray *)sortArr
{

    NSRange seachRange = NSMakeRange(0, sortArr.count);
    NSInteger findIndex = [sortArr indexOfObject:obj inSortedRange:seachRange options:NSBinarySearchingLastEqual usingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare:obj2];
    }];
    return findIndex;
}
调用一下

NSInteger index = [selfseachObj:@19 inArr:numberArray];

NSLog(@"%ld",index);


用了0.388026ms,感觉也没有很快啊,二分法在元素很少的情况下并没有体现自己的优势啊

现在就目前的这个数组进行一个效率的排序,第一名:for  in循坏0.331998ms,第二名:二分法查询0.388026ms    第三名:block方式0.397980ms  第四名:for循坏0.429034ms

现在数组元素为20个,我们把数组元素多一些,再看一次结果,现在数组为200多个元素

NSArray *numberArray = @[@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@1,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26,@27,@28,@29,@30,@31,@32,@33,@34,@35,@36,@37,@38,@39,@40,@41,@42,@3,@44,@45,@46,@47,@48,@49,@50,@51,@52,@53,
 @54,@55,@56,@57,@58,@59,@60,@61,@62,@63,@64,@65,@66,@67,@68,@69,@70,@71,@72,@73
 ,@74,@75,@76,@77,@78,@79,@80,@81,@82,@83,@84,@85,@86,@87,@88,@89,@90,@91,@92,@93
 ,@94,@95,@96,@97,@98,@99,@100,@101,@102,@103,@104,@105,@106,@107,@108,@109,@200,
 @201,@202,@203,@204,@205,@206,@207,@208,@209,@210,@211,@212,@213,@214,@215,@216,
 @217,@218,@219,@220,@221,@222,@223,@224,@225,@226,@227,@228,@229,@230,@240,@1,@2,
 @3,@4,@5,@6,@7,@8,@9,@10,@1,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,
 @25,@26,@27,@28,@29,@30,@31,@32,@33,@34,@35,@36,@37,@38,@39,@40,@41,@42,@3,@44,
 @45,@46,@47,@48,@49,@50,@51,@52,@53,@54,@55,@56,@57,@58,@59,@60,@61,@62,@63,@64,
 @65,@66,@67,@68,@69,@70,@71,@72,@73,@74,@75,@76,@77,@78,@79,@80,@81,@82,@83,@84,
 @85,@86,@87,@88,@89,@90,@91,@92,@93,@94,@95,@96,@97,@98,@99,@100,@101,@102,@103,
 @104,@105,@106,@107,@108,@109,@200,@201,@202,@203,@204,@205,@206,@207,@208,@209,
 @210,@211,@212,@213,@214,@215,@216,@217,@218,@219,@220,@221,@222,@1220,@224,@225
 ,@226,@227,@228,@229,@230];

测试结果for循坏:0.492036ms  for in:0.432014ms  block:0.667989ms 二分法:0.351012ms

最快的是二分法,当然要是数据在数组的中间用二分法会更加快,但是几种方法差别不是很大的话比如for循坏、 for in 二分法没有差别很大,所以他们之间的随机还是很大的,用哪种方式查找元素要视情况而定

总结:对于非常小规模的数组遍历的时候,使用那种都可以,forfor in的也都比较快

如果想同时拿到keyvalue,使用block是个好的方式,而且是异步的,不用考虑顺序








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章