【问题标题】:Sliding window searching algorithm滑动窗口搜索算法
【发布时间】:2012-08-07 03:54:42
【问题描述】:

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

例如,如果 M=4 和 W = 3:

1 好 2 好 3 好 4 好 5 好 | 6 好 |- 大小为 3 的窗口,一切都很好。 7 好 | 8 坏 9 坏 10 好 11 好 12 坏 13 好 14 坏 15 坏 16 坏 17 Bad

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

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

【问题讨论】:

    标签: algorithm search


    【解决方案1】:

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

    这样的东西应该可以工作

    // 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
    

    【讨论】:

    • 这就是我在过去两周内每天工作 14-16 小时在这个愚蠢的项目上所得到的。哦,这很简单。不要让我开始说我什至不应该自己解决这部分/咆哮。
    • @Peter 发生在每个人身上(比我愿意承认的更多)
    猜你喜欢
    • 2021-07-01
    • 2011-05-06
    • 2010-11-14
    • 2016-12-25
    • 2011-01-13
    • 2018-08-27
    • 2017-09-23
    • 2020-07-01
    • 2012-01-06
    相关资源
    最近更新 更多