我有两个句子需要相互比较。 最终结果是一个句子在另一个句子中包含多少百分比,我的问题是我有 100.000 条记录需要与另外 10 条记录进行比较。 那是 1.000.000 次循环,这在我的算法中非常慢。
这是我正在使用的算法:
private double BreakStringsAndCheck(string s1, string s2)
{
if (s1 == null || s2 == null || s1.Length == 0 || s2.Length == 0)
return (double)0;
string[] firstArray = s1.Split(' ');
string[] secondArray = s2.Split(' ');
if (firstArray.Length > secondArray.Length)
{
string[] tempArray = firstArray;
firstArray = secondArray;
secondArray = tempArray;
}
double value = 0;
for (int i = 0; i < firstArray.Length; i++)
for (int j = 0; j < secondArray.Length; j++)
value += firstArray[i] == secondArray[j] ? (double)100 : (double)0;
return findLongest ? value : value / firstArray.Length;
}
这是一个小方法,但速度不是很快。根据我的测试,我可以在 1 秒内进行 40-60 次比较,对于 1.000.000 次循环来说,这将近 5 个小时。
有人能想到另一种比这快得多的方法或逻辑吗?
更新:
我会尝试更详细地解释问题。 我有超过 100.000 条记录的数据库,每天我都会插入并比较该数据库中的 10-20 条新记录。 这些记录是 2 到 10 个单词的句子,我需要编写快速方法来将这个新记录与数据库中的记录进行比较,结果应该是一个句子包含另一个句子的单词的百分比。
我需要单词匹配度超过 70% 的记录。
我希望我现在清楚了。
最佳答案
我不是 C# 程序员,但这里有一些一般性提示:
- 将浮点运算移出循环。您应该能够计算出匹配的字符数,然后再进行除法。
- 您应该能够在单独的执行线程中运行每个“长”循环,因为数据是静态的。我会为您的“10”个句子中的每一个生成一个单独的线程并并行运行它们。
- 如果可以的话,您可能希望删除对
split
的调用。基本上,删除任何额外的内存分配。
最后的想法是拿一本算法书或谷歌搜索文本处理算法。这个问题听起来像是已经解决了一遍又一遍的问题。 AOCP v3 中可能有一些东西解决了这个问题。您还可以分析代码(不确定可用的分析器类型),但这可能不会产生实质性改进。
关于c# - c#中字符串比较的更快算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4255837/