是否存在保留线所有权的差异算法

我的目标是提供一个脚本来跟踪一条线被添加的点,即使该线随后被修改或移动(这两者都混淆了传统的vcs’怪’脚本.我做了一些小的背景研究(见底部)但是没有找到任何有用的东西.我有一个关于如何进行的概念,但运行时会很糟糕(涉及到一个因子).

这两个缺失的功能是跟踪编辑就地线,与该线的删除和添加分开,并跟踪移动的整个功能,因此它们处于不同的状态.对于那些经历过差异但不熟悉术语的人来说,子序列是一组连续的或 – 行,其类型为delete(all – ),add(all)或replace(组合).我需要更多关于移动和就地编辑的信息,在c2: DiffAlgorithm的一个条目中含糊不清地提到(段落以“我最喜欢的模式”开头).有谁知道那是什么? (似乎是基于Tichy,见底部.)

以下是有关这两个缺失功能​​的更多信息:

>没有线上变化的概念,(第四种类型,就像编辑就地).在这个大块中,’bc’的父级是’b’但是’d’是新的并且不是’b’的后代:

 a
-b
+bc
+d

如果编辑的位置相同(只是markup_instraline_changes的扩展版本,但比较旧线和新线的所有大小相等的子集上的编辑距离),解决方法并不太复杂.

>没有保留线路所有权的“移动”代码的概念,例如:虽然它的位置发生了变化,但这种差异不应该改变“线”的所有权.

 a
-line
 c
+line

这可以用相同的方式处理,但运行时间要差得多(而不是只检查标记为’replace’的单个块,你需要检查所有添加的所有删除线之间的Levenshtein距离)和可能的误报(有些,像只有空白的行,与我的问题无关).

我做过的研究:阅读gestalt pattern matching(Ratcliff和Obershelp,用于Python的difflib)和An O(ND) Difference Algorithm and its Variations(EW Myers).

在发布问题之后,我发现Tichy84的引用似乎是The string-to-string correction problem with block moves(我还没有读过),根据Walter Tichy的论文一年后on RCS

最佳答案 您似乎对原点跟踪感兴趣,跟踪线来自哪里.

理想情况下,您可以让编辑器记住编辑内容,并将编辑内容与文本存储在存储库中,从而轻松解决问题,但我们这些软件工程师似乎都不够聪明,无法实现这个简单的想法.

作为弱替代品,人们可以从存储库中查看一系列源代码修订,并重建“合理的”变更历史.这就是你似乎通过提出使用“diff”来做的事情.正如你所指出的,diff并不理解“移动”或“复制”的想法.

SD Smart Differencer工具通过根据文本的语言解析文本来比较源文本,发现代码结构,并根据编程语言结构(标识符,表达式,语句,块,类……)计算最小Levensthein差异抽象编辑运算符“插入”,“删除”,“复制”,“移动”和“重命名范围内的标识符”.它们会产生类似差异的输出,因为它们会告诉你行/列,所以会更加丰富一些 – >具有不同编辑操作的行/列.

显然,在跟踪特定行(以及特定语言结构)方面,“移动”和“复制”编辑是您最感兴趣的.我们的经验是代码也经历了大量的复制和编辑,我怀疑这不会给你带来惊喜.

这些工具是Beta版,目前可用于COBOL,Java和C#.许多其他语言都在管道中,因为SmartDifferencer建立在语言参数化基础设施DMS Software Reengineering Toolkit之上,该基础设施具有相当多的现有的,强大的语言语法.

点赞