Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 代码匹配算法_Java_Algorithm - Fatal编程技术网

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

我有两个java源代码文件,它们做相同的事情,提供相同的输出。它们所包含的代码略有不同,如下例所示。我需要一个算法来确定这两个java代码文件之间的相似性(相同性)

示例

/* 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字节左右的范围内是可行的: