我正在研究支持多模式搜索的字符串搜索算法。我发现了两种算法,它们在运行时间方面似乎是最强的候选者,分别是Aho-Corasick和Rabin-Karp。但是,我找不到这两种算法之间的任何全面比较。哪种算法更有效?另外,哪一种更适合并行计算和多模式搜索?最后,哪个需要更少的硬件资源?
对于AC算法,搜索阶段需要时间,而对于RK ,搜索阶段则为。但是,RK的运行时间为,这使其类似于AC。我的初步结论是,RK看起来实际上更好,因为它不需要像AC一样多的内存。那是对的吗?
我正在研究支持多模式搜索的字符串搜索算法。我发现了两种算法,它们在运行时间方面似乎是最强的候选者,分别是Aho-Corasick和Rabin-Karp。但是,我找不到这两种算法之间的任何全面比较。哪种算法更有效?另外,哪一种更适合并行计算和多模式搜索?最后,哪个需要更少的硬件资源?
对于AC算法,搜索阶段需要时间,而对于RK ,搜索阶段则为。但是,RK的运行时间为,这使其类似于AC。我的初步结论是,RK看起来实际上更好,因为它不需要像AC一样多的内存。那是对的吗?
Answers:
渐进运行时间分析不太可能是在这两种算法之间进行选择的最佳工具:渐进分析忽略了恒定因素,而恒定因素在这里至关重要。两种算法的渐近运行时间基本相同,因此,渐进分析在它们之间进行选择可能不是很有帮助。
相反,两种算法之间的正确选择是通过实验分析。确定代表性的工作负载,然后在您打算在实践中使用的机器类型上对这两种算法的性能进行基准测试。
顺便说一句,听起来您可能对Rabin-Karp的渐近运行时间有些困惑。一方面,您说Rabin-Karp的运行时间为,但是在下一句话中,您说Rabin-Karp的运行时间为O (n + m )。也许您对预期(平均情况)与最坏情况下的运行时间之间的差异感到困惑。
由于Rabin-Karp是随机的,因此预期的(平均情况下)运行时间是在实践中用来预测实际性能的合适指标。特别是,这里取平均值作为哈希函数的随机选择。具体来说,这并不是选择字符串的平均值。即使对于最坏的字符串和模式,平均运行时间仍将为。用合适的散列函数,该运行时间长于概率Ç ⋅ (Ñ + 米)是呈指数小Ç。换句话说,Rabin-Karp花费比时间更长的时间的可能性很小。我们已经必须接受发生坏事的几率很小-例如,宇宙射线有很小的但不为零的机会导致内存中的位翻转,从而导致程序永远循环。因此,担心这个指数级的机会毫无意义。
但是,我找不到这两种算法之间的任何全面比较。
但是,如果您使用隐式查询来进行“综合比较”,则已经有一些论文通过实验/经验比较了这两种算法和其他算法在真实数据上的情况,包括对不同算法的优缺点进行权衡的分析/比较,例如:
多种模式字符串匹配方法:比较分析 / Khan,Pateriya
生物序列的字符串匹配算法比较研究 / Pandiselvam,Marimuthu,Lawrance