[英]Is there a more efficient way to assess containment of strings?
我必须执行这行数百万次,我想知道是否有一种方法可以优化它(可能预先计算一些东西?)。
a.contains(b) || b.contains(a)
谢谢
编辑:contains方法执行的代码已经检查了a.length <b.length。
public static int indexOf(byte[] value, int valueCount, byte[] str, int strCount, int fromIndex) {
byte first = str[0];
int max = (valueCount - strCount);
for (int i = fromIndex; i <= max; i++) {
[...]
}
return -1;
}
据我了解的任务,你必须检查是否a
包含b
或者反之为每对a
和b
从一组约35万字。 这要检查很多对。
你应该能够通过预先计算一个单词包含的n-gram来缩小搜索范围:如果a
包含一些n-gram,那么如果b
包含a
,则b
必须包含相同的n-gram。 你可以预先计算列表中每个单词所包含的所有三元组,同时预测包含给定三元组的所有单词,然后你可以只查找那些字典中的单词并使用一些集合操作得到一小组考生要正确检查。
在伪代码中:
Map<String, Set<String>> ngram_to_word
a
a
a
至集包含这些的n-gram中的单词ngrams_to_words
a
a
包含 ngrams_to_words
获取包含该n-gram的ngrams_to_words
b
在该交叉点包含所有的n-gram的是a
包含(但也许以不同的顺序或数量),正确地检查是否b
包含a
根据那些n-gram中的字母数量(例如bigrams,trigrams,......),在时间和空间上预计算的成本会更高,但效果也会更大。 在最简单的情况下,您甚至可以预先计算哪些单词包含给定的字母(即“1-gram”); 这应该是快速的,已经相当缩小了要检查的词。 当然,正克不应该比最短的在数据集中的话短,但你甚至可以使用两个长度为N-克,例如使用两个地图letter_to_words
和trigrams_to_words
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.