[英]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.