我正在研究大型二进制文件.我已经实现了着名的Myers Diff算法,它可以产生最小的差异.但是,它是O(ND),所以为了区分两个非常不同的1 MB文件,我预计需要100万平方= 1万亿.这不好!
我想要的是一种产生潜在非最小差异的算法,但速度要快得多.我知道必须存在,因为Beyond Compare会这样做.但我不知道怎么做!
可以肯定的是:有像xdelta或bdiff这样的工具,但这些工具会产生一个用于计算机消耗的补丁,这与人类消耗差异不同.补丁涉及将一个文件转换为另一个文件,因此它可以执行诸如从文件的先前部分进行复制之类的操作.人类消耗品差异在那里可视地显示差异,并且只能插入和删除.例如,这个转换:
"puddi" - >"puddipuddipuddi"
会产生一小部分"复制[0,4]到[5,9]和[10,14]",但更大的差异是"追加'puddipuddi'".我对产生更大差异的算法感兴趣.
谢谢!
Diffing 基本上与生物信息学中用于对齐 DNA 序列的算法相同。这些序列通常很大(数百万或数十亿个核苷酸长),MUMmer程序使用了一种在较长基因组上运行良好的策略:
每当没有太多差异时,这往往会提供一组非常好的(虽然不能保证最佳)对齐区域(或等效地,一组非常小的差异)。我不确定每个步骤的确切时间范围,但我知道没有n^2或更高的条款。
我相信 MUMmer 程序需要 DNA 或蛋白质序列,所以它可能不适合你,但这些概念肯定适用于一般字符串(例如文件),所以如果你准备自己重新实现它,我会推荐这种方法.