第7 章 查找技术

本章的主要内容是:
查找的基本概念
线性表的查找技术
树表的查找技术
散列表的查找技术

7.1 概述
1.查找的基本概念
关键码:可以标识一个记录的某个数据项。
键值:关键码的值。
主关键码:可以唯一地标识一个记录的关键码。
次关键码:不能唯一地标识一个记录的关键码。
查找:在具有相同类型的记录构成的集合中找出满足给定条件的记录。
查找的结果:若在查找集合中找到了与给定值相匹配的记录,则称查找成功;否则,称查找失败。
静态查找:不涉及插入和删除操作的查找。动态查找:涉及插入和删除操作的查找。
查找结构:面向查找操作的数据结构,即查找基于的数据结构。
本章讨论的查找结构
线性表:适用于静态查找,主要采用顺序查找技术、折半查找技术。
树表:适用于动态查找,主要采用二叉排序树的查找技术。
散列表:静态查找和动态查找均适用,主要采用散列技术
平均查找长度:将查找算法进行的关键码的比较次数的数学期望值定义为平均查找长度。

7.2 线性表的查找技术
1.顺序查找(线性查找)
基本思想:从线性表的一端向另一端逐个将关键码与给定值进行比较,若相等,则查找成功,给出该记录在表中的位置;若整个表检测完仍未找到与给定值相等的关键码,则查找失败,给出失败信息。
int SeqSearch1(int r[ ], int n, int k)
//数组r[1] ~ r[n]存放查找集合
{
i=n;
while(i>0&&r[i]!=k)
i–;
returni;
}
2.折半查找的基本思想
int BinSearch1(int r[ ], int n, int k)
//数组r[1]~r[n]存放查找集合
{
low=1;high=n;
while(low<=high)
{
mid=(low+high)/2;
if(k<r[mid])high=mid-1;
elseif(k>r[mid])low=mid+1;
elsereturnmid;
}
return0;}
7.3 树表的查找技术
1.二叉排序树
二叉排序树(也称二叉查找树):或者是一棵空的二叉树,或者是具有下列性质的二叉树:
⑴若它的左子树不空,则左子树上所有结点的值均小于根结点的值;
⑵若它的右子树不空,则右子树上所有结点的值均大于根结点的值;
⑶它的左右子树也都是二叉排序树。
7.4 散列表的查找技术
散列表:采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表。
散列函数:将关键码映射为散列表中适当存储位置的函数。
散列地址:由散列函数所得的存储位置址。
冲突:对于两个不同关键码ki≠kj,有H(ki)=H(kj),即两个不同的记录需要存放在同一个存储位置,ki和kj相对于H称做同义词。
1.散列函数——直接定址法
2.散列函数——除留余数法
3.散列函数——数字分析法
4.散列函数——平方取中法
5.散列函数——折叠法
6.处理冲突的方法——开放定址法
线性探测法
当发生冲突时,从冲突位置的下一个位置起,依次寻找空的散列地址。
对于键值key,设H(key)=d,闭散列表的长度为m,则发生冲突时,寻找下一个散列地址的公式为:
Hi=(H(key)+di)% m(di=1,2,…,m-1)
用开放定址法处理冲突得到的散列表叫闭散列表。
二次探测法
当发生冲突时,寻找下一个散列地址的公式为:
Hi=(H(key)+di)% m
随机探测法
当发生冲突时,下一个散列地址的位移量是一个随机数列,即寻找下一个散列地址的公式为:
Hi=(H(key)+di)%m
(di是一个随机数列,i=1,2,……,m-1)
7.处理冲突的方法——拉链法(链地址法)
8.处理冲突的方法——公共溢出区

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值