快速查找数组内元素的方法

2017-08-28  本文已影响16人  白菜松

数组是编程常用的变量,数组内寻值也时日常操作。话说那种方法更快呢。
下面是白菜知道的几种方法:

生成一个随机数组,intSearch最多会随机出现一次

-(void)sort{
    
    
    NSMutableArray *arrOrder=[NSMutableArray arrayWithCapacity:0];
    
    NSInteger intTimes = 1;
    NSInteger intEnd = 10000;
    //生成一个随机数组,intSearch会随机出现一次
    NSInteger intSearch = arc4random()%intEnd;
    
    BOOL isHave = NO;
    while (intTimes <= intEnd)
    {
        NSInteger intRandom = arc4random()%intEnd;
        if (intRandom == intSearch) {
            [arrOrder addObject:isHave? @(intSearch+1):@(intSearch)];
            isHave = YES;
        } else {
            [arrOrder addObject:@(intRandom)];
        }
        
        
        intTimes++;
    }
    
    //    NSLog(@"intSearch = %zd, arrOrder = %@", intSearch, arrOrder);
    
    
    NSDate *dateCurrent = [NSDate date];
    //方法1
    if ([arrOrder indexOfObject:@(intSearch)] != NSNotFound) {
        _times ++;
        CGFloat sec =  [[NSDate date] timeIntervalSinceDate:dateCurrent];
        NSLog(@"第%zd次,sec1 = %f", _times, sec);
    }
    
    //方法2
    dateCurrent = [NSDate date];
    [arrOrder enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        if ([obj integerValue] == intSearch) {
            
            CGFloat sec =  [[NSDate date] timeIntervalSinceDate:dateCurrent];
            NSLog(@"第%zd次,sec2 = %f", _times, sec);
        }
    }];
    
    
    //方法3
    dateCurrent = [NSDate date];
    
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply([arrOrder count], queue, ^(size_t index) {
        
        if ([arrOrder[index] integerValue] == intSearch) {
            
            CGFloat sec =  [[NSDate date] timeIntervalSinceDate:dateCurrent];
            NSLog(@"第%zd次,sec3 = %f", _times, sec);
        }
    });
    
    
}

100条数据

2017-08-28 13:54:38.020 examples[97490:5270031] 第1次,sec1 = 0.000015
2017-08-28 13:54:38.020 examples[97490:5270031] 第1次,sec2 = 0.000010
2017-08-28 13:54:38.020 examples[97490:5270031] 第1次,sec3 = 0.000025
2017-08-28 13:54:39.901 examples[97490:5270031] 第2次,sec1 = 0.000007
2017-08-28 13:54:39.901 examples[97490:5270031] 第2次,sec2 = 0.000008
2017-08-28 13:54:39.901 examples[97490:5270031] 第2次,sec3 = 0.000026
2017-08-28 13:54:45.766 examples[97490:5270031] 第3次,sec1 = 0.000004
2017-08-28 13:54:45.766 examples[97490:5270031] 第3次,sec2 = 0.000003
2017-08-28 13:54:45.767 examples[97490:5270031] 第3次,sec3 = 0.000018

1000条数据

2017-08-28 13:55:18.061 examples[97515:5271284] 第1次,sec1 = 0.000033
2017-08-28 13:55:18.062 examples[97515:5271284] 第1次,sec2 = 0.000052
2017-08-28 13:55:18.062 examples[97515:5271342] 第1次,sec3 = 0.000046
2017-08-28 13:55:19.661 examples[97515:5271284] 第2次,sec1 = 0.000004
2017-08-28 13:55:19.661 examples[97515:5271284] 第2次,sec2 = 0.000005
2017-08-28 13:55:19.661 examples[97515:5271284] 第2次,sec3 = 0.000021
2017-08-28 13:55:28.231 examples[97515:5271284] 第3次,sec1 = 0.000033
2017-08-28 13:55:28.232 examples[97515:5271284] 第3次,sec2 = 0.000032
2017-08-28 13:55:28.232 examples[97515:5271375] 第3次,sec3 = 0.000044

10000条数据

2017-08-28 14:00:00.034 examples[97585:5276437] 第1次,sec2 = 0.000489
2017-08-28 14:00:00.035 examples[97585:5276736] 第1次,sec3 = 0.000204
2017-08-28 14:00:11.082 examples[97585:5276437] 第2次,sec1 = 0.000304
2017-08-28 14:00:11.082 examples[97585:5276437] 第2次,sec2 = 0.000299
2017-08-28 14:00:11.083 examples[97585:5276789] 第2次,sec3 = 0.000178
2017-08-28 14:00:28.069 examples[97585:5276437] 第3次,sec1 = 0.000138
2017-08-28 14:00:28.069 examples[97585:5276437] 第3次,sec2 = 0.000201
2017-08-28 14:00:28.070 examples[97585:5276906] 第3次,sec3 = 0.000095

经过测试发现,数组数量越大,方法3相对比较效率更高。2000条是个大概的分界点,小于2000时前面的两个方法用时更短,大于2000时则方法3更快。

上一篇 下一篇

猜你喜欢

热点阅读