按條件輸出行

2021-06-19 02:13:33 字數 1234 閱讀 5307

【使用者需求】

有乙個大檔案,有很多行(lines = 10w?)。只有少數的行滿足使用者關注的條件,記為cond(line) (返回真表示滿足條件,假表示不滿足)

輸出所有的關注行(包括附加關注行)

如果計算了重疊的關注行,僅輸出一次(即下一關注行的前 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 ]  滿,則輸出

按條件搜尋說明

按條件搜尋說明 文章搜尋頁面如圖所示 helpcontentlist 元件中的部分 如下 name helpcontentlist publicclasshelpcontentlist extendsentityquery,helpcontent.helpcat.id privatehelpcont...

Xutils 按條件查詢

查parententity db.findbyid parent.class,parent.getid parententity db.findfirst entity 通過entity的屬性查詢 listlist db.findall entity 通過entity的屬性查詢 listlist d...

python按條件拆分列表 按條件將列表拆分成塊

你為什麼不換個角度想想。你可以把每一次都對映成乙個dict import re from collections import defaultdict regex re.compile a z d a z t asdf 1 bhd uuu 2 ggg asdf 2 bhd uuu 1 ggg asd...