哈希表实验报告(20200623044247)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告四一一哈希表查找名字(字符串)
实验题目:哈希表查找名字(字符串)
实验目标:
输入一组名字(至少50个),将其保存并利用哈希表查找。输出哈希查找冲突次数,哈希表负载因子、查找命中率。
数据结构:
哈希表和数组(二维)。二维数组用于静态顺序存储名字(字符串),哈希表采用开放定址法,
用于存储名字(字符串)对应的关键字并实现对名字(字符串)的查找。
需要的操作有:
1.关键字求取(主函数中两次出现,未单独编为函数)
关键字key=abs (字符串首位ASCII码值-第二位ASCII码值+第([n]+i )位ASCII码值撮后一
位ASCII码值-倒数第二位ASCII码值)*字符串长度(abs为求整数绝对值的函数)。
2.处理关键字的哈希函数(Hash)
利用平方取中法求关键值key在哈希表中的位置。公式add=(key*key)%1000/LENGTH(add
为key在哈希表中的地址)。
int Hash(i nt key)
{
return((key*key)/1000%LENGTH);
}
3.处理哈希表中冲突的函数(Collision
利用线性探测再散列处理冲突,利用全局变量count统计冲突次数。
int Collision(int key,int Hashtable[])
{
int i;
for(i=1;i<=LENGTH;i++)
{
if(Hashtable[(Hash(key)+i)%LENGTH]==-1) return((Hash(key)+i)%LENGTH);
coun t++;
}
}
4.哈希表初始化(InitHash)
void InitHash(int Hashtable[])
{
int i;
for(i=0;i Hashtable[i]=-1; } 5.向哈希表中插入关键字(InsertHash) void In sertHash(i nt key,i nt Hashtable[]) { int add; add=Hash(key); if(Hashtable[add]==-1) Hashtable[add]=key; else { add=Collision(key,Hashtable); Hashtable[add]=key; } } 6.查找关键字在哈希表中的存储位置( SearchHash) int SearchHash(int key,int Hashtable[]) { int add; add=Hash(key); if(Hashtable[add]==key) return add; while(Hashtable[add]!=key&&Hashtable[add]!=-1) add=Collision(key,Hashtable); return add; } 7.输出哈希表(PrintHash)(帮助调试用) void PrintHash(int Hashtable[]) { int i; for(i=0;i if(Hashtable[i]!=-1) printf("%3d:%d\n",i+1,Hashtable[i]); } 8.求字符串长度(strlen)(函数库 算法设计: 1建立长度为LENGTH的哈希表Hash ( LENGTH M体值由宏定义决定)。 2输入要插入的字符串总数num ( num小于等于LENGTH,再输入num个字符串,将这num 个字符串的关键值key 计算出来后插入哈希表中。 3 输出哈希表(帮助调试用,并非实验目的) 。 4 依次查找这num 个字符串对应的关键字在哈希表中位置,并统计冲突次数,记为count。根据公式计算负载因子和命中率(负载因子=表中填入的记录数/哈希表的长度,命中率=元素个数/查找次数)。输出元素个数、冲突次数、查找次数、负载因子、命中率。 源程序(将LENGTH定义为60,实际调试中定义为60和100各一次): #include #include #include #include #define LENGTH 60 /*实际调试中定义为60和100各一次*/ int Hash(int key); int Collision(int key,int Hashtable[]); void InitHash(int Hashtable[]); void InsertHash(int key,int Hashtable[]); int SearchHash(int key,int Hashtable[]); void PrintHash(int Hashtable[]); int count=0,num=0; void main() { int i,key,collapsetime,searchtime,Hash[LENGTH]; float loadelem,hitprob; char names[LENGTH][20]; InitHash(Hash); printf("input the number of names(number<=%d).\n",LENGTH); scanf("%d",&num); printf("input names.\n"); for(i=0;i { scanf("%s",&names[i]); key=(abs((int)names[i][0]-(int)names[i][1]+(int)names[i][strlen(names[i])/2]-(int)names[i][str len(names[i])-2]-(int)names[i][strlen(names[i])-1]))*strlen(names[i]); /*上式为关键字求取,公式:关键字key=abs (字符串首位ASCII码值-第二位ASCII 码值+第([n/2]+1 )位ASCII码值-最后一位ASCII码值-倒数第二位ASCII码值)*字符串长度 ( abs 为求整数绝对值的函数) 。*/ InsertHash(key,Hash); } count=0;/* 将count 置零,清除插入过程中产生的冲突次数*/ PrintHash(Hash); for(i=0;i key=(abs((int)names[i][0]-(int)names[i][1]+(int)names[i][strlen(names[i])/2]-(int)names[i][str len(names[i])-2]-(int)names[i][strlen(names[i])-1]))*strlen(names[i]); /* 上式为关键字求取,公式同上*/ SearchHash(key,Hash); } collapsetime=count; searchtime=count+num; loadelem=(float)num/LENGTH; hitprob=(float)num/searchtime; printf(" 元素个数:%d\n",num); printf(" 冲突次数:%d\n",collapsetime); printf(" 查找次数:%d\n",searchtime); printf(" 负载因子:%f\n",loadelem); printf(" 命中率=总人数/ 查找数:%f\n",hitprob); } int Hash(int key)/* 处理关键字的哈希函数*/ { return((key*key)/1000%LENGTH); } int Collision(int key,int Hashtable[])/* 处理哈希表中冲突*/ { int i; for(i=1;i<=LENGTH;i++) { if(Hashtable[(Hash(key)+i)%LENGTH]==-1) return((Hash(key)+i)%LENGTH); count++;/* 统计冲突次数*/ } } void InitHash(int Hashtable[])/* 初始化哈希表*/ { int i; for(i=0;i