花费太长时间来遍历数组寻找重复项

时间:2013-04-10 21:39:22

标签: c# performance loops

希望你能帮助我。

我有一个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); 
                }
            }

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

非常感谢您给我的任何帮助。

3 个答案:

答案 0 :(得分:0)

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

如果你有完全匹配,你可以先删除它们,这样你的N ^ 2复杂度将减少到(N-K)^ 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();

然后继续你的算法

答案 1 :(得分:0)

如果没有重大改革,你将无法获得更多优化。对于精确匹配或搜索与目标紧密匹配的任何内容,这是微不足道的,但对于对象之间的差异,您必须将每个项目与每个先前项目进行比较。

基本上,如果您获得了一组N字符串,则必须将NN-1N-2N-3等进行比较。然后,除了N+1之外,您还需要将所有再次与<{1}}进行比较,因为NN+1之间没有任何关系。

答案 2 :(得分:0)

经过一些进一步的努力,我已经回到了我自己的问题,并认为我应该发布它,因为其他人也有同样的问题。

我将txt文件转换为mysql数据库,然后将所有记录SELECTED“一次”转换为DataTable。然后代码在原始DataTable中循环记录和SELECT,只将那些具有相同邮政编码和门牌号的记录循环到第二个DataTable中。与原作相比较。

这减少了花费9小时到2到3分钟的过程。事后很明显,但后见之明......

希望能帮助别人。