- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
课程设计报告
问题描述:
(1) 散列法中,散列函数构造方法多种多样,同时对于同一散列函数解决冲突的方法也可以不同。两者是影响查询算法性能的关键因素。
(2) 程序实现几种典型的散列函数构造方法,并观察,不同的解决冲突方法对查询性能的影响。
a. 需求分析:
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。
散列表的查找过程基本上和造表过程相同。一些关键码可通过散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。对散列表查找效率的量度,依然用平均查找长度来衡量。查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。该课程设计要求比较几种哈希函数的构造方法和解决冲突的方法对查询性能的影响。
b. 概要设计
该程序实现对哈希函数的构造方法、处理冲突的方法及在哈希表中查找数据的功能。
用线性再散列方法建立哈希表,用代码实现为:
typedef struct
{
int key;
int si;
}HashTable1;
void CreateHashTable1(HashTable1 *H,int *a,int num)//哈希表线性探测在散列;
{
int i,d,cnt;
for(i=0;iHashSize;i++)
{
H[i].key=0;
H[i].si=0;
}
for(i=0;inum;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(\n线性再探索哈希表已建成!);
}
用二次探测再散列建立哈希表,代码实现如下:
void CreateHash3(HashTable3 *h,int *a,int num)//二次探索表
{
int i,p=-1,c,pp;
for(i=0;inum;i++)
{
c=0;
p=a[i]%HashSize;
pp=p;
while(h-elem[pp]!=NULL)
{
pp=Collision(p,c);
if(pp0)
{
printf(第%d个记录无法解决冲突\n,i+1);
continue;
}
}
h-elem[pp]=(a[a[i]]);
h-count++;
printf(第%d个记录冲突次数为%d\n,i+1,c);
}
printf(\n建表完成!\n此哈希表容量为%d,当前表内存储的记录个数%d.\n,HashSize,h-count);
}
二次探测再散列法解决冲突
int Collision(int p,int c)
{
int i,q;
i=c/2+1;
while(iHashSize)
{
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 (-1);
}
用线性再散列法查找,代码实现如下:
void SearchHash1(HashTable1 *h,int data)
{
int d;
d=data%HashSize;
if(h[d].key==data)
printf(数字%d的探查次数为:%d\n,h[d].key,h[d].si);
else
{
do
d=(d+1)%HashSize;
文档评论(0)