代码查重——LCS、Levenshtein距离、Jaro-Whinkle距离和变量代换

内容介绍

  1. 基本功能实现
    a) 预处理
    b) LCS实现
    c) 给出合适的r,求出D(i,j)
  2. 解决变量名代换的问题
    a) 字面距离
    b) 正则化截取

实验概述

  1. 对待查重的文件的预处理
  2. LCS基本实现
  3. 对r、D(i,j)和递归公式的推导
  4. 字面距离(Levenshtein距离和Jaro-Winkler距离)
  5. 正则化表达式截取字符串

实验内容

  1. 基本实现
    a) 预处理
    首先,考虑到不同人编程的习惯差异,会产生不同的缩进,因此空格、回车的数目是因人而异的,需要在查重前对代码使用clang format进行格式化,消除这些差异,并将注释语句删掉。而针对不同的语言,对于括弧“{}”的使用习惯也不同,如C、C++中,括弧的习惯是:
    void Func()
    {

    }
    而在java和一些语言中更适用于这种写法:
    void Func(){

    }
    因此括弧会影响查重,可以用方法将其去除或者在对比时无视,消除差异。
    其次,匹配规则是,当S1与S2字符串进行匹配后,S2不再与其他字符串进行匹配。如下图,当A.cpp中有字符串与B.cpp的字符串匹配成功后,将B.cpp的字符串对应的行标记,此后便不与之匹配。
    匹配规则

    b) LCS实现
    LCS的基本实现思想是,取两个字符串的字符一一比对,若两者相同则令S[i][j] = S[i][j] + 1,否则S[i][j] = max(S[i-1][j], S[i][j-1]),这也是符合LCS的推导公式的。而得到最长相同子串的方法是通过数据结构的栈实现的,因为一般的实现会记录字符的方向,而输出字符串是要从S矩阵的右下角逆序输出࿰

  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值