簡體   English   中英

C# - 兩個大字符串數組的模糊比較

[英]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)操作,其中nA中元素的數量, m是元素的長度。 然后,對於B每個元素,在后綴Trie中檢查它,它也是O(n * m)操作,其中nB中元素的數量, 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) (最差)的區域 (其中nA中結果的數字, mB中結果的數量)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM