散列法的实验研究课程设计报告

课程设计报告问题描述:(1)散列法中,散列函数构造方法多种多样,同时对于同一散列函数解决冲突的方法也可以不同。两者是影响查询算法性能的关键因素。(2)程序实现几种典型的散列函数构造方法,并观察,不同的解决冲突方法对查询性能的影响。a.需求分析:散列表(Hashtable,也叫哈希表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。散列表的查找过程基本上和造表过程相同。一些关键码可通过散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。对散列表查找效率的量度,依然用平均查找长度来衡量。查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。该课程设计要求比较几种哈希函数的构造方法和解决冲突的方法对查询性能的影响。b.概要设计该程序实现对哈希函数的构造方法、处理冲突的方法及在哈希表中查找数据的功能。用线性再散列方法建立哈希表,用代码实现为:typedefstruct{intkey;intsi;}HashTable1;voidCreateHashTable1(HashTable1*H,int*a,intnum)//哈希表线性探测在散列;{inti,d,cnt;for(i=0;i<HashSize;i++){H[i].key=0;H[i].si=0;}for(i=0;i<num;i++){cnt=1;d=a[i]%HashSize;if(H[d].key==0){H[d].key=a[i];H[d].si=cnt;}else{do{d=(d+1)%HashSize;cnt++;}while(H[d].key!=0);H[d].key=a[i];H[d].si=cnt;}}printf(\线性再探索哈希表已建成!);}用二次探测再散列建立哈希表,代码实现如下:voidCreateHash3(HashTable3*h,int*a,intnum)//二次探索表{inti,p=-1,c,pp;for(i=0;i<num;i++){c=0;p=a[i]%HashSize;pp=p;while(h->elem[pp]!=NULL){pp=Collision(p,c);if(pp<0){牰湩晴尨第%d个记录无法解决冲突\n,i+1);continue;}}h->elem[pp]=(a[a[i]]);h->count++;牰湩晴尨第%d个记录冲突次数为%d\n,i+1,c);}printf(\建表完成!\n此哈希表容量为%d,当前表内存储的记录个数%d.\n,HashSize,h->count);}二次探测再散列法解决冲突intCollision(intp,intc){inti,q;i=c/2+1;while(i<HashSize){if(c%2==0){c++;q=(p+i*i)%HashSize;if(q>=0)returnq;elsei=c/2+1;}else{q=(p-i*i)%HashSize;c++;if(q>=0)returnq;elsei=c/2+1;}}return(-1);}用线性再散列法查找,代码实现如下:voidSearchHash1(HashTable1*h,intdata){intd;d=data%HashSize;if(h[d].key==data)牰湩晴尨数字%d的探查次数为:%d\n,h[d].key,h[d].si);else{dod=(d+1)%HashSize;while(h[d].key!=datad<HashSize);if(d<HashSize)牰湩晴尨数字%d的探查次数为:%d\n,h[d].key,h[d].si);else牰湩晴尨没有查找到你所输入的数\n);}用二次探测再散列法查找voidSearchHash2(HashTable2*h[],intdata,intnum){intd;Node*q;d=data%num;q=h[d]->link;while(q->key!=dataq->next!=NULL)q=q->next;if(q->next!=NULL)牰湩晴尨数字%d的查找次数为:%d\n,q->key,q->next);else牰湩晴尨没有找到你要查找的那个数\n);}用链地址法查找,代码实现如下:voidCreateHashTable2(HashTable2*ht[],int*a,intnum)//哈希表链地址;{inti,d,cnt;Node*s,*q;for(i=0;i<num;i++){ht[i]=(HashTable2*)malloc(sizeof(HashTable2));ht[i]->link=NULL;}for(i=0;i<num;i++){cnt=1;s=(Node*)malloc(sizeof(Node));s->key=a[i];s->next=NULL;d=a[i]%num;if(ht[d]->link==NULL){ht[d]->link=s;s->si=cnt;}else{q=ht[d]->link;while(q->next!=NULL){q=q->next;cnt++;}cnt++;s->si=cnt;q->next=s;}}}c.详细设计(1)程序中结构体的定义typedefstruct{intkey;intsi;}HashTable1;typedefstr...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

文秘专家
机构认证
内容提供者

1

确认删除?