據我所知,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. 我什麼時候可以使用Task.Yield()?
- 2. 什麼時候可以使用filter_input()
- 3. 什麼時候可以使用IORef?
- 4. 什麼時候可以使用lodash.after()?
- 5. 你什麼時候可以使用uint_least16_t
- 6. 我什麼時候可以使用AppDomain?
- 7. 何時使用Rabin-Karp或KMP算法?
- 8. 什麼時候可以使用方法和命令行選項?
- 9. 什麼時候可以調用BarcodeScanner.GetDefaultAsync()?
- 10. 什麼是BigInteger,我們什麼時候可以使用它?
- 11. 什麼時候應該使用可可?
- 12. python的KMP算法
- 13. KMP算法應用程序
- 14. KineticJS:我什麼時候使用toImage()以及什麼時候使用緩存()
- 15. 什麼時候DataView可用?
- 16. 什麼時候使用__proto__和什麼時候使用原型
- 17. 什麼時候應該使用AWS,什麼時候不使用
- 18. intn_t什麼時候使用它,什麼時候不使用
- 19. 什麼時候使用Ruby和什麼時候使用PHP
- 20. 什麼時候使用ByteString,什麼時候不使用?
- 21. 什麼時候可以寫Mockito.anyInt()?
- 22. 什麼時候可以捕獲RuntimeException
- 23. 什麼時候可以mktime返回-1?
- 24. 什麼時候可以ManualResetEvent.Set()返回false?
- 25. TDD。什麼時候可以繼續?
- 26. 什麼時候可以ValidatorUtils.getValueAsString()返回null?
- 27. 什麼時候可以Request.Url爲空?
- 28. 什麼時候應該使用async/await,什麼時候不用?
- 29. 你什麼時候使用新方法?
- 30. 什麼時候使用initWithCoder:方法?
爲什麼會出現這種情況:沒有最壞情況的輸入,不可能發生不幸? 當模式字符串中沒有重複模式時,幫助程序數組將包含所有的零,這意味着, 在字符串的每個字符處,我們必須返回到模式字符串的開頭? – Jun
@Jun回退數組將全部爲零,並且在每次不匹配時,我們都必須返回到模式字符串的開頭。但是,當發生這種情況時,我們還會在輸入字符串中向前推進相應的距離。輸入的每個字符最多隻能被讀取兩次。 – templatetypedef
恩,我現在明白了!謝謝! – Jun