【发布时间】:2013-03-14 19:31:38
【问题描述】:
我正在开发一个程序,例如,它能够找到文件夹之间的文件差异。我制作了一种遍历给定文件夹的文件夹结构并为每个子文件夹构建树的方法。每个节点都包含一个文件列表,即该文件夹中的文件。每个节点都有一定数量的子节点,对应于该文件夹中的文件夹。
现在的问题是找到存在于一棵树中的文件,而不是存在于另一棵树中的文件。我有一个方法:“private List Diff(Node index1, Node index2)”,应该这样做。但问题是我比较树木的方式。比较两棵树需要大量时间 - 当每个输入节点包含大约 70,000 个文件时,Diff 方法大约需要 3-5 分钟才能完成。
我目前正在这样做:
private List<MyFile> Diff(Node index1, Node index2)
{
List<MyFile> DifferentFiles = new List<MyFile>();
List<MyFile> Index1Files = FindFiles(index1);
List<MyFile> Index2Files = FindFiles(index2);
List<MyFile> JoinedList = new List<MyFile>();
JoinedList.AddRange(Index1Files);
JoinedList.AddRange(Index2Files);
List<MyFile> JoinedListCopy = new List<MyFile>();
JoinedListCopy.AddRange(JoinedList);
List<string> ChecksumList = new List<string>();
foreach (MyFile m in JoinedList)
{
if (ChecksumList.Contains(m.Checksum))
{
JoinedListCopy.RemoveAll(x => x.Checksum == m.Checksum);
}
else
{
ChecksumList.Add(m.Checksum);
}
}
return JoinedListCopy;
}
Node 类看起来像这样:
class Node
{
private string _Dir;
private Node _Parent;
private List<Node> _Children;
private List<MyFile> _Files;
}
【问题讨论】:
-
您能否(或您是否)在比较条目之前对其进行排序? IIRC,排序的集合通常在搜索方面提供更好的性能。
-
@KennethK。并且基于散列的结构提供比排序集合更快的搜索。
-
@Servy 同意。但是正在使用
List。据我所知,列表没有散列。为了散列,是否需要使用新的数据结构(例如Dictionary或HashTable)? *edit 我想你可以为现有列表编写一个散列函数,因为List是可索引的。 -
@KennethK。是的。实际上,您将节省 很多 时间,根据列表中的内容创建新的基于哈希的结构,然后搜索列表 N 次。
-
您的代码将如何处理包含多个文件副本的单个文件夹。我不得不承认我不知道关于校验和的所有信息,但是文件 a.txt 和 a.txt 的副本是否具有相同的校验和,因为它们在除名称和物理磁盘位置之外的所有方面都是相同的吗?
标签: c# list tree duplicate-removal set-difference