哪个是更好的字符串搜索算法? Boyer-Moore 还是 Boyer Moore Horspool? [关闭]
Posted
技术标签:
【中文标题】哪个是更好的字符串搜索算法? Boyer-Moore 还是 Boyer Moore Horspool? [关闭]【英文标题】:Which is a better string searching algorithm? Boyer-Moore or Boyer Moore Horspool? [closed] 【发布时间】:2012-07-12 19:29:48 【问题描述】: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。我很迷惑!我应该使用哪个(对于小型和大型模式)进行字符串搜索,哪种算法在实际世界中具有更大的意义(我只是一名计算机科学专业的学生)?
【问题讨论】:
这是一个简单的时间与空间权衡。 满足您的要求,其中一个可能更好,但总的来说,两者都不是“更好”。为什么不尝试使用每个配置文件的 well documented, well tested implementation 来查看最适合您的数据的方法? 【参考方案1】:关键词是“几乎”。最坏情况的行为可能是极少数情况。现实生活中的平均行为和渐近行为也是相当松散耦合的。 Boyer-Moore-Horspool 的最佳情况行为与 Boyer-Moore 相同。 Boyer-Moore-Horspool 的最坏情况比 Boyer-Moore 更糟糕。对于典型的使用,Boyer-Moore-Horspool 往往与 Boyer-Moore 大致相同,但开销和初始化成本稍好(更低)。
使用哪一个?这取决于您的目标以及您对要搜索的模式和文本的期望。两者都不是特别难以实施,所以为什么不两者都做并自己比较结果。 (看看当你承认自己是学生时会发生什么?你得到了一个作业!:))
【讨论】:
“现实生活中的平均行为和渐近行为也是相当松散耦合的。”这是一个糟糕的概括。例如,它会使用大多数排序数据的快速排序来杀死你。 @std''OrgnlDave - 我的意思是,渐近行为可能是“现实生活”行为的非常糟糕的预测指标。告诉我选择一种算法而不是另一种算法,因为它具有更好的渐近行为,我会首先问,“系数是多少”?然后我会问,“问题域的平均行为是什么?”对于线性规划,内点算法具有多项式复杂度,但在实践中,大家仍然使用(渐近指数)单纯形算法。为什么?因为系数的;收支平衡点是针对大到没人能解决的问题。 @TedHopp- 谢谢 :) 我确实尝试过实现这两种方法,但几乎没有发现性能差异(也许我没有把案例做得更糟)。但我的实际疑问是 理论上 BM 应该比 BMH 快,但模拟图 link 显示出优势**BMH 而不是。所以我很困惑这是怎么发生的。 @RiteshMahato 从理论上讲,如果使用大量后缀移位,BM 会更快。对于英文文本和随机输入,这种情况很少见。但是,如果您搜索例如ba^m
在a^n
中,BM 将 BMH 从水中吹了出来。
Nit:内部点方法在实践中用于大型稀疏 LP。以上是关于哪个是更好的字符串搜索算法? Boyer-Moore 还是 Boyer Moore Horspool? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章