【发布时间】:2014-10-07 00:59:51
【问题描述】:
我正在尝试提高我拥有的 Java 函数的性能,该函数用于确定给定的搜索字符串是否包含集合中 >0 的字符串。这看起来像是过早的优化,但该函数被称为 A LOT,因此任何加速都会非常有益。
目前的代码如下所示:
public static boolean containsAny(String searchString, List<String> searchCollection) {
int size = searchCollection.size();
for (int i = 0; i < size; i++) {
String stringInCollection = searchCollection.get(i);
if (!Util.isNullOrEmpty(stringInCollection)) {
// This is a performance optimization of contains.
if (searchString.indexOf(stringInCollection, 0) > -1) {
return true;
}
}
}
return false;
}
该列表通常包含大约 30 个元素,并且在每次调用之间多次重复使用相同的集合。
上面的代码是一个非常简单的线性搜索。我认为除非我们更改数据结构以使其优于 O(n),否则它不会有显着改善。是否有任何数据结构可以让我做到这一点?
【问题讨论】:
-
选择另一个数据结构来存储你的字符串。例如,
Map<Character, List<String>>的键是 abecedarium 的字母,List<String>包含以用作键的字符开头的单词的排序列表。或使用trie。 -
它们主要用于那个,是的。我不确定它们的适用性。这让我想到了Longest common substring problem,它可以用后缀树有效地解决。它不是现货,但可以使用。
-
你的琴弦有多大?
-
查看Aho Corasick。你必须构造一个状态机,但之后搜索很快。
-
我已经对当前建议进行了一些性能测量,您当前的代码显示出比我提出的更好的性能,甚至比 @Joop 基于正则表达式模式的更好(即使模式被缓存)。
标签: java string data-structures collections