这个作业属于哪个课程 | 软件工程4班 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 个人项目作业-论文查重 |
一、gitcode仓库地址
二、计算模块接口的设计与实现过程
程序运行过程:
- 执行程序时,首先调用load_file()加载原文件和抄袭文件分别存入orig_text和plag_text中,然后调用simhash()计算simhash值存入哈希表中,最后通过计算原文件和抄袭文件的汉明距离得出相似度。
算法原理:
- -Simhash算法通过将文本字符串分割成单词并计算每个单词的哈希值来实现。在计算Simhash值时,使用了一种简单的技术,即将单词哈希值的每个比特位分别记录在长度为64的数组中。然后将数组的每个值与0进行比较,如果大于零,则将Simhash值的相应位置设置为1,否则设置为0。最后将Simhash值存储到哈希表中。计算完成Simhash值之后,该代码计算原文件和抄袭文件的汉明距离(即不同位的数量),然后将相似度写入输出文件。
三、性能分析图
- 消耗最大的函数
//Simhash算法,输入为文本字符串和哈希表
uint64_t simhash(const char *text, hash_table_t *ht) {
uint64_t hash[BITS] = { 0 };
char *token;
char *saveptr;
//分词
token = strtok((char *)text, " \t\n\r");
//计算hash值
while (token != NULL) {
uint64_t h = 0;
char *p = token;
while (*p) {
h = *(p++) + (h << 6) + (h << 16) - h;
}
//加权、合并
for (int i = 0; i < BITS; i++) {
if ((h >> i) & 1) {
hash[i]++;
}
else {
hash[i]--;
}
}
token = strtok(NULL, " \t\n\r");
}
uint64_t simhash = 0;
for (int i = 0; i < BITS; i++) {
if (hash[i] > 0) {
simhash |= (1ULL << i);
}
}
// 将Simhash值加入哈希表
hash_node_t *node = ht->nodes[simhash % ht->size];
while (node != NULL && node->hash != simhash) {
node = node->next;
}
if (node == NULL) {
node = (hash_node_t *)malloc(sizeof(hash_node_t));
node->hash = simhash;
node->count = 1;
node->next = ht->nodes[simhash % ht->size];
ht->nodes[simhash % ht->size] = node;
}
else {
node->count++;
}
return simhash;
}
四、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 15 |
Estimate | 估计这个任务需要多少时间 | 1145 | 1675 |
Development | 开发 | 200 | 300 |
Analysis | 需求分析 (包括学习新技术) | 200 | 400 |
Design Spec | 生成设计文档 | 40 | 50 |
Design Review | 设计复审 | 40 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 40 | 40 |
Design | 具体设计 | 300 | 420 |
Coding | 具体编码 | 200 | 240 |
Code Review | 代码复审 | 20 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Test Repor | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 15 | 20 |
合计 | 1145 | 1535 |