我正在寻找合适的算法来比较两个文件。diff
我认为我可以比由于一些额外的限制做得更好。
我拥有的是两个文本文件,每个文件都包含一个文件列表。它们是在两个不同时间拍摄的系统上所有文件的快照。我想弄清楚在两个快照之间添加或删除了哪些文件。
我可以diff
用来比较这些文件,但我不想这样做,因为:
diff
尝试将更改组合在一起,查找文件中的哪些块已更改。我只是在寻找一个已经改变的行列表,这应该比找到最长的公共子序列或类似的东西要简单得多。广义差异算法在运行时或空间上是O(mn) 。我正在寻找更像时间上的O(m+n)和空间上的O(1)的东西。
以下是该问题的限制条件:
两个文件中的文件列表顺序相同。它们不一定按字母顺序排列,但它们的相对顺序相同。
大多数情况下,列表之间不会有任何差异。如果存在差异,通常只会有少数新/删除的文件。
我不需要将结果组合在一起,比如说“整个目录已被删除”或“第 100-200 行是新的”。我可以单独列出不同的每一行。
我认为这相当于拥有两个排序列表并试图找出两个列表之间的差异的问题。问题是列表项不一定按字母顺序排序,因此您不知道一项是否比另一项“更大”。您只知道两个列表中存在的文件的顺序相同。
对于它的价值,我几年前曾在Ask Metafilter上发布过这个问题。请允许我预先回答几个可能的答案。
答:这个问题称为最长公共子序列。
回应:我试图避免最长的公共子序列,因为简单的算法在O(mn)时间/空间中运行,而更好的算法更复杂且更“启发式”。我的直觉告诉我,由于添加了约束,所以存在线性时间算法。
答:按字母顺序排列,然后比较。
响应:那将是O(m log m+n log n),这比O(m+n)差。