您的位置:首页 > 其它

按条件输出行

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 ] 满,则输出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: