繁体   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