我需要找到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亿次比较。
我该怎么办呢?有没有办法快速“几乎比较”两个字符串列表?
答案 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)
操作,其中n
是A
中元素的数量而m
是元素的长度。然后,对于B
的每个元素,在后缀Trie中检查它,这也是O(n * m)
操作,其中n
是B
和m
中的元素数量是元素的长度。
答案 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)(其中n
是A
中结果的数量,而m
是B
中结果的数量