c# - c#中字符串比较的更快算法

标签 c# algorithm string methods

我有两个句子需要相互比较。 最终结果是一个句子在另一个句子中包含多少百分比,我的问题是我有 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# 程序员,但这里有一些一般性提示:

  1. 将浮点运算移出循环。您应该能够计算出匹配的字符数,然后再进行除法。
  2. 您应该能够在单独的执行线程中运行每个“长”循环,因为数据是静态的。我会为您的“10”个句子中的每一个生成一个单独的线程并并行运行它们。
  3. 如果可以的话,您可能希望删除对split 的调用。基本上,删除任何额外的内存分配。

最后的想法是拿一本算法书或谷歌搜索文本处理算法。这个问题听起来像是已经解决了一遍又一遍的问题。 AOCP v3 中可能有一些东西解决了这个问题。您还可以分析代码(不确定可用的分析器类型),但这可能不会产生实质性改进。

关于c# - c#中字符串比较的更快算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4255837/

相关文章:

php - 数组根据索引删除重复项/保留第一次出现

java - 两个字符串的比较

string - 文档 : Log text selection as string 的 Google Apps 脚本

c# - 明确定义对象时的空引用异常

c# - 以编程方式向 UWP 应用添加按钮

c# - 为什么将结构转换为类似类的工作?

python - 在 Python 中查找文本中所有出现的整数

c# - 通过 Storyboard更改时数据绑定(bind)不更新?

arrays - 和为 k 的子矩阵数

algorithm - QuickSort 的迭代实现中的无限循环?