按条件输出行
2013-11-09 11:05
134 查看
【用户需求】
有一个大文件,有很多行(lines = 10w?)。只有少数的行满足用户关注的条件,记为cond(line) (返回真表示满足条件,假表示不满足)
如果第 i 行满足条件,则第 i 行的前后 r 行也附加关注,作为第 i 行的参考(r = 10 ?)
输出所有的关注行(包括附加关注行)
如果计算了重叠的关注行,仅输出一次(即下一关注行的前 r 行和前一关注行的后 r 行有重叠,不重复输出重叠的行)
【算 法】
设定:
KLinesIn 输入缓冲,KLinesOut 输出缓冲
ci 当前输入行 (current line No. i)
pr = [ prb,pre ] 前一个可以输出的区间 (prev range begin, end)
pcl 前一个满足 cond(pcl) 的行 (prev cond line = pre - r)
初始化:
ci = 0
prb = 0, pre = -1 (pr = [ 0,-1 ] 为空区间)
1. 从文件读取 k 行到 KLinesIn [ 0..k-1 ] 缓冲区 ( k = 1000 )
2. 从 KLinesIn 缓冲区,依次取一行进行分析;设当前行为 ci (0 <= ci <= k-1 )
2.1 分析 KLinesIn 循环
for KLinesIn [ 0..k-1 ] :
若 cond(ci) 为真, 则当前可以输出的区间为 cr = [ ci-r,ci+r ];将 cr 与 pr = [ prb, pre ] 进行比较;
- 若 cr 和 pr 不相交,即 ci-r > pre,可将 pr 输出到 KLinesOut; 当前区间变成前一区间, 即 prb = ci-r,pre = ci+r
- 若 cr 和 pr 相交,即 ci-r <= pre,则当前区间可并入前一区间,即 pre = ci + r
若 cond(ci) 为假
- 不处理
2.2 循环结束,先将 pr 输出到 KLinesOut (跳过越界部分)
若 pre >= k, prb = 0, pre = pre - k, nk = k (nk表示下次需要读取的行数)
若 pre < k, prb = 0, pre = -1
- 若 pre >= k-1-r, nk = pre+1
- 若 pre < k-1-r, nk = k-r
ci = 0
2.3 读取 nk 行,跳到 2.1 继续执行,知道文件读取结束
3. 若LinesOut [ 0..k-1 ] 满,则输出
有一个大文件,有很多行(lines = 10w?)。只有少数的行满足用户关注的条件,记为cond(line) (返回真表示满足条件,假表示不满足)
如果第 i 行满足条件,则第 i 行的前后 r 行也附加关注,作为第 i 行的参考(r = 10 ?)
输出所有的关注行(包括附加关注行)
如果计算了重叠的关注行,仅输出一次(即下一关注行的前 r 行和前一关注行的后 r 行有重叠,不重复输出重叠的行)
【算 法】
设定:
KLinesIn 输入缓冲,KLinesOut 输出缓冲
ci 当前输入行 (current line No. i)
pr = [ prb,pre ] 前一个可以输出的区间 (prev range begin, end)
pcl 前一个满足 cond(pcl) 的行 (prev cond line = pre - r)
初始化:
ci = 0
prb = 0, pre = -1 (pr = [ 0,-1 ] 为空区间)
1. 从文件读取 k 行到 KLinesIn [ 0..k-1 ] 缓冲区 ( k = 1000 )
2. 从 KLinesIn 缓冲区,依次取一行进行分析;设当前行为 ci (0 <= ci <= k-1 )
2.1 分析 KLinesIn 循环
for KLinesIn [ 0..k-1 ] :
若 cond(ci) 为真, 则当前可以输出的区间为 cr = [ ci-r,ci+r ];将 cr 与 pr = [ prb, pre ] 进行比较;
- 若 cr 和 pr 不相交,即 ci-r > pre,可将 pr 输出到 KLinesOut; 当前区间变成前一区间, 即 prb = ci-r,pre = ci+r
- 若 cr 和 pr 相交,即 ci-r <= pre,则当前区间可并入前一区间,即 pre = ci + r
若 cond(ci) 为假
- 不处理
2.2 循环结束,先将 pr 输出到 KLinesOut (跳过越界部分)
若 pre >= k, prb = 0, pre = pre - k, nk = k (nk表示下次需要读取的行数)
若 pre < k, prb = 0, pre = -1
- 若 pre >= k-1-r, nk = pre+1
- 若 pre < k-1-r, nk = k-r
ci = 0
2.3 读取 nk 行,跳到 2.1 继续执行,知道文件读取结束
3. 若LinesOut [ 0..k-1 ] 满,则输出
相关文章推荐
- 收集常用的正则表达式
- PHP判断数字连续性,且按n~m,x,z方式显示
- 文明能压碎,情怀不衰,无论枯干山水
- poj1734 Musical Theme
- Android中实现定时器的3种解决方法
- MDK5.00免刷Jlink升级方法
- Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
- 服务器设计系列:线程
- 最小生成树---模板
- 对产品很无语
- JS-SVG练习之关系图
- ffmpeg 多线程初始化,需要做的事
- SQLserver 存储过程生成任意进制/顺序流水号
- git reset简介
- Lucene4.1 视频学习
- 学C++不得不看的一篇文章[转]
- error C2668: 'sqrt' : ambiguous call to overloaded
- Android应用检测更新
- 依赖注入随写
- C++ - "动态内存成员" 的 类设计 (值和指针)