相关疑难解决方法(0)

线性模式匹配算法?

我有一个0和1的线性列表,我需要匹配多个简单模式并找到第一个出现.例如,我可能需要寻找0001101101,01010100100,或10100100010长度800万的名单之内.我只需要找到第一个出现的,然后返回它发生的索引.但是,对大型列表进行循环和访问可能很昂贵,而且我宁愿不要这么做太多次.

有没有比做更快的方法

foreach (patterns) {
    for (i=0; i < listLength; i++)
        for(t=0; t < patternlength; t++)
            if( list[i+t] != pattern[t] ) {
                 break;
            }
            if( t == patternlength - 1 ) {
                 return i;  // pattern found!
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑: BTW,我已经按照上面的伪代码实现了这个程序,性能还可以,但没什么了不起的.我估计我在处理器的单个核心上每秒处理大约600万比特.我正在使用它进行图像处理,它必须经过几千万像素的图像,所以每一点都有帮助.

编辑:如果不清楚,我正在使用一个数组,所以只有两种可能:ONE和ZERO.它是在C++中.

编辑:感谢BM和KMP算法的指针.我注意到,在BM的维基百科页面上,它说

该算法预处理正在搜索的目标字符串(键),但不预处理正在搜索的字符串(与预处理要搜索的字符串的某些算法不同,然后可以通过重复搜索来分摊预处理的费用).

这看起来很有趣,但它没有给出任何这种算法的例子.这样的事情也有帮助吗?

language-agnostic algorithm pattern-matching

4
推荐指数
2
解决办法
3562
查看次数