滑动窗口算法的一个应用

我是在瞎说

最近遇到一个问题,就是jenkins job上传日志到es的时候,需要针对关键字前后各100行进行上传,其余的全部丢弃,(别问我为什么丢弃,es不至于这点儿日志里都撑不住),但是日志是实时的流式生成,logstash似乎不直接支持这类处理,所以需要自己想点儿法子

我爱说实话

那么维护一个滑动窗口就很有必要了,

  1. 初始化一个滑动窗口,这个窗口容量为201,内容是空的
  2. 初始化一个flag = false,表明窗口内有没有包含关键字的一行日志
  3. 每当生成一行日志,
    1. 如果这行日志不包括关键字,那么把这行日志入栈滑动窗口
    2. 如果包括关键字,那么把这行日志入栈滑动窗口,并记录关键字位置/坐标1,并记录此时已经找到关键字了flag = true,准备100行后上传日志,即把窗口的剩余容量调整为100
    3. 如果接下来又遇到了一行包括关键字的日志,但是窗口还没填满,那么再次将窗口的剩余容量调整为100
    4. 一旦窗口满了,如果flag == true,将窗口内的所有日志上传,然后清空重置窗口和flag,当然,flag == false,保留窗口内最新的100个内容,将剩余容量调整为101
    5. 循环以上1-4即可

时间为O(n),空间大概也是O(n)吧,不是很确定