0

希望你能帮帮我。

我有一个 135.000 行长的 txt 文件,其中包含如下行:111706469;1972WE;26;Wel.

程序应该做的是将每一行与它之前的每一行进行比较,以确定它是否超过 80% 相似,然后说明原始行的行号。

像这样我自己设法做的那些事情。

            if (rows.Length > 1) {
                for (int rowIndex = 1; rowIndex < rows.Length; rowIndex++) 
                {
                    string cols = rows[rowIndex];
                    bool Dubbel = false;

                    for (int DupIndex = 0; DupIndex < rowIndex; DupIndex++)
                    {
                        string SearchDup = rows[DupIndex];
                        decimal ComparisonResult = Compare(cols, SearchDup);

                        if (ComparisonResult > 80)
                        {
                            cols += ";" + DupIndex;
                            Dubbel = true;
                            break;
                        }  
                    }

                    Console.WriteLine(rowIndex + ";" + cols); 
                }
            }

这意味着程序必须为每个数组项一次又一次地遍历数组。我的问题是,有没有更快/更好的方法来做到这一点?

您能给我的任何帮助将不胜感激。

4

3 回答 3

0

问题在于您的模糊匹配,它返回一个浮点数 - 如果没有关于模糊函数本身的任何细节,没有办法比 O(N*N) 更好地优化它(如果我错了 - 请有人纠正我)

如果您有完全匹配,您可以先删除它们,这样您的 N^2 复杂性将减少到 (NK)^2 - 如果您至少有一些完全匹配,那么这个操作将是值得的。

使用HashSet<>,它不需要像第二个对象Dictionary

List<string> rows = new List<string>(new[] {"AAA","BBB","AAA","CCC"});

HashSet<string> foundLines = new HashSet<string>();

foreach (string row in rows){
if (!foundLines.Contains(row))
    foundLines.Add(row);
}
rows = foundLines.ToList();

然后继续你的算法

于 2013-04-10T21:47:04.833 回答
0

如果不进行重大检修,您将无法获得太多优化。对于完全匹配或搜索与目标非常匹配的任何内容,这将是微不足道的,但对于对象之间的差异,您必须将每个项目与之前的每个项目进行比较。

基本上,如果给定一组N字符串,则必须与N, N-1,N-2等进行比较。然后您需要再次N-3将它们与, 除了 进行比较,因为和之间没有关系。N+1NN+1N

于 2013-04-10T21:54:19.313 回答
0

经过进一步的努力,我找到了自己问题的答案,并认为我应该发布它,以防其他人遇到同样的问题。

我将 txt 文件转换为 mysql 数据库,然后将所有记录选择一次到 DataTable 中。然后代码循环遍历原始数据表中的记录和 SELECT,仅将具有相同邮政编码和门牌号的那些记录循环到第二个数据表中。与原件进行比较。

这将需要 9 小时的过程减少到 2 到 3 分钟。事后很明显,但这是事后诸葛亮……

希望它可以帮助某人。

于 2013-04-13T00:33:11.887 回答