C# 在数组中循环查找重复项所需的时间太长

C# 在数组中循环查找重复项所需的时间太长,c#,performance,loops,C#,Performance,Loops,希望你能帮助我 我有一个135.000行长的txt文件,其中包含这样的行:111706469;1972WE;26;Wel 程序应该做的是,将每一行与它之前的每一行进行比较,找出它们是否有超过80%的相似性,然后说明原始行的行号 这些事情我都是自己一个人做的 if (rows.Length > 1) { for (int rowIndex = 1; rowIndex < rows.Length; rowIndex++)

希望你能帮助我

我有一个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); 
                }
            }
if(rows.Length>1){
对于(int-rowIndex=1;rowIndex80)
{
cols+=“;”+DupIndex;
L=真;
打破
}  
}
Console.WriteLine(行索引+“;”+cols);
}
}
这意味着程序必须对每个数组项一次又一次地遍历数组。我的问题是,有没有更快/更好的方法


如果您能给我任何帮助,我将不胜感激。

问题在于您的模糊匹配,它返回一个浮点数-没有任何关于模糊函数本身的细节,没有比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();
列表行=新列表(新[]{“AAA”、“BBB”、“AAA”、“CCC”});
HashSet foundLines=新的HashSet();
foreach(行中的字符串行){
如果(!foundLines.Contains(行))
foundLines.Add(行);
}
rows=foundLines.ToList();

然后继续你的算法

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


基本上,如果给您一组
N
字符串,您必须将
N
N-1
N-2
N-3
,等等进行比较。然后,除了
N
,您还需要将它们与
N+1
进行再次比较,因为
N+1
N

之间没有关系,经过进一步的努力,我找到了我自己的问题的答案,我想我应该把它贴出来,以防其他人也有同样的问题

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

这将耗时9小时的过程缩短为2到3分钟。事实上,这是很明显的,但这是事后诸葛亮


希望它能帮助别人。

只需将以前遇到的所有字符串存储在字典中,而不是反复查找。这将使您的算法在O(N)而不是O(N*N)@Alexander中运行-这应该是一个答案。这里的难点是比较法,这意味着不精确匹配。您不能只将所有内容存储在字典中并进行精确匹配。也许Compare的实现可以提供一些启示。你如何发现字符串的相似性?是精确的位置匹配,还是有一些复杂的解析,可能是汉明距离?@Alexander-哦,点。可能是使用?我确实理解如果这条线是另一条线的80%,这会给他带来什么?@AlwaysLearning啊,你是对的-模糊比较=不好