簡體   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