C# - 两个大字符串数组

时间:2016-07-12 14:56:33

标签: c# string linq loops compare

我需要找到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亿次比较。

我该怎么办呢?有没有办法快速“几乎比较”两个字符串列表?

3 个答案:

答案 0 :(得分:5)

仅仅比较子字符串就足够了,这会更有效:

var C = B.Where(s1 => A.Any(s2 => s1.IndexOf(s2, StringComparison.OrdinalIgnoreCase) >= 0)).ToList();

答案 1 :(得分:4)

这似乎很好地使用了Suffix Trie

后缀Trie是一棵没有负载的树。它索引给定字符串或句子的所有后缀,以便可以在O(n)时间内搜索它们。因此,如果您在A中的输入是" hello",它将索引" hello"," ello"," llo" ," lo"和" o"以某种方式允许立即有效地查找任何这些子串,而无需对A的集合进行任何额外的枚举。

基本上,取A中的所有值并将其处理为后缀Trie,这是一次O(n * m)操作,其中nA中元素的数量而m是元素的长度。然后,对于B的每个元素,在后缀Trie中检查它,这也是O(n * m)操作,其中nBm中的元素数量是元素的长度。

答案 2 :(得分:3)

我想你可能还在考虑它:

List<string> results = new List<string>();
foreach (string test in B)
{
   if (A.Any(a => test.Contains(a))
      results.Add(test);
}

BTW complexity of this is somewhere in the region of O(n)(best) and O(n*m)(worst)(其中nA中结果的数量,而mB中结果的数量