实验4 查找的应用-哈希表设计
哈希表查找方法原理
哈希表查找方法原理哈希表查找方法什么是哈希表•哈希表是一种常见的数据结构,也被称为散列表。
•它可以提供快速的插入、删除和查找操作,时间复杂度在平均情况下为O(1)。
•哈希表由数组组成,每个数组元素称为桶(bucket)。
•存储数据时,通过哈希函数将数据映射到对应的桶中。
哈希函数的作用•哈希函数是哈希表的核心部分,它将数据转换为哈希值。
•哈希函数应该具备以下特点:–易于计算:计算哈希值的时间复杂度应尽量低。
–均匀分布:哈希函数应能将数据均匀地映射到不同的桶中,以避免桶的过度填充或者空闲。
–独特性:不同的输入应该得到不同的哈希值,以尽量减少冲突。
哈希冲突及解决方法•哈希冲突指两个或多个数据被哈希函数映射到同一个桶的情况。
•常见的解决哈希冲突的方法有以下几种:–链地址法(Chaining):将相同哈希值的数据存储在同一个桶中,通过链表等数据结构来解决冲突。
–开放地址法(Open Addressing):当发生冲突时,通过特定的规则找到下一个可用的桶来存储冲突的数据,如线性探测、二次探测等。
–再哈希法(Rehashing):当发生冲突时,使用另一个哈希函数重新计算哈希值,并将数据存储到新的桶中。
哈希表的查找方法•哈希表的查找方法分为两步:1.根据哈希函数计算数据的哈希值,并得到对应的桶。
2.在桶中查找目标数据,如果找到则返回,否则表示数据不存在。
哈希表的查找性能•在理想情况下,哈希表的查找时间复杂度为O(1)。
•然而,由于哈希冲突的存在,查找时间可能会稍微增加。
•如果哈希函数设计得不好,导致冲突较多,可能会使查找时间复杂度接近O(n)。
•因此,选择合适的哈希函数和解决冲突的方法对于提高哈希表的查找性能非常重要。
总结•哈希表是一种高效的数据结构,适用于快速插入、删除和查找操作的场景。
•哈希函数的设计和解决冲突的方法直接影响哈希表的性能。
•在实际应用中,需要根据数据特点选择合适的哈希函数和解决冲突的方法,以提高哈希表的查找性能。
数据结构课程设计--哈希表实验报告
福建工程学院课程设计课程:算法与数据结构题目:哈希表专业:网络工程班级:xxxxxx班座号:xxxxxxxxxxxx姓名:xxxxxxx2011年12 月31 日实验题目:哈希表一、要解决的问题针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。
以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序。
基本要求:姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。
完成按姓名查询的操作。
运行的环境:Microsoft Visual C++ 6.0二、算法基本思想描述设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。
建立哈希表并且将其显示出来。
通过要查找的关键字用哈希函数计算出相应的地址来查找人名。
通过循环语句调用数组中保存的数据来显示哈希表。
三、设计1、数据结构的设计和说明(1)结构体的定义typedef struct //记录{NA name;NA xuehao;NA tel;}Record;录入信息结构体的定义,包含姓名,学号,电话号码。
typedef struct //哈希表{Record *elem[HASHSIZE]; //数据元素存储基址int count; //当前数据元素个数int size; //当前容量}HashTable;哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。
2、关键算法的设计(1)姓名的折叠处理long fold(NA s) //人名的折叠处理{char *p;long sum=0;NA ss;strcpy(ss,s); //复制字符串,不改变原字符串的大小写strupr(ss); //将字符串ss转换为大写形式p=ss;while(*p!='\0')sum+=*p++;printf("\nsum====================%d",sum);return sum;}(2)建立哈希表1、用除留余数法构建哈希函数2、用线性探测再散列法处理冲突int Hash1(NA str) //哈希函数{long n;int m;n=fold(str); //先将用户名进行折叠处理m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数return m; //并返回模值}Status collision(int p,int c) //冲突处理函数,采用二次探测再散列法解决冲突{int i,q;i=c/2+1;while(i<HASHSIZE){if(c%2==0){c++;q=(p+i*i)%HASHSIZE;if(q>=0) return q;else i=c/2+1;}else{q=(p-i*i)%HASHSIZE;c++;if(q>=0) return q;else i=c/2+1;}}return UNSUCCESS;}void benGetTime();}else printf("\n此人不存在,查找不成功!\n");benGetTime();}(4)显示哈希表void ShowInformation(Record* a) //显示输入的用户信息{int i;system("cls");for( i=0;i<NUM_BER;i++)printf("\n第%d个用户信息:\n 姓名:%s\n 学号:%s\n 电话号码:%s\n",i+1,a[i].name,a[i].xuehao,a[i].tel);}(5)主函数的设计void main(int argc, char* argv[]){Record a[MAXSIZE];int c,flag=1,i=0;HashTable *H;H=(HashTable*)malloc(LEN);for(i=0;i<HASHSIZE;i++){H->elem[i]=NULL;H->size=HASHSIZE;H->count=0;}while (1){ int num;printf("\n ");printf("\n 欢迎使用同学通讯录录入查找系统");printf("\n 哈希表的设计与实现");printf("\n 【1】. 添加用户信息");printf("\n 【2】. 读取所有用户信息");printf("\n 【3】. 以姓名建立哈希表(再哈希法解决冲突) ");printf("\n 【4】. 以电话号码建立哈希表(再哈希法解决冲突) ");printf("\n 【5】. 查找并显示给定用户名的记录");printf("\n 【6】. 查找并显示给定电话号码的记录");printf("\n 【7】. 清屏");printf("\n 【8】. 保存");printf("\n 【9】. 退出程序");printf("\n 温馨提示:");printf("\n Ⅰ.进行5操作前请先输出3 ");printf("\n Ⅱ.进行6操作前请先输出4 ");printf("\n");printf("请输入一个任务选项>>>");printf("\n");scanf("%d",&num);switch(num){case 1:getin(a);break;case 2:ShowInformation(a);break;case 3:CreateHash1(H,a); /* 以姓名建立哈希表*/break;case 4:CreateHash2(H,a); /* 以电话号码建立哈希表*/break;case 5:c=0;SearchHash1(H,c);break;case 6:c=0;SearchHash2(H,c);break;case 7:Cls(a);break;case 8:Save();break;case 9:return 0;break;default:printf("你输错了,请重新输入!");printf("\n");}}system("pause");return 0;3、模块结构图及各模块的功能:四、源程序清单:#include<stdio.h>#include<stdlib.h>#include<string.h>#include <windows.h>#define MAXSIZE 20 #define MAX_SIZE 20 #define HASHSIZE 53 #define SUCCESS 1#define UNSUCCESS -1#define LEN sizeof(HashTable)typedef int Status;typedef char NA[MAX_SIZE];typedef struct {NA name;NA xuehao;NA tel;}Record;typedef struct {Record *elem[HASHSIZE]; int count; int size; }HashTable;Status eq(NA x,NA y) {if(strcmp(x,y)==0)return SUCCESS;else return UNSUCCESS;}Status NUM_BER;void getin(Record* a) {int i;system("cls");printf("输入要添加的个数:\n");scanf("%d",&NUM_BER);for(i=0;i<NUM_BER;i++){printf("请输入第%d个记录的姓名:\n",i+1);scanf("%s",a[i].name);printf("请输入%d个记录的学号:\n",i+1);scanf("%s",a[i].xuehao);printf("请输入第%d个记录的电话号码:\n",i+1);scanf("%s",a[i].tel);}}void ShowInformation(Record* a){int i;system("cls");for( i=0;i<NUM_BER;i++)printf("\n第%d个用户信息:\n 姓名:%s\n 学号:%s\n 电话号码:%s\n",i+1,a[i].name,a[i].xuehao,a[i].tel);}void Cls(Record* a){printf("*");system("cls");}long fold(NA s){char *p;long sum=0;NA ss;strcpy(ss,s);strupr(ss);p=ss;while(*p!='\0')sum+=*p++;printf("\nsum====================%d",sum);return sum;}int Hash1(NA str){int m;n=fold(str);m=n%HASHSIZE;return m;}int Hash2(NA str){long n;int m;n = atoi(str);m=n%HASHSIZE;return m;}Status collision(int p,int c){int i,q;i=c/2+1;while(i<HASHSIZE){if(c%2==0){c++;q=(p+i*i)%HASHSIZE;if(q>=0) return q;else i=c/2+1;}else{q=(p-i*i)%HASHSIZE;c++;if(q>=0) return q;else i=c/2+1;}}return UNSUCCESS;}void benGetTime();void CreateHash1(HashTable* H,Record* a){ int i,p=-1,c,pp;system("cls"); benGetTime();for(i=0;i<NUM_BER;i++){p=Hash1(a[i].name);pp=p;while(H->elem[pp]!=NULL) {pp=collision(p,c);if(pp<0){printf("第%d记录无法解决冲突",i+1);continue;}}H->elem[pp]=&(a[i]);H->count++;printf("第%d个记录冲突次数为%d。
哈希实验报告
引言概述:本文旨在对哈希实验进行报告,重点介绍哈希实验的二次探测法、哈希函数、哈希表的查找、插入与删除操作,并分析实验结果。
通过本实验的开展,我们对哈希算法的原理、实现和性能有了更深入的理解,也增加了对数据结构的实践能力。
正文内容:一、二次探测法1.定义与原理2.步骤与流程3.优缺点分析4.实验过程与结果5.实验中的注意事项二、哈希函数1.哈希函数的设计原则2.常见的哈希函数算法3.哈希冲突与解决方法4.哈希函数的优化策略5.实验中的哈希函数选择与应用三、哈希表的查找操作1.哈希表的存储结构与基本操作2.直接定址法查找3.拉链法查找4.其他查找方法与比较5.实验结果与分析四、哈希表的插入与删除操作1.插入操作的实现思路2.插入操作的效率分析3.删除操作的实现思路4.删除操作的效率分析5.实验结果分析与对比五、实验结果与总结1.实验数据的统计与分析2.实验中的问题与解决方案3.实验结论与总结4.对哈希算法的进一步探讨与应用展望5.实验的意义与启示总结:通过对哈希实验的详细阐述,我们对二次探测法、哈希函数、哈希表的查找、插入与删除操作有了更深入的了解。
实验结果与分析表明,在哈希表的实现中,选择合适的哈希函数、解决哈希冲突以及优化插入与删除操作,对提高哈希表的性能至关重要。
哈希算法作为一种重要的数据结构应用,具有广泛的应用前景,在实际问题中具有重要的实践意义。
通过本次实验,我们不仅提升了对数据结构的理论理解,也增强了数据结构算法的实践能力,为今后的学习与研究打下了坚实的基础。
哈希查找_数据结构实验报告
哈希查找_数据结构实验报告哈希查找_数据结构实验报告一:实验目的本实验旨在掌握哈希查找算法的原理和实现方法,深入了解数据结构中的哈希查找技术,并通过实际操作加深对哈希查找的理解。
二:实验原理哈希查找是一种基于哈希函数的查找技术,通过将关键字通过哈希函数映射到哈希表中的位置进行查找。
其主要原理步骤如下:1. 创建哈希表:根据需求确定哈希表的大小,在内存中分配对应大小的空间。
2. 哈希函数的选择:根据关键字的特性选择适合的哈希函数,将关键字映射到哈希表的存储位置。
3. 插入操作:将关键字通过哈希函数计算得到索引位置,如果该位置为空,则直接插入;如果该位置已存在关键字,则发生冲突,需要解决冲突。
4. 冲突解决:常见的冲突解决方法包括线性探测、二次探测和链地址法等。
5. 查找操作:通过哈希函数计算得到关键字的索引位置,进行查找操作。
如果该位置为空,则表示查找失败;如果该位置不为空,则继续比较关键字是否相等。
6. 删除操作:将关键字标记为删除状态,或将该位置置为空。
三:实验步骤本实验中,我们以哈希表实现哈希查找算法,具体步骤如下:1. 创建哈希表:- 确定哈希表的大小。
- 在内存中分配对应大小的空间。
- 将所有位置初始化为空。
2. 哈希函数的选择:- 根据关键字的特性选择适合的哈希函数。
- 哈希函数应尽量保证均匀分布,避免冲突。
3. 插入操作:- 输入待插入的关键字。
- 通过哈希函数计算得到关键字的索引位置。
- 如果该位置为空,则直接插入关键字;如果该位置不为空,则发生冲突,需要解决冲突。
4. 冲突解决:- 使用线性探测法解决冲突:- 从发生冲突的位置向后逐个查找下一个为空的位置,直到找到空位置或遍历完整个哈希表。
- 如果找到空位置,则将关键字插入该位置;如果遍历完整个哈希表仍没有空位置,则插入失败。
- 使用链地址法解决冲突:- 在每个哈希表位置上维护一个链表,将冲突的关键字插入到链表中。
5. 查找操作:- 输入待查找的关键字。
《数据结构》实验报告查找
实验四——查找一、实验目的1.掌握顺序表的查找方法,尤其是折半查找方法;2.掌握二叉排序树的查找算法。
二、实验内容1.建立一个顺序表,用顺序查找的方法对其实施查找;2.建立一个有序表,用折半查找的方法对其实施查找;3.建立一个二叉排序树,根据给定值对其实施查找;4.对同一组数据,试用三种方法查找某一相同数据,并尝试进行性能分析。
三、实验预习内容实验一包括的函数有:typedef struct ,创建函数void create(seqlist & L),输出函数void print(seqlist L),顺序查找int find(seqlist L,int number),折半查找int halffind(seqlist L,int number)主函数main().实验二包括的函数有:结构体typedef struct,插入函数void insert(bnode * & T,bnode * S),void insert1(bnode * & T),创建函数void create(bnode * & T),查找函数bnode * search(bnode * T,int number),主函数main().四、上机实验实验一:1.实验源程序。
#include<>#define N 80typedef struct{int number; umber;for(i=1;[i].number!=0;){cin>>[i].name>>[i].sex>>[i].age;++;cout<<endl;cin>>[++i].number;}}umber<<"\t"<<[i].name<<"\t"<<[i].sex<<"\t"<<[i].age<<endl;}umber==number)return i;}umber)return mid;elseif(number<[mid].number)high=mid-1;elselow=mid+1;}return 0;}void main(){int i,number;seqlist L;create(L);print(L);cout<<"折半查找:"<<endl;cout<<"输入学生学号:";cin>>number;if((i=halffind(L,number))!=0)cout<<"\t"<<[i].number<<"\t"<<[i].name<<"\t"<<[i].sex<<"\t"<<[i].age<<endl;elsecout<<"失败!"<<endl;cout<<"顺序查找:"<<endl;cout<<"输入学生学号:";cin>>number;if((i=find(L,number))!=0)cout<<"\t"<<[i].number<<"\t"<<[i].name<<"\t"<<[i].sex<<"\t"<<[i].age<<endl;elsecout<<"失败!"<<endl;}实验二:#include<>typedef struct{int number; 立二叉排序树"<<"\n\t2.插入学生信息"<<"\n\t3.查找学生信息"<<endl;cout<<"选择:";cin>>choice;switch(choice){case 1:{create(T);cout<<"成功建立!"<<endl;};break;case 2:{insert1(T);cout<<"插入成功!"<<endl;};break;case 3:{cout<<"输入待查学生的学号:";cin>>number;p=search(T,number);if(p)cout<<p-><<"\t"<<p-><<"\t"<<p-><<"\t"<<p-><<endl;elsecout<<"查找失败!"<<endl;};break;}cout<<"Continue(Y/N):";cin>>ctinue;if(ctinue=='y'||ctinue=='y')flag=1;elseflag=0;}}2.实验结果(截图)。
哈希检索的实际应用
哈希检索的实际应用哈希检索是一种常见的数据检索技术,通过将数据映射到哈希表中的特定位置,实现快速的查找和访问。
哈希检索在许多实际应用中发挥着重要作用,本文将介绍几个常见的应用场景。
一、密码存储与验证在用户注册和登录系统时,通常需要对用户密码进行存储和验证。
为了保护用户密码的安全性,通常不会直接将密码明文存储在数据库中。
而是将密码进行哈希运算,并将哈希值存储在数据库中。
当用户登录时,系统会对用户输入的密码进行哈希运算,然后与数据库中存储的哈希值进行比对。
只有哈希值匹配的情况下,系统才会验证用户身份。
二、文件校验与完整性验证在下载文件时,为了确保文件的完整性,通常会提供文件的哈希值供用户验证。
用户可以通过下载文件的哈希值,对下载完成的文件进行哈希运算,然后与提供的哈希值进行比对。
如果两者一致,说明文件未被篡改,可以放心使用。
三、数字证书数字证书用于对网络通信进行加密和身份验证。
在数字证书中,会使用哈希函数对证书的内容进行哈希运算,生成一个哈希值。
这个哈希值可以确保证书内容的完整性,并且可以用于验证证书的真实性。
四、内容寻址存储内容寻址存储是一种将数据存储和检索与数据内容相关联的技术。
在这种存储方式中,数据的内容被哈希为一个唯一的标识符,用于作为数据的索引。
这样可以根据数据的内容快速进行检索和访问,而不必关心数据的具体位置。
五、分布式存储系统在分布式存储系统中,数据通常会被分散存储在多个节点上。
为了快速定位数据的位置,系统会使用哈希函数将数据的标识符映射为物理节点的地址。
这样可以保证数据在分布式环境下的高效访问。
六、数据库索引数据库索引是一种用于提高数据库查询效率的技术。
在索引中,会使用哈希函数将关键字映射为哈希值,并将哈希值与对应的数据位置进行关联。
这样可以快速定位符合查询条件的记录,提高查询效率。
七、缓存管理在缓存管理中,哈希检索常用于快速定位缓存中的数据。
通过将数据的关键字进行哈希运算,可以将数据存储在对应的缓存位置上。
查找算法的应用----哈希查找
一、实验名称:
查找算法的应用----哈希查找
二、实验目的:
1.进一步了解查找算法的用途;
2.进一步巩固哈希函数及哈希表等有关概念;
3.掌握哈希表的创建及查找的过程和方法;
4.比较哈希查找与其它查找算法的不同,体会哈希查找的优缺点。
三、实验内容:
任意给定N个元素,用除留余数法构造哈希函数,用线性探测再散列的方法建立哈希表,在哈希表中进行查找,并在屏幕上显示哈希表及查找结果。
求出等概率条件的平均查找长度,验证结果是否正确。
四、实验要求
1.哈希表中元素的类型为结构体类型。
2.输出哈希表的内容,验证其是否正确。
3.任意给定一个关键字进行查找,验证查找结果是否正确。
给定的这个关键字应有两类:存在和不存在。
4.求出等概率条件的平均查找长度。
五、实验程序代码:
完整的源程序。
六、实验数据处理及实验结果:
实验中输入的数据及执行结果
七、实验小结:
上机中出现的问题、解决方法,对所学知识的进一步理解,以后需要注意的问题等。
实验日期:年月日
交报告日期:年月日。
哈希表的实验报告
哈希表的实验报告哈希表的实验报告哈希表是一种常见的数据结构,用于存储和查找数据。
在本次实验中,我们将探索哈希表的原理、实现和性能,并通过实验验证其效果。
一、实验目的本次实验的目的是探索哈希表的原理和实现方法,并通过实验测试不同哈希函数和哈希表大小对性能的影响。
二、实验原理哈希表是一种基于哈希函数的数据结构,它将数据存储在数组中,通过哈希函数将数据映射到数组的特定位置。
哈希函数将数据转换为数组的索引,使得数据可以快速存储和查找。
哈希函数的选择很重要,一个好的哈希函数应该具备以下特点:1. 均匀性:哈希函数应该将数据均匀地分布到不同的索引位置,以避免冲突。
2. 高效性:哈希函数应该具有高效的计算速度,以提高哈希表的性能。
3. 低冲突:哈希函数应该尽可能减少冲突的发生,以提高哈希表的查找效率。
三、实验方法1. 实现哈希表:我们首先需要实现一个基本的哈希表数据结构。
哈希表可以使用数组来存储数据,每个数组元素称为一个桶,每个桶可以存储多个数据项。
在实现哈希表时,我们需要考虑如何处理冲突,常见的方法有链地址法和开放地址法。
2. 实现哈希函数:我们需要实现不同的哈希函数,以测试它们的性能。
常见的哈希函数包括除余法、乘法和平方取中法等。
我们可以通过实验比较它们的性能,选择最合适的哈希函数。
3. 测试性能:我们需要设计一系列实验,测试不同哈希函数和哈希表大小对性能的影响。
可以通过插入、查找和删除等操作来评估哈希表的性能。
我们可以记录每个操作的平均时间复杂度和空间占用情况,并绘制图表来展示结果。
四、实验结果与分析通过实验,我们得到了不同哈希函数和哈希表大小下的性能数据。
我们可以观察到不同哈希函数对性能的影响,并选择最优的哈希函数。
同时,我们还可以观察到哈希表大小对性能的影响,选择合适的哈希表大小以平衡性能和空间占用。
五、实验总结本次实验我们深入了解了哈希表的原理和实现方法,并通过实验验证了不同哈希函数和哈希表大小对性能的影响。
哈希表的工作原理及应用
哈希表的工作原理及应用1. 前言哈希表是计算机科学中一种非常重要的数据结构,它通过使用哈希函数将数据存储在一个数组中,可以快速地进行数据的插入、查找和删除操作。
在本文中,我们将探讨哈希表的工作原理和一些常见的应用。
2. 哈希表的工作原理哈希表的核心是哈希函数,它将数据映射到一个固定大小的数组中。
哈希函数将数据的关键字作为输入,通过一系列的计算得到一个唯一的数组下标。
当需要插入或查找数据时,我们可以通过哈希函数确定数据在数组中的位置,并直接进行操作,从而达到高效的数据访问速度。
在哈希表中,冲突是一个不可避免的问题。
冲突指的是两个不同的关键字被哈希函数映射到了同一个数组下标的情况。
为了解决冲突,哈希表采用了一种开放寻址法或链地址法的技术。
•开放寻址法:当发生冲突时,直接在数组中寻找下一个空的位置,将数据插入到该位置。
这种方法的优点是简单易实现,但如果哈希表的负载因子过高,会导致插入和查找操作的效率下降。
•链地址法:在数组的每个位置上保存一个链表,当发生冲突时,将数据插入到链表的末尾。
这种方法的优点是可以处理任意数量的冲突,但需要更多的内存空间来存储链表。
3. 哈希表的应用3.1 缓存管理在计算机系统中,缓存是一种用于存储临时数据的快速访问存储器。
哈希表可以用于实现缓存管理,通过哈希函数将数据映射到缓存中的位置,并利用快速的插入和查找操作来提高系统的性能。
3.2 数据唯一性检查哈希表常用于检查数据的唯一性。
当需要判断一个新数据是否已经存在时,可以通过哈希函数将新数据映射到数组中的位置,并查找该位置上是否已经存在其他数据。
3.3 字典和拼写检查哈希表常用于实现字典和拼写检查功能。
通过将每个单词映射到数组中的位置,并保存其对应的解释或频率信息,可以快速地查找单词的含义或检查单词的拼写是否正确。
3.4 分布式存储系统在分布式存储系统中,数据通常会被分散存储在不同的机器上。
为了快速定位需要访问的数据,可以使用哈希表将数据的关键字映射到相应的机器上,从而实现高效的数据访问。
哈 希 查 找
哈希查找
一、哈希表的基本概念 二、构造哈希函数的方法 三、处理冲突的方法 四、哈希表的查找及分析
一、哈希表的基本概念
哈希(Hash)函数:如果在关键字与数据元素的存储位置之间建立某种 对应关系H,根据这种对应关系就能很快地计算出与该关键字key对应的 存储位置的值H(key),我们将关键字与存储位置之间的这种对应关系称 为哈希(Hash)函数。 把关键字为key的元素直接存入地址为H(key)的存储单元,当查找关键 字为key的元素时,利用哈希函数计算出该元素的存储位置H(key),从 而达到按关键字直接存取元素的目的。按照这个思想建立的查找表叫 做哈希表,所得到的存储位置称为哈希地址,利用哈希表进行查找的 方法称为哈希查找。
根据增量序列的取值方式的不同,开放定址法又分为以下三种: ① 线性探测再散列:di为1,2,3,…,h-1,即冲突发生时,顺序查 看哈希表中的下一个位置,直到找出一个空位置或查遍整个表为止。
② 二次探测再散列:di为12,-12,2,-22,3,-32,…,k,- k2 (k≤m/2),即冲突发生时,在表的前后位置进行跳跃式探测。
5.除留余数法
除留余数法是指取关键字被某个不大于哈希表表长m的数p除后所得余数 作为哈希地址,即 H(key)=key%p (p≤m) 例如,已知关键字序列为{23,49,70,68,50,90},对于表长 为20的哈希表,选取p=19,计算所得的哈希地址如下表所示。
6.随机数法
选择一个随机函数为哈希函数,取关键字的随机函数值为它的哈希地 址,即H(key)=random(key) 其中,random()为随机函数。 随机数法适用于关键字长度不等的情况。
三、处理冲突的方法
所谓处理冲突是指,当由关键字计算出 的哈希地址出现冲突时,为该关键字对 应的数据元素找到另一个“空”的哈希 地址。
哈希表实验报告
数据结构实验报告四——哈希表查找名字(字符串)实验题目:哈希表查找名字(字符串)实验目标:输入一组名字(至少50个),将其保存并利用哈希表查找。
输出哈希查找冲突次数,哈希表负载因子、查找命中率。
数据结构:哈希表和数组(二维)。
二维数组用于静态顺序存储名字(字符串),哈希表采用开放定址法,用于存储名字(字符串)对应的关键字并实现对名字(字符串)的查找。
需要的操作有:1.关键字求取(主函数中两次出现,未单独编为函数)关键字key=abs(字符串首位ASCII码值-第二位ASCII码值+第([]+1)位ASCII码值-最后一位ASCII码值-倒数第二位ASCII码值)*字符串长度(abs为求整数绝对值的函数)。
2.处理关键字的哈希函数(Hash)利用平方取中法求关键值key在哈希表中的位置。
公式add=(key*key)%1000/LENGTH(add 为key在哈希表中的地址)。
int Hash(int 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);count++;}}4.哈希表初始化(InitHash)void InitHash(int Hashtable[]){int i;for(i=0;i<LENGTH;i++)Hashtable[i]=-1;}5.向哈希表中插入关键字(InsertHash)void InsertHash(int key,int 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<LENGTH;i++)if(Hashtable[i]!=-1)printf("%3d:%d\n",i+1,Hashtable[i]);}8.求字符串长度(strlen)(函数库<string.h>包含)以及求整数的绝对值(abs)(函数库<math.h>包含)算法设计:1建立长度为LENGTH的哈希表Hash(LENGTH具体值由宏定义决定)。
哈希表查找的设计
哈希表查找的设计一.问题描述:哈希表查找的设计:设哈希表长为20,用除留余数法构造一个哈希函数,以开放定址法中的线性探测再散列法作为解决冲突的方法,编程实现哈希表查找、插入和建立算法。
二.需求分析:程序可实现用户与计算机的交互过程。
在计算机显示提示信息后,可由用户键入运算命令以实现对应的功能,包含数据的录入、查找、删除、显示等功能。
本程序旨在实现哈希函数的构造与处理存储冲突,因而指定哈希表存储的数据类型为简单的整型数字,在实用性上还有所欠缺。
但根据用户需求的变化,可以对程序的基本数据类型进行改造,以实现更为丰富的功能,进而体现哈希表在查找数据时的优越性。
三.算法思想:在设定哈希表的抽象数据类型时,要有查找数据元素的操作。
另外,插入操作和删除操作也要用到查找数据元素操作,以查看该数据元素是否存在,因此可以设计查找元素操作包括插入和删除操作的查找。
因此,查找操作就有两种情况:一种情况是插入操作时寻找空闲单元的查找;另一种情况是在查找和删除操作时寻找该元素是否在哈希表中已存在的查找。
插入操作时寻找空闲单元查找的特征是哈希表中不存在该对象,设计此时查找函数返回该空闲单元位置的“正”值;查找和删除操作时寻找该元素是否在哈希表中已存在的特征是哈希表中已存在该数据元素,设计此时查找函数返回该数据单元位置的“负”值。
进而执行后续操作。
为了区分哈希表中每一个表元素的当前状态,为每一个表元素设置一个“标志”定为tag。
tag=0表示该元素为空;tag=1表示该元素以存放有数据元素;tag=-1表示该元素中存放的数据元素已被删除。
判断当tag为0或-1时都可以进行插入操作。
四.概要设计:1. 哈希表抽象数据类型的定义:ADT HashTable{数据对象:D={ai|ai∈ElemSet, i=1,2,...n, n≥0}数据关系:R1={<ai-1,ai>|ai-1∈D, i=1,2,...n}基本操作:Initiate( &h )操作结果:构造一个空的哈希表h。
哈希表的建立和查找
实验四、哈希表的建立和查找一、实验目的:掌握哈希表的构造方法及其解决冲突的机制(开放地址法)。
二、实验内容:1、哈希表的概念哈希(hash)表又称为散列表,其基本思想是:P341。
2.处理冲突的方法--开放地址P3463.使用以下线性探测再散列的处理冲突方法实现哈希表。
ND=(D+di)%m (I=1,2,3…,I(I m-1))三、实验源程序(源程序中红色字体为完成部分)#include <iostream.h>#include <iomanip.h>#include <stdlib.h>#define MAXlENGTH 30enum HA VEORNOT{NULLKEY,HA VEKEY,DELKEY}; //哈希表元素的三种状态,没有记录、有记录、有过记录但已被删除class HashList{private:int *list;HA VEORNOT *elemflag;int mod;int count;public:HashList();HashList(int m);void InitHashList(int m);void ClearHashList();int HashFunction(int key);bool Search(int key,int &index);bool Insert(int key);bool Delete(int key);void Disp();};#include "hashlist.h"//构造函数1HashList::HashList(){mod=0;count=0;}//构造函数2,使用成员函数insert()实现初始化HashList::HashList(int m){if(m<1){cerr<<"哈希表的大小错误!"<<endl;}else{count=0;InitHashList(m);}}//初始化哈希表void HashList::InitHashList(int m){list=new int[m];elemflag=new HA VEORNOT[m];mod=m;for(int i=0;i<mod;i++){elemflag[i]=NULLKEY;}}//清空哈希表void HashList::ClearHashList(){if( count==0){cout<<"哈希表已经为空!";}else{//在此处添加你的代码int i;for(i=0;i<mod;i++){elemflag[i]=NULLKEY;}count = 0;}}//哈希函数int HashList::HashFunction(int key){if (mod==0){cerr<<"哈希表还没初始化!"<<endl;return -1;}else{return key%mod;}}bool HashList::Search(int key,int &index){if(mod==0){cerr<<"哈希表还没初始化!"<<endl;return false;}else{//在开放定址哈希表H中查找关键字为k的数据元素,若查找成功,返回ture//待查数据元素在表中的位置;否则返回-1。
课程设计--哈希表查找算法的实现
学号:0121010340132课程设计题目哈希表查找算法的实现学院计算机科学与技术学院专业计算机科学与技术专业班级计算机1001班姓名指导教师2012 年 6 月27 日课程设计任务书题目: 哈希表查找算法的实现初始条件:理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。
具体的设计任务及要求:1)输入一些整数,采用哈希表结构存储;2)实现对哈希表的查找;3)程序采用子程序结构,结构清晰;4)友好清晰的用户界面,能识别输入错误并控制错误的修改。
在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。
阅读资料:1)《IBM—PC汇编语言程序设计实验教程》实验2.42)《IBM—PC汇编语言程序设计(第2版)》例6.11时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试,和验收。
周5:撰写课程设计报告。
指导教师签名:年月日系主任(或责任教师)签名:年月日目录⒈设计目的与任务 (4)⒈1问题描述 (4)⒈2设计目的 (4)⒈3测试用例 (5)⒉设计分析 (5)⒉1存储结构 (5)⒉2主要算法 (5)⒊设计步骤 (6)⒊1概要设计 (6)⒊2代码设计 (7)⒋调试分析和测试结果 (15)⒋1 编码分析 (15)⒋2 调试运行 (16)⒋3调试结果 (16)⒌心得体会 (17)⒍参考文献 (18)⒈设计目的与任务⒈1问题描述⒈⒈1题目:哈希表查找算法的实现⒈⒈2任务与要求:⑴输入一些整数,采用哈希表结构存储;⑵实现对哈希表的查找;⑶程序采用子程序结构,结构清晰;⑷友好清晰的用户界面,能识别输入错误并控制错误的修改。
哈希查找数据结构实验报告
引言概述:哈希查找是一种高效的数据结构,它通过将关键字映射为哈希码,将数据存储在哈希表中,从而实现快速的查找操作。
本实验报告将详细介绍哈希查找的原理、实现方法、效率分析以及实验结果,并探讨其在实际应用中的优缺点。
正文内容:一、哈希查找的原理1.1哈希函数的选择1.2冲突处理方法1.3哈希表的结构和特性1.4哈希查找的流程和算法二、哈希查找的实现方法2.1开放寻址法2.1.1线性探测法2.1.2二次探测法2.1.3双重散列法2.2链地质法2.2.1链表的表示与操作2.2.2链地质法的实现步骤2.2.3链地质法的优化方法三、哈希查找的效率分析3.1平均查找长度(ASL)的计算3.2填装因子与性能的关系3.3平均查找长度的简化计算3.4哈希查找的时间复杂度与空间复杂度分析四、实验结果与分析4.1构建哈希表的过程4.2不同冲突处理方法比较4.3不同填装因子下的性能变化4.4实验结果的优化策略4.5实验结果与理论分析的对比五、哈希查找的应用与优缺点5.1应用领域5.2优点与不足5.3哈希查找与其他查找方法的比较5.4未来发展方向和改进方法总结:哈希查找是一种高效的数据结构,它通过将关键字映射为哈希码,将数据存储在哈希表中,实现快速查找。
本文详细介绍了哈希查找的原理、实现方法、效率分析以及实验结果,并探讨了其在实际应用中的优缺点。
通过实验分析和对比,我们可以得出结论:哈希查找在一定填装因子下有着较高的查找效率和较低的空间复杂度,适用于大规模数据的快速查找和插入操作。
哈希查找也存在着冲突处理问题和哈希函数设计的困难等不足之处。
未来的改进方向可以是优化冲突处理方法和进一步提高哈希函数的质量,以提升整体性能和应用范围。
课程设计--哈希表查找算法的实现
学号:0121010340132课程设计题目哈希表查找算法的实现学院计算机科学与技术学院专业计算机科学与技术专业班级计算机1001班姓名指导教师2012 年 6 月27 日课程设计任务书题目: 哈希表查找算法的实现初始条件:理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。
具体的设计任务及要求:1)输入一些整数,采用哈希表结构存储;2)实现对哈希表的查找;3)程序采用子程序结构,结构清晰;4)友好清晰的用户界面,能识别输入错误并控制错误的修改。
在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。
阅读资料:1)《IBM—PC汇编语言程序设计实验教程》实验2.42)《IBM—PC汇编语言程序设计(第2版)》例6.11时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试,和验收。
周5:撰写课程设计报告。
指导教师签名:年月日系主任(或责任教师)签名:年月日目录⒈设计目的与任务 (4)⒈1问题描述 (4)⒈2设计目的 (4)⒈3测试用例 (5)⒉设计分析 (5)⒉1存储结构 (5)⒉2主要算法 (5)⒊设计步骤 (6)⒊1概要设计 (6)⒊2代码设计 (7)⒋调试分析和测试结果 (15)⒋1 编码分析 (15)⒋2 调试运行 (16)⒋3调试结果 (16)⒌心得体会 (17)⒍参考文献 (18)⒈设计目的与任务⒈1问题描述⒈⒈1题目:哈希表查找算法的实现⒈⒈2任务与要求:⑴输入一些整数,采用哈希表结构存储;⑵实现对哈希表的查找;⑶程序采用子程序结构,结构清晰;⑷友好清晰的用户界面,能识别输入错误并控制错误的修改。
哈希表的应用快速查找和去重操作
哈希表的应用快速查找和去重操作哈希表的应用:快速查找和去重操作哈希表(Hash Table)是一种常用的数据结构,它通过散列函数将数据存储在数组中,以实现快速的查找和去重操作。
本文将介绍哈希表的原理和应用,以及如何利用哈希表实现快速查找和去重。
一、哈希表的原理哈希表是由键(Key)和值(Value)组成的键值对(Key-Value)结构。
其核心思想是通过散列函数将键映射为数组的索引,然后将值存储在对应索引的位置上。
这样,在进行查找或者去重操作时,只需计算键的散列值即可定位到对应的存储位置,从而实现常数时间复杂度的操作。
二、哈希表的应用1. 快速查找哈希表在快速查找中发挥了重要的作用。
由于其根据键计算散列值后直接定位到存储位置,所以查找的时间复杂度为O(1)。
这在处理大量数据时,能够显著提高查找效率。
例如,我们可以利用哈希表存储学生的学号和对应的成绩,当要查询某个学生的成绩时,只需通过学号计算散列值,并在哈希表中查找即可,无需遍历整个数组。
2. 去重操作哈希表还可以用于去除重复元素。
在需要对一组数据进行去重时,可以利用哈希表的特性,将元素作为键,将值设为1(或其他常数),并将其存储在哈希表中。
这样,在插入元素时,通过计算散列值即可判断元素是否已存在。
举例来说,假设我们有一个包含大量文章标题的列表,我们希望去除重复的标题。
可以使用哈希表存储已出现过的标题,并在插入新标题时判断是否已存在。
若已存在,则不加入哈希表,从而实现快速、高效的去重操作。
三、哈希表的实现实现哈希表通常需要解决以下几个问题:1. 散列函数的设计散列函数是哈希表实现的核心。
一个好的散列函数能够将键均匀地映射到不同的散列值,以尽量避免冲突。
2. 冲突的处理由于哈希表的存储位置是有限的,不同的键可能会映射到相同的索引位置上,即发生冲突。
常见的解决方法有拉链法(Chaining)和开放地址法(Open Addressing)。
3. 哈希表的动态扩容当哈希表中的元素数量超过存储容量时,需要进行动态扩容,以保证操作的性能。
哈希查找课程设计摘要
哈希查找课程设计摘要一、教学目标本节课的教学目标是让学生掌握哈希查找的基本原理和方法,能够运用哈希查找解决实际问题。
具体分为以下三个部分:1.知识目标:学生需要了解哈希查找的基本概念、原理和算法,理解哈希表的构建和查找过程,掌握常见的哈希函数和冲突解决方法。
2.技能目标:学生能够运用哈希查找解决简单的实际问题,如实现一个简单的哈希查找算法,分析哈希查找的时间复杂度和空间复杂度。
3.情感态度价值观目标:培养学生对计算机科学的兴趣,激发学生主动探索和解决问题的意识,培养学生的团队协作能力和创新精神。
二、教学内容本节课的教学内容主要包括以下几个部分:1.哈希查找的基本概念和原理:介绍哈希查找的定义、特点和应用场景,讲解哈希表的构建和查找过程。
2.哈希函数和冲突解决方法:介绍常见的哈希函数(如MD5、SHA-1等),讲解冲突的产生原因及解决方法(如链地址法、开放地址法等)。
3.哈希查找算法的实现:引导学生动手实现一个简单的哈希查找算法,并通过实例分析其性能。
4.哈希查找的时间复杂度和空间复杂度:分析哈希查找算法的时间复杂度和空间复杂度,让学生了解算法效率的评价指标。
5.哈希查找在实际问题中的应用:举例讲解哈希查找在字符串匹配、数据压缩等领域中的应用。
三、教学方法本节课采用多种教学方法相结合的方式,以激发学生的学习兴趣和主动性:1.讲授法:讲解哈希查找的基本概念、原理和算法,为学生提供系统的知识结构。
2.案例分析法:通过分析实际案例,让学生了解哈希查找在解决实际问题中的应用。
3.实验法:引导学生动手实现一个简单的哈希查找算法,培养学生的实际操作能力和问题解决能力。
4.讨论法:学生进行小组讨论,分享学习心得和解决问题的方法,提高学生的团队协作能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,本节课准备以下教学资源:1.教材:《计算机科学导论》等相关教材,为学生提供理论知识的学习依据。
2.参考书:《哈希查找算法与应用》等专业书籍,为学生提供深入学习的参考资料。
哈希表快速查找和存储数据的利器
哈希表快速查找和存储数据的利器哈希表(Hash Table)是一种非常重要的数据结构,被广泛应用于计算机科学和软件开发领域。
它通过将键(Key)映射为哈希值(Hash Value),快速存储和查找数据,具有高效的插入、删除和查找性能。
在本文中,我们将深入了解哈希表的原理和优势,以及它在实际应用中的重要性。
一、哈希表的原理哈希表基于哈希函数实现数据的存储和查找。
哈希函数将输入的键映射为一个固定大小的整数,作为数据在哈希表中的索引。
在哈希表中,每个索引位置称为“桶”(Bucket),每个桶中可以存储一个或多个数据元素。
当需要插入或查找一个数据元素时,通过哈希函数计算出它在哈希表中的索引位置,然后在该位置上进行操作。
因为哈希函数的计算是快速的,所以插入和查找操作的时间复杂度可达到常数级别,即O(1)。
二、哈希表的优势1. 快速的插入和查找性能:由于使用哈希函数计算索引位置,哈希表实现了数据的快速插入和查找。
相比于顺序查找和二分查找等其他数据结构,哈希表具有更高的效率和更快的速度。
2. 空间利用率高:哈希表能够根据实际数据量进行动态扩容,以保持较低的冲突率。
冲突是指不同的键通过哈希函数计算得到相同的索引位置,为解决冲突,哈希表采用链表、开放寻址法等方法,使得其空间利用率非常高。
3. 适用于大规模数据处理:哈希表适用于大规模数据的存储和处理。
在实际应用中,哈希表被广泛应用于数据库索引、缓存系统、字典数据结构等场景。
三、哈希表的应用1. 数据库索引:数据库中的索引通常采用哈希表结构,以实现快速的数据查找和检索操作。
通过将关键字映射为哈希值,数据库可以快速定位到所需数据。
2. 缓存系统:在分布式缓存系统中,哈希表用于存储和查找缓存数据。
通过将缓存数据的键通过哈希函数计算得到索引位置,可以快速定位到缓存数据。
3. 字典数据结构:哈希表通常作为字典数据结构的基础实现,用于存储键值对(Key-Value Pair)。
哈希表快速查找的利器
哈希表快速查找的利器哈希表是一种高效的数据结构,能够在常数时间内完成插入、删除和查找等操作。
它通过将关键字映射到哈希函数的返回值,然后将该值作为索引存储在数组中,从而实现快速查找。
在实际应用中,哈希表被广泛用于加速数据的存储和检索过程。
本文将介绍哈希表的基本原理、应用场景以及相关的优化技巧。
一、哈希表原理哈希表的原理非常简单,它基于哈希函数将关键字转化为索引,然后将对应的值存储在数组中。
当我们需要查找某个关键字时,通过哈希函数计算出该关键字对应的索引,然后直接在数组中查找对应的值。
由于哈希函数的设计合理性,使得关键字能够均匀地分布在数组中,从而实现了快速的查找。
二、哈希表的应用场景哈希表广泛应用于各种需要快速查找的场景。
以下是几个常见的应用场景:1. 数据库索引: 数据库中的索引通常采用哈希表来实现。
通过将索引关键字转化为哈希值,可以快速定位到需要查询的数据记录。
2. 缓存机制: 缓存系统通常使用哈希表来存储缓存数据。
通过将缓存的关键字转化为哈希值,可以快速判断缓存中是否存在目标数据以及进行数据的读取和更新操作。
3. 字典数据结构: 字典数据结构(如Python中的字典)的实现通常也采用哈希表来存储数据。
通过哈希函数将关键字映射到索引,可以快速地进行数据的插入、删除和查找操作。
4. 路由表: 网络路由器中通常使用哈希表来存储路由表信息。
通过哈希函数将目标IP地址映射到索引,可以快速地确定出口接口及下一跳路由器信息。
三、哈希表的优化技巧1. 哈希函数设计: 哈希函数的设计直接影响到哈希表的性能。
一个好的哈希函数应该能够将关键字均匀地映射到索引,避免冲突。
常见的哈希函数包括除留余数法、平方取中法等。
2. 冲突处理: 冲突是指多个关键字经过哈希函数映射后得到相同的索引值。
常见的冲突处理方法有开放定址法和链地址法。
开放定址法是通过探测到空槽位或者其他空的状态来存储冲突的关键字;链地址法是使用链表来存储冲突的关键字,将它们链接到同一个索引对应的链表上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.实验题目
查找的应用
2.实验内容
哈希表设计
3.实验目的
掌握查找法的工作原理及应用过程,利用其工作原理完成上述实验题目中的内容。
4.实验要求
为了更好的掌握与理解课堂上老师所讲的概念与原理,实验前要认真预习所做的实验内容及编写源程序伪码(写在纸上及盘中均可) 以便在实验课中完成老师所布置的实验内容。
5.概要设计原理
6.详细程序清单及注释说明
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define P 10 //除数余留法中的除数
#define NULLKEY 0
#define MAX 10 //人名个数
#define hashlen 10 //哈希表长度
int sum=0,k=0;
typedef struct Node //哈希表结构体
{
char key_code[10]; //哈希表地址
struct Node *next;
}Node;
typedef struct hashtable //创建哈希表
{
int key;
struct Node *next;
}HashTable[MAX];
int Hash(int key)
{
int mode=key%P; //除留余数法得到的余数
return mode;
}
void Hash_Init(HashTable ht) //哈希表初始化
{
int i;
for(i=0; i<MAX;i++)
{
ht[i].key=NULLKEY;
ht[i].next=NULL;
}
}
int CharToInt(char str[])
{
return str[0]+str[1]+str[2];
}
int Hash_Insert(HashTable ht, Node *node) //为哈希表分配地址{
int key=Hash(CharToInt(node->key_code));
Node *p;
p=(Node*)malloc(sizeof(Node));
if(ht[key].key==NULLKEY)
{
ht[key].key=key;
ht[key].next=node;
k++;
}
else if(ht[key].key==key)
{
p=ht[key].next;
k++;
while(p->next!=NULL)
{
p=p->next;
k++;
}
p->next=node;
k++;
}
return 1;
}
Node* Hash_Search(HashTable ht, int key) //查找函数
int p0=Hash(key);
if(ht[p0].key==NULLKEY)
{sum++;return NULL;}
else if(ht[p0].key==p0)
{
Node *p=ht[p0].next;
while(p!=NULL)
{
if(CharToInt(p->key_code)==key)
{ sum++;
return p;
}
p=p->next;
sum++;
}
}
return NULL;
}
int Hash_Create(HashTable ht) //哈希表长度
{
int i;
Node *node;
Hash_Init(ht);
printf("请输入关键字:\n"); //输入30个姓名for(i=0;i<10;i++)
{
node=(Node *)malloc(sizeof(Node));
scanf("%s",node->key_code);
node->next=NULL;
Hash_Insert(ht,node);
}
printf("\n创建成功!\n");
return 1;
}
int hash_output(HashTable h) //哈希表的输出部分{
Node *a;
int i,j,count2=0;
a=(Node*)malloc(sizeof(Node));
j=0;
for(i=0;i<hashlen;i++)
{
printf("%4d",i);
printf("%4d",h[i].key);
if(h[i].next!=0)
count2++;
j=1;
a=h[i].next;
while(a)
{
printf("->%s",(*a).key_code);
a=(*a).next;
j++;
count2+=j;
}
printf("\n");
}
return count2;
}
void Hash_Link() //链表法构造函数{
int key;
int i;
Node *node;
HashTable ht;
Hash_Create(ht);
hash_output(ht);
printf("count=%d\n",k); //查找总长度
printf("ASL=%d/10\n",k); //平均查找长度printf("请输入要查找的数据:"); //输入查找的姓名scanf("%s",&key);
node=Hash_Search(ht, key);
printf("查找次数:%d\n",sum);
if(node!=NULL)
printf("查找成功!");
else
printf("查找不成功!");
}
void hash_create(int h[],int status[],int data)
{
int address;
int di;
address=data%P;
if(status[address]==0)
{
h[address]=data;
status[address]=1;
}
else
{
for(di=1;di<=hashlen-1;di++)
{
address=((data%P)+di)%hashlen;
if(status[address]==0)
{
h[address]=data;
status[address]=1;
break;
}
}
}
return ;
}
int hash_search(int h[],int key)
{ int address, di;
address=key%P;
if(h[address]==key) //哈希表中元素与查找元素是否相等return 1;
else
{
for(di=1;di<=hashlen-1;di++)//哈希表中元素与查找元素不相等,查找下一元素
{
address=((key%P)+di)%hashlen;
if(h[address]==key)
{
return di+1;
break;
}
}
}
if(di>=hashlen)
return 0;
}
int main() //主函数{
printf("\t 哈希表:\n");
printf("\n");
Hash_Link();
}
7.运行与测试及结果
8.实验中所遇的问题及解决方法。