我正在开发一个项目,需要优化运行时间。 String.contains()
运行时是否与TreeSet.contains()
相同,即O(logN)?
我问的原因是我正在构建一个TreeMap<String, TreeSet<Song>>
,其中歌曲包含一串歌词。根据效率,我正在考虑在歌曲中包含一组歌词并在其上运行搜索而不是字符串。
答案 0 :(得分:25)
最着名的算法之一是Boyer-Moore字符串搜索算法,它是O(n),尽管它可以在最佳情况下提供次线性性能。
Java中使用的算法取决于您下载的实现方式。例如,OpenJDK似乎使用了一个以O(nm)运行的朴素算法和最佳情况下的线性性能。见第1770-1806行here。
答案 1 :(得分:1)
.contains()
绝对使用幼稚的方法,等效于O(nm)
的时间复杂度。
O(nm)
时间。O(n)
时间。在与模式匹配相关的问题之一中,我使用了.contains()
并花了70 ms
,而用patternSearch() //KMP search
替换了该行则减少了14 ms
的时间。
答案 2 :(得分:0)
您也可以尝试使用Trie而不是TreeMap(尽管Java没有内置的Trie实现)