[英]C# - Fuzzy compare of two large string arrays
我需要在B中找到“部分”存在於A中的所有字符串。
B = [ "Hello World!", "Hello Stack Overflow!", "Foo Bar!", "Food is nice...", "Hej" ]
A = [ "World", "Foo" ]
C = B.FuzzyCompare(A) // C = [ "Hello World!", "Foo Bar!", "Food is nice..." ]
我一直在研究使用Levenshtein Distance Algorithm
來解決問題的“模糊”部分,以及使用LINQ進行迭代。 但是,A * B通常會導致超過15億次比較。
我該怎么辦呢? 有沒有辦法快速“幾乎比較”兩個字符串列表?
也許僅僅比較子串就足夠了,這會更有效:
var C = B.Where(s1 => A.Any(s2 => s1.IndexOf(s2, StringComparison.OrdinalIgnoreCase) >= 0)).ToList();
這似乎是一個很好的使用后綴Trie 。
后綴Trie是一棵沒有有效載荷的樹。 它索引給定字符串或句子的所有后綴,以便可以在O(n)時間內搜索它們。 因此,如果您在A
中的輸入是“hello”,它將以一種允許任何這些子串立即有效的方式索引“hello”,“ello”,“llo”,“lo”和“o”查找沒有任何額外的A
集枚舉。
基本上,取A
所有值並將它們處理成后綴Trie,這是一次O(n * m)
操作,其中n
是A
中元素的數量, m
是元素的長度。 然后,對於B
每個元素,在后綴Trie中檢查它,它也是O(n * m)
操作,其中n
是B
中元素的數量, m
是元素的長度。
我想你可能還在考慮其他問題:
List<string> results = new List<string>();
foreach (string test in B)
{
if (A.Any(a => test.Contains(a))
results.Add(test);
}
BTW的復雜性在O(n)
(最好)和O(n*m)
(最差)的區域 (其中n
是A
中結果的數字, m
是B
中結果的數量)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.