繁体   English   中英

有没有更有效的方法来评估字符串的遏制?

[英]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或者反之为每对ab从一组约35万字。 这要检查很多对。

你应该能够通过预先计算一个单词包含的n-gram来缩小搜索范围:如果a包含一些n-gram,那么如果b包含a ,则b必须包含相同的n-gram。 你可以预先计算列表中每个单词所包含的所有三元组,同时预测包含给定三元组的所有单词,然后你可以只查找那些字典中的单词并使用一些集合操作得到一小组考生要正确检查。

在伪代码中:

  • 选择n-gram的大小(见下文)
  • 初始化Map<String, Set<String>> ngram_to_word
  • 第一次迭代:对于数据集中的每个单词a
    • 遍历所有的n-gram(例如,使用某种形式的滑动窗口的)的a
    • 对于每个,添加a至集包含这些的n-gram中的单词ngrams_to_words
  • 第二次迭代:对于数据集中的每个单词a
    • 再次让所有的n克a包含
    • 对于每一个,从ngrams_to_words获取包含该n-gram的ngrams_to_words
    • 得到那些单词集的交集
    • 对每个字b在该交叉点包含所有的n-gram的是a包含(但也许以不同的顺序或数量),正确地检查是否b包含a

根据那些n-gram中的字母数量(例如bigrams,trigrams,......),在时间和空间上预计算的成本会更高,但效果也会更大。 在最简单的情况下,您甚至可以预先计算哪些单词包含给定的字母(即“1-gram”); 这应该是快速的,已经相当缩小了要检查的词。 当然,正克不应该比最短的在数据集中的话短,但你甚至可以使用两个长度为N-克,例如使用两个地图letter_to_wordstrigrams_to_words

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM