0

我有一个程序计算两个程序的代码行数(不包括注释、大括号、空格等),然后比较它们。它将一个程序的所有行放在一个列表中,将另一个程序的行放在另一个列表中。然后它会删除两者之间相同的所有行。一个列表是添加到程序 1 以获取程序 2 的所有行,另一个列表是从程序 1 中删除的所有行以获取程序 2。

现在我需要一种方法来检测程序 1 中的多少行代码已被修改以获取程序 2。我找到了 Levenshtein 距离的算法,它似乎可以工作。我只需要将距离与字符串的长度进行比较即可获得百分比变化,并且我需要为阈值提供一个好的值。

但是我的问题是:我怎么知道要比较哪两个字符串来比较 Levenshtein 距离?我最好的猜测是有一个嵌套的 for 循环,并为另一个程序中的每一行循环一次程序,以将每一行与其他每一行进行比较,以寻找满足我的差异阈值的距离。但是,这似乎非常低效。有没有其他方法可以做到这一点?

我应该补充一下,这是针对软件工程课程的。这在技术上是家庭作业,但我们可以使用我们需要的任何资源。虽然我只是在寻找一种算法,但我会让你知道我正在使用 C#。

4

2 回答 2

0

如果您建议将代码行打乱(可以更改它们的顺序),那么您需要将第一个程序的所有行与第二个程序的所有行进行比较,不包括未更改的行。

您可以简化您的任务,建议不能打乱行。它们只能插入、删除或更改。根据我的经验,大多数比较文本文件的程序都是这样工作的

于 2013-11-03T17:04:39.283 回答
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

于 2013-11-03T22:59:19.907 回答