查找nullnull2.对分查找021611222527334256778179举例:K=39K>33
low=mid+1K02
low=mid+1K>11
low=mid+1经过与关键字33, 16, 02, 11的比较,查找失败nulln=13的折半查找判定树71. .68. .133101. .24. .68. .911. .131581224691113nulltypedef struct
{ int key;
datatype info;
}rec; int binsearch(rec r[], int n, in...
nullnull2.对分查找021611222527334256778179举例:K=39K>33
low=mid+1K<56
high=mid-139经过与关键字33, 56, 39的比较,查找成功K==39
查找成功nullK<16
high=mid-102161122252739334256778179举例,K=13K<33
high=mid-1K>02
low=mid+1K>11
low=mid+1经过与关键字33, 16, 02, 11的比较,查找失败nulln=13的折半查找判定树71. .68. .133101. .24. .68. .911. .131581224691113nulltypedef struct
{ int key;
datatype info;
}rec; int binsearch(rec r[], int n, int k)
{ int low,high,mid,found;
low=1; high=n; found=0;
while((low<=high)&&(found==0))
{ mid=(low+high)/2;
if(k>r[mid].key) low=mid+1;
else if(k==r[mid].key) found=1;
else high=mid-1;
}
算法:if(found==1)
return mid;
else
return 0;
}null3.分块查找int blocksearch(rec r[], ref nd[], int b, int k, int n)
{ int i=1,j;
while((k>nd[i].key)&&(i<=b))
i++;
if(i>b)
{ cout<<“not found”;
return 0; }
j=nd[i].link;
while((j
data) return 1;
else if(kdata)
{ q=p; p=p->lchild;
else{q=p; p=p->rchild;}
}
s=new JD;
s->data=k;
s->lchild=s->rchild=NULL; if(t==NULL)
t=s;
else if(kdata)
q->lchild=s;
else
q->rchild=s;
return 0;
}
null5.哈希查找(1)思想:在记录的存储地址和它的关键字之间建立一个确定的对应关系,这样,不经过比较, 一次存取就能得到所查元素。哈希函数:在记录的关键字与记录的存储地址之间
建立的一种对应关系。
哈希函数可写成:addr(ai)=H(ki),ai为一个记录,ki
为关键字。哈希查找:利用哈希函数进行查找的过程。null举例,一组关键字:
S={ZHAO,QIAN,SUN,LI,CHEN,DIAO,MA,BAI,OU,NAN,
TANG,JIN,XIAO,WU,GAO,YI }
哈希函数:
关键字的第一个字符
在字母中的位序-1
null哈希表的存储结构:
用一维数组HT[m]存放n个元素:n:表长
m:哈希表的容量(m>n),
哈希地址空间:0..m-1
=n/m < 1:装填系数,一般取为0.65~0.85装填系数反映了哈希表的装满程度,是影响哈希表查找性能的重要参数 。null哈希表需要解决的两个问:
1. 哈希函数H( )的构造:
2. 解决冲突问题:
冲突:H(Key1)==H(Key2), 且Key1Key2
不同的记录争夺同一个哈希地址;
Key1与Key2称为同义词null(2)哈希函数的构造直接定址法
数字分析法
平方取中法
除留余数法
折叠法
随机数法一、直接定址法取关键字或关键字的某个线性函数值为哈希地址:
H(key)= key 或 H(key)= a×key+b
举例:学生档案,地址空间: 000..999
H(k)=k-98015001 特点:一般不会发生冲突,但适用面比较窄一、直接定址法二、数字分析法二、数字分析法取关键字的若干位或其组合作哈希地址。
适用于关键字位数比哈希地址位数大的情况。
例:7个学生的学号为 5 4 2 4 2 2 2 4 1
5 4 2 8 1 3 6 7 8
5 4 2 2 2 8 1 7 1
5 4 2 3 8 9 6 7 1
5 4 2 5 4 1 5 7 7
5 4 2 8 8 5 3 7 6
5 4 2 1 9 3 5 5 2
哈希地址4 2 2
8 3 6
2 8 1
3 9 6
5 1 5
8 5 3
1 3 5三、平方取中法三、平方取中法取关键字平方后中间几位作哈希地址。
适用于关键字每一位上对某些数字的重复频率较高
四、除留余数法四、除留余数法对关键字取模作为哈希函数,即:
H(key)=key mod p
除数p的选择不当将会导致很多同义词出现;
p一般取小于或等于表长的最大质数。五、折叠法五、折叠法将关键字分为几段,除最后一段外,其余各段都等长,
将各段相加作为哈希地址,
相加的方法有两种:
移位叠加:各段向右靠齐相加。
边界叠加:将奇数字段或偶数字段倒排后相加。六、随机数法取关键字的随机函数值作为哈希地址,即
H(key)=random(key)
适用于关键字长度不等的情况。null(3)解决冲突的方法 两个不同的关键字得到相同的哈希地址称为“冲突”,
这两个关键字称为同义词,解决冲突就需要寻找别的
地址。①开放地址法②链地址法null①开放定址法
当冲突发生时,形成一个探查序列,沿此序列逐个地址探查,直到找到一个空位置,将发生冲突的记录放在该地址中。
探测序列:
Hi=(H(key)+di) mod m
i=1,2,...,k(k<=m-1)
H(key)---hash函数值
di ---增量序列
m ---哈希表长null增量di的三种取法:
(1)线性探测再散列
di=1,2,3,…,m-1
(2)二次探测再散列
di=12,-12,22,-22,…,k2,-k2 (k≤m/2)
(3) 随机探测再散列
di=随机数序列,null②链地址法方法:将所有关键字为同义词的记录存储在一个单链表中,并用一维数组存放头指针。H(key)=key mod 13null哈希查找过程:给定k值计算H(k)此地址为空?关键字=k?按处理冲突的
方法计算HiNN查找失败查找成功YYnull
本文档为【查找】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。