清华数据结构重名剔除AC100

本文介绍了在清华数据结构课程中处理重名问题的算法,通过寻找大素数作为散列函数的基础,对菜谱进行编码并利用散列解决冲突问题。在输入每个菜谱时检查其是否存在重复,若不存在则添加到链表数组中,存在则通过遍历链表判断重复次数,避免重复数据的存储。最后遍历链表输出结果。
摘要由CSDN通过智能技术生成

1.首先需要找打大于600000的最大素数,寻找素数的方法,我用的是比较笨的方法,就是用x的平方根以下的数y去除,若x%y全部都不为0,则为素数。

2.对每一个菜谱进行编码,我的编码方法如下,具体的编码方法大家可以随意!

int hashcode(char be_hash[40])
{
	int length= strlen(be_hash);
	int num = 0;
	for (auto i = 0; i < length; i++)
	{
		num += (be_hash[i] - 96)*(i+1);
	}
	return num;
}

3.每输入一个菜谱,进行一次检查,检查的结果为result。

若从来没有输入,则result.bool_value=1;然后将值添加入链表数组中。

(这里需要注意的是,如果hashcode计算得到的值相同,则需要遍历链表以判断是否重复)

4.在检查时,会使result.chongfu++,然后通过这个来判断重复了几次,若重复了超过1次,chongfu的值会大于1.这时候重复的数值就不能加入rept_hash链表中。

5.最后遍历rept_hash链表,输出即可!

最后附上代码!

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>
#define maxn 799999
usin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值