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)