我实际上必须实现一个字符串比较,最后得到一个匹配百分比(不仅仅是布尔结果匹配/不匹配)。所以,为了做到这一点,我找到了 Levenstein 距离算法。但现在的问题在于性能。例如,我有 1k 个字符串要相互比较,现在大约需要 10 分钟。对于每个我已经并行调用算法,并且在每个算法中再次并行完成。所以我用了伪语言:
Foreach strings
Call in parallel the comparaison method.
内比较法
Foreach stringsToCompare
Call in parallel the Levenstein Distance algo.
在 i5 @ 2.6Ghz 上以 100% 的 CPU 使用率仍然需要 10 分钟...
这是我的实现
public static double GetSimilarity(string firstString, string secondString)
{
if (ReferenceEquals(firstString, null)) throw new ArgumentNullException("firstString");
if (ReferenceEquals(secondString, null)) throw new ArgumentNullException("secondString");
if (firstString == secondString) return 100;
return (1 - GetLevensteinDistance(firstString, secondString) / (double)Math.Max(firstString.Length, secondString.Length)) * 100;
}
private static int GetLevensteinDistance(string firstString, string secondString)
{
if (ReferenceEquals(firstString, null)) throw new ArgumentNullException("firstString");
if (ReferenceEquals(secondString, null)) throw new ArgumentNullException("secondString");
if (firstString == secondString) return 1;
int[,] matrix = new int[firstString.Length + 1, secondString.Length + 1];
for (int i = 0; i <= firstString.Length; i++)
matrix[i, 0] = i; // deletion
for (int j = 0; j <= secondString.Length; j++)
matrix[0, j] = j; // insertion
for (int i = 0; i < firstString.Length; i++)
for (int j = 0; j < secondString.Length; j++)
if (firstString[i] == secondString[j])
matrix[i + 1, j + 1] = matrix[i, j];
else
{
matrix[i + 1, j + 1] = Math.Min(matrix[i, j + 1] + 1, matrix[i + 1, j] + 1); //deletion or insertion
matrix[i + 1, j + 1] = Math.Min(matrix[i + 1, j + 1], matrix[i, j] + 1); //substitution
}
return matrix[firstString.Length, secondString.Length];
}
那么您是否知道类似的算法,它可能更适合长文本比较或高度可并行化?