ios 通过两个数组抽取一个有效数组的算法
2018-02-27 14:48
302 查看
通常来讲 两个数组 中找出一个有效的数组
就是两个for循环 外层循环i 内存循环 j 就可以把有效数据取出来了。
但是呢 我们公司的数据 有时候第一个数组就几千个 第二个数组也几千个
比如1000 *1000 就10 的6次方的计算次数了。
直接让计算机算 会非常耗时。
需求是:
我们的第一个数组 是由许多个 3秒一段的视频组成的
第二个数组是一个一个的时间节点,
要求 针对每个时间节点 前后15秒做判断,如果发现包含了第一个数组3秒一段的视频
就把视频抽出到新的数组里面
我的解决方案是两个时间排序。
第一个数组排序 第二个数组排序
排完顺序以后就开始遍历第一个数组
并取出第二个数组的第一项来对比,一旦对比到了,就添加进去,然后继续对比,
一直对比到超出了第二个数组的第一项的范围,就马上取第二个数组的下一项,
注意 如果第二个数组已经全取完了。
也直接结束掉,这样 整个过程只有一次循环 ,效率提升很大一个档次。
上代码 ,
注意一下,
我的第一个数组是正序的,第二个数组是倒序的,所以遍历是倒着来的。
进入条件就是在前后15秒范围内,跳出条件就是超过了前后15秒范围,当k <0代表第二个数组取完,(i + 1)> = jsonArray.count代表是最后一项了,不需要继续判断了也跳出,其余的部分是打印,和一些字典的转换`
就是两个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,endTim a966 eStr1,(long)endTime1); if ((redTime+ 15) <= starttime1) {//第一个数组的starttime 和endTime 不在redtime 的前后15秒之内 就进入 k--;//k-- 就会在下次循环的时候取第二个数组的下一项了 } if ((redTime+ 15) <= endTime1) { k--; } } } NSLog(@"开始过滤 过滤结束"); completeblock(redJsonArr); }
相关文章推荐
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。
- iOS 笔试题~两个有序数组合并成一个有序数组
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。
- 算法面试题——两个有序数组,将一个数组放入另一个空间很大的数组,要求合并之后依然有序,时间复杂度要求最小,不使用额外的数组。
- 算法习题61:找出数组中两个只出现一次的数字:一个整型数组里除了两个数字之外,其他的数字都出现了两次
- 每天一道算法题(二):给定数组Arr和一个整数aim,请返回哪两个位置的数可以加出aim来。
- iOS 算法~写一个函数,返回数字1-N排列组成的字符串,数字之间通过空格分离.例如1-5.返回”1 2 3 4 5”
- Java中如何把两个数组合并为一个(已验证有效)
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)
- php中通过数组进行高效随机抽取指定条记录的算法
- 算法 - 两个有序数组合并成一个有序数组
- 数据结构与算法——在一个数组中实现两个堆栈(C语言)
- 设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 请教一个算法问题,有两个数组A,B,判断A中是否至少有一个元素和B中元素相同
- 每天一个小算法(1)----合并两个已经排序的数组
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(1)
- 算法 - 合并两个有序数组为一个有序数组
- 假如一个数组存储了一个股票,在一天交易窗口内各时间点的股票价格(正整数),只允许一次买入和一次卖出,请提供一个算法,计算出通过买入和卖出可以得到的最大利润