动态规划—代码查重问题
实验概述
-
掌握动态规划算法设计思想。
-
掌握代码查重问题的动态规划解法。
实验思路
代码查重是一个比较经典的问题,相似的问题有论文查重等等。这里面的算法我也是一知半解,就提供一些思路和资料。
一个查重的经典方法就是动态规划求LCS最长子序列。
和论文查重不同的是,代码查重要考虑变量名、行顺序等等,抄袭代码可能会在这些方面做出改动。常见做法是将代码预处理,包括变量名替换、关键字替换、函数合并、删除#include等等。这部分提供一个思路:使用编译原理解决。具体参考博客c++文件从编译到执行、5分钟,了解一下-编译原理或者自行百度。当然编译原理也是一套很系统很复杂的东西,在这里我们只要稍作了解有所启发即可。
关于代码查重,可以参考《软件加密与解密》这本书,第十章整整一章都在讲软件相似度,提供了许多种算法思路。还有博客专栏代码克隆检测,其中有关于基于k-gram的克隆检测的详细解释。
在书中也描述了基于语法树的方法,算是用到了编译原理。