第一次个人编程作业

该文详细介绍了使用Simhash算法进行论文查重的过程,包括计算模块接口的设计,通过哈希表存储Simhash值,以及利用汉明距离评估文件相似度。同时,文中还展示了性能分析的关键函数,并提供了PSP2.1过程中的时间估算与实际耗时对比。
摘要由CSDN通过智能技术生成
这个作业属于哪个课程软件工程4班
这个作业要求在哪里作业要求
这个作业的目标个人项目作业-论文查重

一、gitcode仓库地址

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.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划1015
Estimate估计这个任务需要多少时间11451675
Development开发200300
Analysis需求分析 (包括学习新技术)200400
Design Spec生成设计文档4050
Design Review设计复审4030
Coding Standard代码规范 (为目前的开发制定合适的规范)4040
Design具体设计300420
Coding具体编码200240
Code Review代码复审2020
Test测试(自我测试,修改代码,提交修改)3060
Test Repor测试报告3060
Size Measurement计算工作量2020
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划1520
合计11451535
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值