Java 代码匹配算法
我有两个java源代码文件,它们做相同的事情,提供相同的输出。它们所包含的代码略有不同,如下例所示。我需要一个算法来确定这两个java代码文件之间的相似性(相同性) 示例Java 代码匹配算法,java,algorithm,Java,Algorithm,我有两个java源代码文件,它们做相同的事情,提供相同的输出。它们所包含的代码略有不同,如下例所示。我需要一个算法来确定这两个java代码文件之间的相似性(相同性) 示例 /* First file */ public int inc (int n) { return ++n; } /* Second file */ public int inc (int n) { return (n+1); } 是否有一种算法可以显示这两个文件做相同的事情 提前感谢正如艾伦·图灵(Alan
/* First file */
public int inc (int n) {
return ++n;
}
/* Second file */
public int inc (int n) {
return (n+1);
}
是否有一种算法可以显示这两个文件做相同的事情
提前感谢正如艾伦·图灵(Alan Turing)在近一个世纪前所证明的那样,不存在能够确定函数的求值是否会在有限时间内完成的通用算法(参见停止问题)
这意味着没有通用的算法可以决定两段代码是否具有相同的输出。另一方面,如果你假设函数总是在有限时间内完成,那么一个简单的算法可以满足你的需要,它只是简单地为所有可能的输入运行有问题的代码。不幸的是,没有这样的算法存在 为什么??见: 特别是标有“等价问题不可判定”的部分
为了真正理解为什么熟悉可判定性、图灵机和各种其他类型的自动机会有帮助,忽略所有复杂的细节,这里有一个简单的学校级算法 测试1:首先计算两个程序中使用的变量数量。查看它们之间的差异,并根据您的需要和正在比较的程序确定通过测试的阈值差异 测试2:然后确定两个程序中最多使用次数的变量的数据类型,如果数据类型不同,则在大多数情况下,程序会不同,但情况并非总是如此 测试3:您可以比较它们的圈复杂度。这也有助于确定相似性,因为它告诉您程序中独立路径的数量 可以进行更多的测试,如比较块或函数调用的数量,您可以将相似性比率设置为等于通过测试的百分比
当然,这个算法很幼稚,会有失败的测试用例,但从基本知识和一开始,我认为它应该可以做得很好。如果您希望编写一个检测类似工作的程序,您可以尝试搜索软件
Turnitin
的工作方式
虽然不可能得出一个适用于所有情况的算法。您可以采用一些变通解决方案
x++
类似于x++=1
,x=x+1
,++x
等等。但是请注意,有时x++
和++x
在编码中的含义完全不同。因此,您的程序永远无法100%准确地判断相似性x=(x+2)-1
,而不是编写x++
,这意味着同一件事,无论同义词数据库有多大,你都无法理解这一点
您可以始终检查输出,查看其是否相同。同样的事情可以通过多种方式实现。这取决于如何实际实施它。在一般情况下,确定两个程序(对于所有输入)是否做相同的事情是一个无法确定的问题(我相信)。不过,在特定情况下,您可能会做得更好。例如,如果你能证明你的代码没有副作用(即是纯的),那么你可以对所有的输入值使用暴力并进行比较。这取决于你的程序做什么。如果它们生成了一些文本输出(或者结果是偶数),您可以随时比较结果。否则-只需将代码与BeyondCompare进行比较即可。是的,但我如何理解我没有打印结果。@ErionLika:print It假设“所有可能的输入”集合是有限的。考虑字符串/输入流/网络连接作为一个反例。@ OliverCharlesworth,我们甚至不需要走那么远---它停止在20字节左右的范围内是可行的: