我有一个程序可以对两个程序的代码行(不包括注释,大括号,空格等)进行计数,然后对它们进行比较。它将一个程序中的所有行放在一个列表中,将另一个程序中的行放在另一个列表中。然后删除两者之间相同的所有行。然后将一个列表添加到程序1以获取程序2,另一个列表是从程序1中删除的所有行以获取程序2.
现在我需要一种方法来检测程序1中有多少行代码已被修改以获得程序2.我找到了Levenshtein距离的算法,看起来这样可行。我只需要将距离与字符串的长度进行比较以获得更改的百分比,并且我需要为阈值提供一个很好的值。
然而我的问题是:我如何知道Levenshtein距离要比较哪两个字符串?我最好的猜测是有一个嵌套的for循环,并在另一个程序中为每一行循环一次,将每一行与每一行进行比较,寻找符合我的差异阈值的距离。但是,这似乎效率很低。有没有其他方法可以做到这一点?
我应该将其添加到软件工程类中。这是技术上的功课,但我们可以使用我们需要的任何资源。虽然我只是在寻找算法,但我会告诉你我正在使用C#。
答案 0 :(得分:0)
如果你建议改变代码行(它们的顺序可以改变),那么你需要比较第一个程序中的所有行和第二个程序中除了没有改变的行之外的所有行。
您可以简化任务,建议无法对线路进行洗牌。它们只能插入,删除或保持不变。根据我的经验,大多数比较文本文件的程序都是这样工作的
答案 1 :(得分:0)
如果您允许洗牌,您如何计算更改?并非所有混洗行都可能导致相同的功能,即使您比较所有行并找到完全匹配。
如果比较
var random = new Random();
for (int i = 0; i < 9; i++) {
int randomNumber = random.Next(1, 50);
}
到
for (int i = 0; i < 9; i++) {
var random = new Random();
int randomNumber = random.Next(1, 50);
}
您有四行未更改的代码行,但第二个版本可能会产生不同的结果。代码中有肯定更改,但如果允许改组,则逐行比较将无法检测到它。
这是禁止改组的一个很好的理由,并且实际上将第一个代码中的第1行标记为已删除,并将第二个代码中的第2行标记为已添加,即使删除的行和添加的行完全相同。
一旦你自杀,线条无法改组,我想你可以很容易地弄清楚如何匹配你的线条进行比较。
要逐步浏览两个来源并比较您可能想要查找平衡线算法的行(例如http://www.isqa.unomaha.edu/haworth/isqa3300/fs006.htm)