ios 通过两个数组抽取一个有效数组的算法

通常来讲 两个数组 中找出一个有效的数组

就是两个for循环 外层循环i 内存循环 j 就可以把有效数据取出来了。

但是呢 我们公司的数据 有时候第一个数组就几千个 第二个数组也几千个

比如1000 *1000 就10 的6次方的计算次数了。

直接让计算机算 会非常耗时。

需求是:

我们的第一个数组 是由许多个 3秒一段的视频组成的
第二个数组是一个一个的时间节点,
要求 针对每个时间节点 前后15秒做判断,如果发现包含了第一个数组3秒一段的视频
就把视频抽出到新的数组里面

我的解决方案是两个时间排序。

第一个数组排序 第二个数组排序

排完顺序以后就开始遍历第一个数组
并取出第二个数组的第一项来对比,一旦对比到了,就添加进去,然后继续对比,
一直对比到超出了第二个数组的第一项的范围,就马上取第二个数组的下一项,

注意 如果第二个数组已经全取完了。

也直接结束掉,这样 整个过程只有一次循环 ,效率提升很大一个档次。

上代码 ,

注意一下,

我的第一个数组是正序的,第二个数组是倒序的,所以遍历是倒着来的。

进入条件就是在前后15秒范围内,跳出条件就是超过了前后15秒范围,当k <0代表第二个数组取完,(i + 1)> = jsonArray.count代表是最后一项了,不需要继续判断了也跳出,其余的部分是打印,和一些字典的转换`

- (void)getRedTsList:(NSArray *)sectionArr andJson:(NSArray *)jsonArray andComlpleteBlock:(void (^)(NSArray *object))completeblock{
    NSLog(@"开始过滤");
    NSMutableArray *redJsonArr = [NSMutableArray array];//结果数组
    NSInteger k = sectionArr.count- 1;//标记第二个数组最后一项为k
    for (NSInteger i=0; i<jsonArray.count; i++) {//遍历第一个数组
        if (k<0) {//k<0 代表第二个数组已经取完了。
            break;
        }
        NSDictionary *infoDic = jsonArray[i];//白色时间段
        NSString *startTimeStr = infoDic[@"videoStartTime"];
        NSString *endTimeStr =  infoDic[@"videoEndTime"];
        NSInteger starttime = [self formatTimeFormString:startTimeStr];
        NSInteger endTime = [self formatTimeFormString:endTimeStr];//第一个数组的starttime 和endTime
        NSDictionary *eventDic = sectionArr[k];//取出第二个数组第k项,
        NSString *redTimeLabel = eventDic[@"eventOddurTime"];
        NSInteger redTime = [self formatTimeFormString:redTimeLabel];//取出第k项的redtime
//  NSLog(@"startTime = %@ %ld endTime = %@ %ld redTime = %@ %ld",startTimeStr,(long)starttime,endTimeStr,(long)endTime,redTimeLabel,(long)redTime);
        if ((redTime- 15)< starttime && endTime< (redTime + 15) ) {//第一个数组的starttime 和endTime 在redtime 的前后15秒之内 就进入
            [redJsonArr addObject:infoDic];//添加到结果数组
            if ((i+1) >= jsonArray.count) {
                break;
            }//第一个数组到了最后一项 直接跳出
            NSDictionary *infoDic1 = jsonArray[i+1];//白色时间段
            NSString *startTimeStr1 = infoDic1[@"videoStartTime"];
            NSString *endTimeStr1 = infoDic1[@"videoEndTime"];
            NSInteger starttime1 = [self formatTimeFormString:startTimeStr1];
            NSInteger endTime1 = [self formatTimeFormString:endTimeStr1];//第一个数组下一项的starttime 和endTime
//  NSLog(@"startTime = %@ %ld endTime = %@ %ld redTime = %@ %ld 在前后15秒范围内 下一项的时间开始startTimeStr1 = %@ %ld  结束时间 endTimeStr1 = %@ %ld",startTimeStr,(long)starttime,endTimeStr,(long)endTime,redTimeLabel,(long)redTime,startTimeStr1,(long)starttime1,endTimeStr1,(long)endTime1);
            if ((redTime+ 15) <= starttime1) {//第一个数组的starttime 和endTime 不在redtime 的前后15秒之内 就进入
                 k--;//k-- 就会在下次循环的时候取第二个数组的下一项了
            }
            if ((redTime+ 15) <= endTime1) {
                k--;
            }
        }
    }
    NSLog(@"开始过滤 过滤结束");
    completeblock(redJsonArr);
}

猜你喜欢

转载自blog.csdn.net/github_35041937/article/details/79388265