我正在尝试实现代码执行系统,并且正在寻找一种方法来捕获来自不同用户的可疑相似的提交代码。我的想法是使用Dice系数来比较提交的字符串。在我的情况下可以使用它吗?如果不是,是否有更好的算法。
答案 0 :(得分:1)
字符串比较算法不是imo的主要焦点。骰子,Levenshtein或q-gram无关紧要(尽管我不是专家)。
最主要的是将您的代码转换为一系列令牌。将第一个未知标记标记为1,将第二个标记标记为2 ect。然后比较两个令牌字符串。如果所有人都更改了一些变量名,这将为您提供精确匹配。
要更加复杂,如果令牌与关键字匹配,if
with
for
do
等可以给您提供唯一的标签(大多数语言都有类似的关键字)。这样可以避免误报。
示例:
sample1:
name = 'fred'
print(name)
sample2:
my_name = 'harry'
print(my_name)
sample1令牌:name, =, ', fred, ', print, (, name, )
sample1处理过的令牌:1, 2, 3, 4, 3, 5, 6, 1, 6
sample2令牌:my_name, =, ', harry, ', print, (, my_name, )
sample2处理的令牌:1, 2, 3, 4, 3, 5, 6, 1, 6
,现在您将匹配sample1和sample2中的已处理令牌