Java中String.contains()的Big-O是什么?

时间:2010-11-03 17:02:28

标签: java string big-o contains

我正在开发一个项目,需要优化运行时间。 String.contains()运行时是否与TreeSet.contains()相同,即O(logN)?

我问的原因是我正在构建一个TreeMap<String, TreeSet<Song>>,其中歌曲包含一串歌词。根据效率,我正在考虑在歌曲中包含一组歌词并在其上运行搜索而不是字符串。

3 个答案:

答案 0 :(得分:25)

最着名的算法之一是Boyer-Moore字符串搜索算法,它是O(n),尽管它可以在最佳情况下提供次线性性能。

Java中使用的算法取决于您下载的实现方式。例如,OpenJDK似乎使用了一个以O(nm)运行的朴素算法和最佳情况下的线性性能。见第1770-1806行here

答案 1 :(得分:1)

.contains()绝对使用幼稚的方法,等效于O(nm)的时间复杂度。

  • Boyer-moore在最坏的情况下花费O(nm)时间。
  • KMP在最坏的情况下花费O(n)时间。

在与模式匹配相关的问题之一中,我使用了.contains()并花了70 ms,而用patternSearch() //KMP search替换了该行则减少了14 ms的时间。

enter image description here

Java source code | KMP search vs .contains()

答案 2 :(得分:0)

您也可以尝试使用Trie而不是TreeMap(尽管Java没有内置的Trie实现)