滑动窗口搜索算法

时间:2010-09-11 23:17:33

标签: algorithm search

我需要一种数据存储类型和算法来跟踪我见过的最后N个项目的状态。每个项目的状态为“通过”或“失败”,但如果连续的M项失败,则我监视的系统将被视为已失败。一旦认为系统出现故障,我就需要扫描数据历史记录并找到宽度为W的最后一个窗口,其中所有项目都处于“良好”状态。

例如,M = 4且W = 3:

    1 Good
    2 Good
    3 Good
    4 Good
    5 Good |
    6 Good |- Window of size 3 where all are good.
    7 Good |
    8 Bad
    9 Bad
    10 Good
    11 Good
    12 Bad
    13 Good
    14 Bad
    15 Bad
    16 Bad
    17 Bad  <== System is deemed bad at this point  So scan backwards to find "Good" window.

我知道这最终会像正则表达式搜索一样结束,并且对Knuth的模糊回忆浮出我记忆中的黑暗深处,所以有人能指出我如何做到这一点的简单介绍吗?同样值得一提的是,我将在Windows XP系统上的C#.Net 3.5中实现这一点,看到3GB的Ram(以及一台i7处理器 - 嗅探用于安装Windows 7的机器,它确实有8GB的内存 - 但 是TDWTF的一个故事)

最后,我将在此系统的任何给定运行中扫描100,000到数百万的项目数。我不需要跟踪整个运行,只需跟踪所有项目的子集,直到发生系统故障。当发生这种情况时,我可以转储我收集的所有数据并重新开始这个过程。但是对于我跟踪的每个项目,我必须至少保持通过/失败状态和10个字符串。所以我正在寻找有关如何在系统中收集和维护这些数据的建议。虽然我很想说 - “嗯,即使整个过程都以100%通过,它也会适合记忆,所以它可以为你准备一个阵列!”

1 个答案:

答案 0 :(得分:5)

我知道这最终会像正则表达式搜索一样 实际上,这个问题要简单得多。我们可以利用这样一个事实,即我们正在搜索仅包含不良结果(或仅有良好结果)的子序列。

这样的事情应该有效

// how many consecutive bad results we have at this point
int consecutiveFailures = 0;
// same for good results
int consecutivePasses = 0;
for each result
    if result == 'pass' then
        consecutiveFailures = 0;
        ++consecutivePasses;
    else if result == 'fail' then
        consecutivePasses = 0;
        ++consecutiveFailures;        
    end

    if consecutiveFailures == M
        // M consecutive failures, stop processing
        ...
    end
    if consecutivePasses >= W
        // record last set of W consecutive passes for later use
        ...
    end
end