比较两个项目列表的最快方法是什么?

时间:2010-03-14 02:22:07

标签: c algorithm scripting

我有两个文件夹,每个文件夹大约有10,000个文件。我想编写一个脚本或程序,可以告诉我这些文件夹是否同步,然后告诉我每个文件夹中缺少哪些文件以使它们同步。

因此,在生成文件列表后,对于唯一文件对它们进行排序的最快算法是什么?我现在想的是比较每个列表上的第一个文件,然后如果它们不同则删除一个直到它们相同,然后从列表中删除它们(因为它们不是唯一的。)

有比这更快的算法吗?

5 个答案:

答案 0 :(得分:8)

diff -s [path1] [path2]

答案 1 :(得分:5)

如果您在C中,请使用qsort()按升序对文件列表进行排序,然后使用一种“合并:

从每个列表的开头开始有两个指针。执行以下操作:

  • 如果名称相同,则此名称存在于两个列表中 - 推进两个指针
  • 如果list1中的名称> list2中的名称,然后列表2是唯一拥有它的名称 - advance list2的指针
  • 否则list1中的名称仅在list1中 - advance list1的指针
  • 重复

当你在其中一个列表的末尾时,另一个列表中剩下的所有元素显然都缺少了第一个。

或者,您可以组合这两个列表,同时跟踪每个元素来自哪个列表。然后对组合列表进行排序。扫描已排序的列表。如果您看到两个具有相同值的实例,那么它就在两个列表中。否则你就会知道它来自哪个列表。

答案 2 :(得分:3)

另外,您可以遵循的另一种方法是

如果空间没有约束,我会把一个文件夹的文件放在哈希中。 这需要O(N)时间和一些空间..! 然后我将获取第二个文件夹的每个文件并检查第一个哈希中是否存在密钥..这又是O(1)时间操作..!问题在O(N)时间内得到解决..但这对空间要求很大..

反向重复相同的操作 取决于你是想要速度还是空间..!

答案 3 :(得分:1)

生成md5或sha1校验和并比较它们。 像这样的东西

cd dir1; md5sum * | sort > /tmp/hash1
cd dir2; md5sum * | sort > /tmp/hash2
diff /tmp/hash1 /tmp/hash2  # could also use comm

如果你只是担心名字,而不是文件的内容,那么diff dir1 dir2就可以了。

答案 4 :(得分:1)

如果您需要此信息来同步它们,您可以一次性进行比较和复制:

  • 从两个目录中获取目录列表
  • 按字典顺序对两个列表进行排序
  • 同时循环遍历两个列表:
    • 如果其中一个列表为空,请停止循环
    • 如果两个元素都相同:步骤两个索引
    • 否则采用按字典顺序排列的较低元素,将其复制并仅执行此索引
  • 复制非空列表的任何剩余元素(如果存在)

如果你想两次通过,或者需要将被复制的信息放在哪里,用“将名称和方向放入结果列表”替换“复制”。