Boyer Moore算法的预处理时间为Θ(m + |Σ|),匹配时间为Ω(n / m),O(n)。据我所知,Boyer Moore Horspool是Simplified Boyer Moore本身的进步,但根据this Wikipedia article,其平均案例复杂度为O(N)和最差情况O(MN)。因此,在最坏的情况下,它应该比Boyer Moore算法慢。但智利大学的this classic survey显示,Boyer-Moore horspool几乎每次都胜过Boyer Moore。我很迷惑!我应该使用哪一种(对于小图案和大图案)进行字符串搜索,哪种算法在实际世界中具有更大的意义(我只是一名计算机科学专业的学生)?
答案 0 :(得分:4)
关键词是“差不多”。最坏情况的行为可能是针对极少数情况的。现实生活中的平均行为和渐近行为也是相当松散耦合的。 Boyer-Moore-Horspool的最佳案例行为与Boyer-Moore相同。 Boyer-Moore-Horspool最糟糕的情况比Boyer-Moore糟糕得多。对于典型用途,Boyer-Moore-Horspool与Boyer-Moore大致相同,但开销和初始化成本稍微好一点(
)。使用哪一个?这取决于您的目标以及您对搜索模式和文本的期望。两者都没有特别难以实现,所以为什么不两者兼顾并自己比较结果。 (看看当你承认自己是学生时会发生什么?你得到一份作业!:))