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

Java中String.contains()的大O是什么?,java,string,big-o,contains,Java,String,Big O,Contains,我正在做一个项目,需要优化运行时间。String.contains()运行时是否与TreeSet.contains()相同,即O(logN) 我问这个问题的原因是我正在构建一个树形图,其中的歌曲包含一串歌词。根据效率的不同,我正在考虑在歌曲中包含一组歌词,并对其进行搜索,而不是对字符串进行搜索。最著名的算法之一是字符串搜索算法,它是O(n),尽管它在最佳情况下可以提供次线性性能 Java中使用哪种算法取决于您下载的实现。例如,OpenJDK似乎使用了一种在O(nm)中运行的朴素算法,并且在最佳情

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


我问这个问题的原因是我正在构建一个
树形图
,其中的歌曲包含一串歌词。根据效率的不同,我正在考虑在歌曲中包含一组歌词,并对其进行搜索,而不是对字符串进行搜索。

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


Java中使用哪种算法取决于您下载的实现。例如,OpenJDK似乎使用了一种在O(nm)中运行的朴素算法,并且在最佳情况下具有线性性能。参见第1770-1806行。

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

。contains()
肯定使用了朴素的方法,相当于
O(nm)
时间复杂性

  • 最坏情况下需要
    O(nm)
    时间
  • 在最坏的情况下需要
    O(n)
    时间
在与模式匹配相关的一个问题中,我使用了
.contains()
,花费了
70 ms
,而将该行替换为
patternSearch()//KMP search
将时间缩短到
14 ms


你链接的那篇文章说它是O(n),因为它最多进行了3次比较。“最坏情况O(n)”是一个重言式-根据定义O(n)是最坏情况:)根据本文,jdk1.6.023与当代OpenJDK具有相同的
String.indexOf()
实现。有人会告诉你
String.contains()
@NicholasWhite O(n)是一个上限。它可能是最坏情况、平均情况或最佳情况性能的上限。上限和下限与最佳/平均/最差情况正交。另一个正交尺寸是松与紧。O(n)是一个松散的上界。Θ(n)是一个严格的上限和下限。不想成为一个混蛋或其他什么,但是:为什么不描述它呢?如果我有时间测试,也许吧。我想对该项目运行另一个测试:treeset和hashset之间的运行时变体。如果一天有30个小时,仍然没有足够的时间来做每件事!似乎Trie只支持“从开始”,而不支持“包含”?KMP最坏的情况是O(n+m),因为您需要事先创建lsp表。虽然如此,但即使在最坏的情况下,
n==m
->O(n+m)->O(2n)->O(n)