【问题标题】:When is good to use KMP algorithm?什么时候使用 KMP 算法比较好?
【发布时间】:2017-02-22 21:38:06
【问题描述】:

我了解 KMP 算法依赖于辅助数组,其中存在类似于后缀的前缀。 当上述条件不满足时,它不会有效,因为辅助数组中包含全零。 运行时间会是 O(m + n) 吗? 如果我是对的,在这种情况下,什么是更好的子字符串算法?

【问题讨论】:

    标签: string algorithm substring big-o knuth-morris-pratt


    【解决方案1】:

    要了解何时使用 KMP 是一种很好的算法,询问“有什么替代方案?”这个问题通常会有所帮助

    KMP 有一个很好的优势,即它可以保证最坏情况下的效率。预处理时间总是O(n),搜索时间总是O(m)。没有最坏情况的输入,没有倒霉的可能性等。如果您在非常大的字符串(大 m)中搜索非常长的字符串(大 n),与其他算法相比,这可能是非常可取的,例如幼稚的(在坏情况下可能需要时间 Θ(mn))、Rabin-Karp(病理输入可能需要时间 Θ(mn))或 Boyer-Moore(最坏情况下可能是 Θ(mn))。您是对的,在字符串的重叠部分不多的情况下,KMP 可能并不是那么必要,但是您永远不必担心是否有坏的情况,这绝对是一件好事!

    KMP 还具有可以一次性完成处理的优良特性。如果您知道要多次搜索相同的子字符串,则可以执行一次 O(n) 预处理工作,然后能够及时搜索您想要的任何长度-m 的字符串 O (米)。

    【讨论】:

    • 为什么会这样:没有最坏情况的输入,没有倒霉的可能性?当模式字符串中没有重复模式时,辅助数组将包含所有零,这意味着,在字符串的每个字符处,我们必须回到模式字符串的开头?
    • @Jun 您绝对正确,后备数组将全为零,并且在每次不匹配时,我们都必须返回到模式字符串的开头。然而,当这种情况发生时,我们也会在输入字符串中向前推进一个相应的距离。输入的每个字符最多只能读取两次。
    猜你喜欢
    • 2011-02-21
    • 2013-11-08
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多