我有一个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);
}
}
这意味着程序必须一次又一次地遍历数组中的每个数组项。我的问题是,有更快/更好的方法吗?
非常感谢您给我的任何帮助。
答案 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
字符串,则必须将N
与N-1
,N-2
,N-3
等进行比较。然后,除了N+1
之外,您还需要将所有再次与<{1}}进行比较,因为N
和N+1
之间没有任何关系。
答案 2 :(得分:0)
经过一些进一步的努力,我已经回到了我自己的问题,并认为我应该发布它,因为其他人也有同样的问题。
我将txt文件转换为mysql数据库,然后将所有记录SELECTED“一次”转换为DataTable。然后代码在原始DataTable中循环记录和SELECT,只将那些具有相同邮政编码和门牌号的记录循环到第二个DataTable中。与原作相比较。
这减少了花费9小时到2到3分钟的过程。事后很明显,但后见之明......
希望能帮助别人。