- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序代码相似度评判系统的设计与实现.doc
程序代码相似度评判系统的设计与实现
摘 要:程序代码相似性的识别是利用一定的检测识别手段,判断两个源程序代码之间的相似性,并度量两个程序代码之间的相似程度。代码抄袭是程序设计课程中频繁出现的一种作弊行为,检测源代码的抄袭对验证学生程序作业的独创性非常重要。本文针对计算机教学考核中对程序设计客观性和真实性的要求,应用最长公共子序列算法来对比两个源程序文件在结构上的相似性,同时设计可用于教学考核的程序代码相似度评判系统。
关键词:源代码;相似度评判;抄袭检测;最长公共子序列
中图分类号:TP309
程序代码相似性度量技术主要用于代码的抄袭检测上,主要来确定一个程序是否是通过复制另外一个程序得来。在本质上,本技术是通过对这两个程序代码的相似度进行分析衡量,根据衡量的结果给出一个相似度的数值表示,然后由此数值来判断这两个程序是否存在互相抄袭的现象。程序代码的相似性度量算法主要研究如何更准确地把程序的结构用字符串形式表示,并选择一个快速的、有效的字符串匹配算法,以提高相似性度量的准确性,同时尽量减少代码相似性度量算法的复杂度。
1 最长公共子串程序代码相似度评判方法
最长公共子串指的是给定的一组字符串的长度最大的共有的子字符串。若将字符串看成是由若干个子串组成,则两个字符串中存在的相同的子串就是它们的公共子串,因而,它们的相似度可用所有公共子串的长度占整个串的百分比表示。
LCS算法的具体实现过程主要可以分为以下两个部分:
(1)
(2)
Xi=?x1,…,xi?即X序列的前i个字符(1≤i≤m)(前缀);
Yj=?y1,…,yj?即Y序列的前j个字符(1≤j≤n)(前缀);
Length(i,j)表示Xi和Yj的最长公共子序列的长度。
(1)求出最长公共子序列的长度Length(i,j)
利用最长公共子序列问题的子问题重叠性质,定义一个标志位数组变量f(i,j),将子字符串中字符的匹配结果保存在其中,以避免多次的重复运算。由公式(1)可以知道:
若i=0或j=0,则Length(i,j)=0;
若xi=bj,则Length(i,j)=Length(i-1,j-1)+1,f(i,j)=“?”;
若xi≠yi,且Length(i-1,j)=Length(i,j-1),则Length(i,j)=Length(i-1,j),f(i,j)=“↑”;
若xi≠yi,且Length(i-1,j)Length(i,j-1),则Length(i,j)=Length(i,j-1),f(i,j)=“←”。
由于计算每个数组单元的时间复杂度为O(1),所以求解Length(i,j)的时间复杂度为O(M*N)。
(2)求出最长公共子序列LCS(X,Y)
根据上述过程中计算最优值时得到的最长公共子序列长度,搜索在上述求解Length(i,j)的过程中保存的匹配结果f(i,j),构造最优解。
若i或j为0,返回空字符串;
若f(i,j)=“?”,则Xi,Yj的最长公共子序列是Xi-1,Yj-1的最长公共子序列在尾部加上xi得到的子序列;
若f(i,j)=“↑”,则Xi,Yj和Xi-1,Yj有着相同的最长公共子序列;
若f(i,j)=“←”,则Xi,Yj和Xi,Yj-1有着相同的最长公共子序列;
用LCS(X,Y)保存每次比较得到的公共子序列,比较结束后得到两个字符串的最长公共子序列。在求解LCS(X,Y)过程中,因为每次递归调用都会使i或j减1,因此计算的时间复杂度为O(m+n)。为了使运行方便,程序中可以将“?”,“↑”,“←”替换为某些方便判别的标记,比如数字。结合LCS算法以及DUPOC工具的判别思想,逐行分析程序语句,可以直观的得到程序代码之间的相似的部分。
2 系统总体设计
2.1 系统概述
本系统具体的各个部分操作如下:
(1)文件导入,一对一对比的源代码的文件的采集。
(2)源文件具体信息采集,获取源文件的具体信息并显示。
(3)文件夹导入,导入文件夹中的所有源代码文件。
(4)文件列表显示,显示批处理源文件的列表。
(5)相似度阀值设置,根据实际情况设置合适的相似度阀值,可以经过反复比较后确定,以达到预期的效果。
(6)数据预处理,获取导入的源文件中的代码,并对其进行扫描并预处理,除去注释等冗余信息。
(7)代码比较,用LCS算法得出经过预处理的两段程序代码的最长公共子序列,并得出相似度信息。
(8)批处理,用LCS算法结合设定的相似度阀值对所选文件夹下的源代码文件与指定源代码文件进行对比并得出相似度信息。
(9)源
文档评论(0)