快速的找到一個對象

標題是快速的找到對象,並不是真的找到你的另一半,是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是個好的方式,而且是異步的,不用考慮順序








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