- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序相似度判定算法研究和实现
程序相似度判定算法研究和实现
摘要摘要:有效检测程序设计类课程作业抄袭现象具有重要的现实意义。传统的代码相似度检测方法主要利用代码属性或结构信息判定代码之间的相似性。基于已有的属性度量与最长公共子序列算法,提出一种代码相似度检测算法,算法将属性度量的结构无关性与最长公共子序列算法的结构依赖性有机结合。实验结果表明,该算法可以有效降低程序源代码的评测难度,得到较为可信的综合相似度值,增强了评测人员对抄袭现象的监测力度。
关键词关键词:相似度;属性度量;LCS;权值
DOIDOI:10.11907/rjdk.151921
中图分类号:TP312
文献标识码:A文章编号文章编号2015)011004305
基金项目基金项目:金陵科技学院2013年校级教育教改项目(金院字〔2013〕176号);江苏省教育科学研究所/现代教育技术研究所项目(2015R41285)
作者简介作者简介:王爱侠(1975-),女,山东高密人,硕士,金陵科技学院软件工程学院讲师,研究方向为教育管理、数据库与数据挖掘技术、图像处理。
0引言
当前的大学教育中学生作业抄袭现象比较普遍,尤其是程序设计类课程,作业是以电子文档方式存储的,学生可以直接将互联网上或其他同学的作业拷贝过来,作一些简单修改就直接交给老师,抄袭容易。国外很多教育机构针对程序设计课程的源代码抄袭现象进行的调查显示, 高达85.4% 的学生承认抄袭过别人的编程作业。教师在大量的程序作业中人工判别抄袭将是一项繁重的工作,也无法确保考核的正确性和客观性。因此,检测程序代码的相似度具有重要的现实意义,可以帮助教师检查学生中的抄袭现象,还可以辅助实现作业批改或者试卷评阅的自动化[67]。
程序代码相似度检测早在20世纪70年代初就有学者对此进行了研究。1976年,Purdue大学的Ottenstein[8]首次提出了基于属性计数法度量相似度算法――An Algorithmic Approach to the Detection and Prevention of Plagiarism。Ottenstein首次使用Halstead程序度量方法进行程序相似度识别,其开发的某系统可直接统计M.Halstead[9]提出的衡量程序长度的4个基本软件科学参数:n1,n2,N1,N2。Ottenstein认为两个程序具有相同的4个属性值的可能性是非常小的。这4个程序的参数,构成一个向量vi,设另一程序4个参数构成向量vj,则可通过计算这两个向量的夹角余弦作为其相似度。1992年,Komondoor和Horwitz提出使用切片技术进行检测[10],把语句完全相同的代码中间夹杂的不相关语句放到该部分代码的前面或后面,如此就会使两段相似的代码连成一体,形成一个更大规模的相似代码,进而能够识别出程序中的非连续完全相似代码。1996年,Verco和Wise[11]指出,对于仅仅使用属性计数法的检测算法,增加向量位数并不能改善错误率。改进属性计数法的措施就是加入程序的结构信息,结合结构度量(structure metrics)来检测相似度。
本文在已有研究的基础上,基于属性度量与最长公共子序列算法,将属性度量的结构无关性与最长公共子序列算法的结构依赖性有机结合,巧妙避开了两个算法原有的缺点,取长补短,从而得到源代码较为可信的综合相似值。
1.2相似代码分类
2001年,Edward L.Jones对程序相似代码之间的更改手段重新总结,在不影响程序结果的前提下,将相似代码分为10类情况[14],如表1所示。
这10种情况相对简单的解决策略如下:
(1)对于逐字拷贝产生的代码,由于源代码未作改动,或只有细微改动,对两部分代码使用最长公共子序列算法(以下简称LCS算法),将可以准确得出两代码的相似程度。
(2)对于更改注释语句后形成的代码,由于注释语句与程序功能无任何关联,只具有说明功能,去掉注释对程序的实际运行无任何影响。因此,将需要比对的两段程序去掉注释,即可得到类似于逐字拷贝产生的相似代码,对其使用LCS算法即可得出相似程度。
(3)更改空白区域与更改注释信息的行为类似,只需对源代码进行空格缩进处理,进而使用LCS算法得出相似程度。
(4)重新命名标识符后的源程序,经过编译后与修改之前的源程序产生同样的可执行程序,只对可读性有影响,因此可以对用户自定义变量进行统一替换后使用LCS算法。
(5)通常数据类型的修改都会影响到程序的执行结果,但也有部分数据类型之间存在隐式转换,绝大多数情况下对此类数据类型的修改将不影响运行结果。因此,将所有可以隐式转换的数据类型统一替换成指定的数据类型后使用LCS算法
文档评论(0)