据我所知,KMP算法依赖于帮助程序数组,其中有前缀类似于后缀。 当上述条件未满足时,它将无法有效,因为在帮助程序数组中包含全零。 运行时会是O(m + n)吗? 如果我是对的,在这种情况下什么是更好的子串算法?什么时候可以使用KMP算法?
1
A
回答
2
要理解KMP何时是一个很好的算法,通常可以提出问题“有什么选择?”。
KMP有一个很好的优势,它可以保证最差的效率。预处理时间总是O(n),搜索时间总是O(m)。没有最坏情况的输入,没有发生不幸的可能性等等。如果你在真正巨大的字符串(大m)内搜索非常长的字符串(大n),与其他算法相比,这可能是非常可取的天真的(在不好的情况下可能需要时间Θ(mn)),Rabin-Karp(病理输入可能需要时间Θ(mn))或Boyer-Moore(最坏情况可能是Θ(mn))。你说得对,KMP可能并不是所有必要的情况下,在字符串没有太多重叠部分的情况下,但是你永远不必担心是否存在不好的情况,这绝对是一件好事!
KMP还具有处理可以一次完成的好处。如果你知道你要搜索相同的子字符串很多次,你可以做一次O(n)预处理工作,然后有能力搜索任何长度为m的字符串,你想在时间O (M)。
相关问题
- 1. 你什么时候可以使用uint_least16_t
- 2. 什么时候可以使用filter_input()
- 3. 什么时候可以使用IORef?
- 4. 我什么时候可以使用AppDomain?
- 5. 什么时候可以使用方法和命令行选项?
- 6. 什么时候可以调用BarcodeScanner.GetDefaultAsync()?
- 7. 什么是BigInteger,我们什么时候可以使用它?
- 8. 什么时候应该使用可可?
- 9. KMP算法应用程序
- 10. 什么时候DataView可用?
- 11. 什么时候应该使用AWS,什么时候不使用
- 12. intn_t什么时候使用它,什么时候不使用
- 13. 什么时候使用__proto__和什么时候使用原型
- 14. 什么时候使用Ruby和什么时候使用PHP
- 15. 什么时候可以ManualResetEvent.Set()返回false?
- 16. 什么时候可以捕获RuntimeException
- 17. 什么时候可以ValidatorUtils.getValueAsString()返回null?
- 18. TDD。什么时候可以继续?
- 19. 什么时候使用initWithCoder:方法?
- 20. 你什么时候使用新方法?
- 21. 什么时候使用getX方法
- 22. 什么时候可以使用适用于windows的新版flex?
- 23. 什么时候可以使用静态对象引用
- 24. 什么时候可以用Javascript来使用?
- 25. 什么时候Z缓冲算法需要画家的算法?
- 26. 什么时候使用uncaught_exception?
- 27. 什么时候使用vtable?
- 28. 什么时候使用sIFR?
- 29. JOINS什么时候使用?
- 30. 什么时候使用Dispose
为什么会出现这种情况:没有最坏情况的输入,不可能发生不幸? 当模式字符串中没有重复模式时,帮助程序数组将包含所有的零,这意味着, 在字符串的每个字符处,我们必须返回到模式字符串的开头? – Jun
@Jun回退数组将全部为零,并且在每次不匹配时,我们都必须返回到模式字符串的开头。但是,当发生这种情况时,我们还会在输入字符串中向前推进相应的距离。输入的每个字符最多只能被读取两次。 – templatetypedef
恩,我现在明白了!谢谢! – Jun