比较文件以识别祖先&原始来源

时间:2014-04-04 01:25:24

标签: algorithm language-agnostic diff

假设我有100个文件,其中10个是原件,其余是修订版和/或原件组合(想象一下git树)。给定任何后代文件,如何识别最可能是原始源的文件?如果有100万份文件,流程是否会改变? 100米文件?

(这不是作业 - 只是一个无法通过谷歌找到正确方法的非程序员;)

2 个答案:

答案 0 :(得分:3)

这听起来像是申请phylogenetic tree-building methods的完美之地!这些已被用于recover a history of the Bible

我建议从像Neighbour Joining这样的方法开始,它非常快(立方 - 是的,这在这类方法中被认为是快速的)并且相当准确。它只需要一个距离矩阵:对于n个文件,这是一个n * n数字表,每个表给出一对文件之间的距离。可以按照您想要的任何方式计算距离,但有些距离比其他距离更有意义。 diff file1 file2|wc -c是计算两个文件之间距离的一种粗略方法。

一个警告:许多系统发育方法,包括邻居加入,构建无根树 - 也就是说,它们不能推断祖先,而只能推断出与不同项相关的树结构(称为分类单元当它们是生物物种或个体时)。不过,这应该足以帮助您找到根。更复杂的最大似然模型有时可以推断出根树,但这些模型往往是针对DNA随时间演变的具体情况而定。

答案 1 :(得分:2)

两个主要构建块:

文件之间的距离

一种方法是将两个文件视为两个(大)字符串,并计算它们之间的编辑距离。请参阅http://en.wikipedia.org/wiki/File_comparison为了快速确定两个文件是否不同,您可以尝试对它们执行md5sum哈希。

集群类似文件

然后,类似文档,即它们之间编辑距离较短的文档,可能聚集。请参阅http://en.wikipedia.org/wiki/Document_clusteringhttp://en.wikipedia.org/wiki/K-means_algorithm等。

注意

这不直接识别文件之间的祖先关系。我相信,如果没有额外的数据,就不可能得出这一点,因为较新的版本可能比以前的版本更大,更小或不同。我们希望同一文件的不同版本具有相对较小的编辑距离并且会聚集在一起。