您所在位置: 网站首页 / 数据结构课件(c措辞)9.ppt / 文档详情
数据结构课件(c措辞)9.ppt 立即下载
2024-09-18
约2.3千字
约39页
0
373KB
举报 版权申诉
预览加载中,请您耐心等待几秒...

数据结构课件(c措辞)9.ppt

数据结构课件(c措辞)9.ppt

预览

免费试读已结束,剩余 34 页请下载文档后查看

16 金币

下载文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

1回顾把数据元素的关键码通过某种计算方法直接确它在数组中的存储位置8.4动态查找表2——哈希表查找4.哈希查找
又叫散列查找,利用哈希函数进行查找的过程叫哈希查找。(注意到哈希表建立的时候用哈希函数)8.4.2哈希函数的构造方法2.数字分析法例有80个记录,关键字为8位十进制数,哈希地址为2位十进制数,怎么取合适?3.平方取中法
构造:取关键字平方后中间几位作哈希地址
适于不知道全部关键字情况

例如,若关键码K=1234,哈希表长为1000,则有:K2=1522756,取中间3位227作为哈希地址。5.除留余数法
构造:取关键字被某个不大于哈希表表长m的数p除后所得余数作哈希地址,即
H(key)=keyMODp,pm
特点
简单、常用,可与上述几种方法结合使用
p的选取很重要;p选的不好,容易产生同义词【选取哈希函数应考虑的因素】

计算哈希函数所需时间
关键字长度
哈希表长度(哈希地址范围)
关键字分布情况
记录的查找频率8.4.3处理冲突的方法例表长为11的哈希表中已填有关键字为17,60,29的记录,
H(key)=keyMOD11,现有第4个记录,其关键字为38,
按三种处理冲突的方法,将它填入表中2.再哈希法
方法:构造若干个哈希函数,当发生冲突时,计算下一个哈希地址,即:Hi=Rhi(key)i=1,2,……k
其中:Rhi——不同的哈希函数
特点:计算时间增加例已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79)
哈希函数为:H(key)=keyMOD13,
用链地址法处理冲突8.4.4哈希查找过程及分析
1.哈希查找过程2.哈希查找分析
哈希查找过程仍是一个给定值与关键字进行比较的过程
评价哈希查找效率仍要用ASL
哈希查找过程与给定值进行比较的关键字的个数取决于:
哈希函数
处理冲突的方法
哈希表的填满因子
=表中填入的记录数/哈希表长度例已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79)
哈希函数为:H(key)=keyMOD13,哈希表长为m=16,
设每个记录的查找概率相等(2)用链地址法处理冲突8.4.5哈希表算法实现	1线性探测哈希表的建立
voidCreateSeqHTbl(datetypeSeqHTbl[],intm,datatype*eptr)
{/*用线性探测法处理冲突建立散列表SeqHTbl*/
/*eptr为待放入散列表中的数据基址*/
/*Hash()为散列函数,m为散列表的长度*/
intd;
for(i=0;i<m;i++)
SeqHTbl[i]=0;/*散列表初始化,设0表示空*/
while(eptr->data.key!=0)
{/*待放入散列表的元素,其关键码0表示结束*/
d=Hash(eptr->data.key);/*求当前元素的散列地址*/
	while(SeqHTbl[d]!=0)
d=(d+1)%m;
SeqHTbl[d]=*eptr;/*找到空单元,填装结点*/
eptr++;
}	
}2以线性探测法处理冲突构造的散列表中的查找
intReSeqHTbl(datetypeSeqHTbl[],intm,keytypekey)
{/*SeqHTbl散列表,散列函数Hash(),m为散列表的长度*/
/*查找关键码为key的元素,成功返回其地址,否则返回-1*/
intd,begin;/*求当前元素的散列地址,并将起始点记录在begin中*/
begin=d=Hash(key);
while(SeqHTbl[d].key!=0&&SeqHTbl[d].key!=key)
{d=(d+1)%m;		
if(d==begin){d=-1;break;}/*表满且查找失败*/
}
if(SeqHTbl[d].key==0)
d=-1;/*找到空单元,查找失败*/
returnd;/*查找成功返回的是地址,不成功为-1*/
}3拉链法哈希表的建立
存储结构:
typedefstructhnode
{datatypedata;	/*关键字*/
…	/*其它信息*/
structhnode*next;/*指向下一个同义词的指针*/
}HNode;
定义散列表(指针向量或指针数组):
#definem…/*m为散列表的容量*/
HNode*HashTbl[m];
以拉链法构造散列表的算法

voidCreateLHTbl(HNode*LHashTbl[m],datatype*eptr)
{/*用拉链法处理冲突建立散列表LHashTbl*/
/*eptr为待放入散列表中的数据基址,Hash()为散列函数*/
intd;
HNode*q;

for(i=0;i<m;i++)
LHashTbl[i]=NULL
查看更多
单篇购买
VIP会员(1亿+VIP文档免费下)

扫码即表示接受《下载须知》

数据结构课件(c措辞)9

文档大小:373KB

限时特价:扫码查看

• 请登录后再进行扫码购买
• 使用微信/支付宝扫码注册及付费下载,详阅 用户协议 隐私政策
• 如已在其他页面进行付款,请刷新当前页面重试
• 付费购买成功后,此文档可永久免费下载
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用