- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
哈希表
一、试验目的
学会哈希函数的构造措施,处理冲突的机制以及哈希表的查找。
二、试验内容
阐明如下概念
1、哈希函数
在一般状况下,需在关键字与记录在表中的存储位置之间建立一种函数关系,以f(key)作為关键字為key的记录在表中的位置,一般称这个函数f(key)為哈希函数。
1)哈希函数是一种映象,既:
将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超过容許范围既可;
2)由于哈希函数是一种压缩映象,因此,在一般状况下,很轻易产生“冲突”現象,既:key11key2,而f(key1)=f(key2)。
2、哈希表
根据设定的哈希函数f(key)和处理冲突的措施将一组关键字映像到一种有限的持续的地址集(区间)上,并以关键字在地址集中的“像”作為记录在表中的存储位置,这种表便称為哈希表,这一映像过程称為哈希造表或散列,所得存储位置称哈希地址或散列地址。
3、冲突及处理
1)冲突:对不一样的关键字也許得到同意哈希地址,既key11key2,而f(key1)=f(key2),这种現象称冲突(collision)。
2)处理措施:开放地址法。
4、哈希表的查找分析
从查找过程得知,哈希表查找的平均查找長度实际上并不等于零。
决定哈希表查找的ASL的原因:
1)选用的哈希函数;
2)选用的处理冲突的措施;
3)哈希表饱和的程度,装载因子α=n/m值的大小(n—记录数,m—表的長度)
一般状况下,可以认為选用的哈希函数是“均匀”的,则在讨论ASL時,可以不考虑它的原因。因此,哈希表的ASL是处理冲突措施和装载因子的函数。
可以证明:
查找成功時有下列成果:
线性探测再散列
随机探测再散列
从以上成果可見
哈希表的平均查找長度是a的函数,而不是n的函数。这阐明,用哈希表构造查找表時,可以选择一种合适的装填因子a,使得平均查找長度限定在某个范围内。
5、哈希函数C語言代码
/*计算哈希地址,插入哈希表*/
intInsertHash(HashTable*H,inte,intd[]){
intk,i=1;
k=e%P;
while(H-data[k].flag==TRUE||k0){
k=(e%P+d[i])%MAXSIZE;i++;
if(i=15)
returnERROR;
}
H-data[k].key=e;
H-data[k].flag=TRUE;
H-count++;
returnOK;
}
/*构造哈希表*/
intCreateHash(HashTable*H,intds[],intlen,intd[]){
inti;
for(i=0;ilen;i++){
if(SearchHash(H,ds[i],d)!=-1)
returnDUPLICATE;
InsertHash(H,ds[i],d);
if(H-count=MAXSIZE)
returnERROR;
}
returnOK;
}
/*初始化哈希表*/
voidInitHash(HashTable*H){
inti;
for(i=0;iMAXSIZE;i++){
H-data[i].key=0;
H-data[i].flag=FALSE;
}
}
/*在哈希表中查找*/
intSearchHash(HashTable*H,inte,intd[]){
intk,i=1;
k=e%P;
while(H-data[k].key!=e){
k=(e%P+d[i])%MAXSIZE;i++;
if(i=15)
return-1;
}
returnk;
}
运行成果:
文档评论(0)