查找的基本概念

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上一页 下一页 返回
9.2 静态查找
[例9-2]关键字集合为:95,43,14,30,78,8,62,,49,35, 71,22,83,18,52。
设可以按照某中规律分为3个数据块,第一块为14,30,8,22,18; 第二块为43,62,49,35,52;第三块为95,78,71,83。
可以看出,关键字按块有序。因此,每块建立一个索引项,最大关键字 值和块的起始地址:(30,1),(62,6),(95,11)。索引表和 查找表如图9-4所示。
/*从表头端向后查找*/
if(i<=n)
return i;
else
return 0;
}
上一页 下一页 返回
9.2 静态查找
对于含有n个记录的线性表,假设对表中每个记录的查找概率相同,即 Pi=1/n(i=1,2,……n),查找表中第i个记录所需进行的比较次数为Ci=i 。因此,顺序查找算法查找成功的平均查找长度为
上一页 下一页 返回
9.2 静态查找
可以看出,查找表中任一元素的过程,即是判定树中从根到该元素结点 路径上各结点关键字的比较次数,也是该元素结点在树中的层次数。对 于n个结点的判定树,树高为k,则有2k-1-1<n≤2k-1,即k1<log2(n+1)≤k,所以,k=log2(n+1)。因此折半查找在查找成功时,所 进行的关键字比较次数至多为log2(n+1)。
9-1中“学员”“姓名”“年”等。数据项有名和值之分,数据项名是 一个数据项的标识,用变量定义,而数据项值是它的一个可能取值,表 中“20090584”是数据项“学号”的一个取值。数据项具有一定的类 型,依数据项的取值类型而定。
下一页 返回
9.1 查找的基本概念
2. 组合项 由若干数据项构成,表中“出生日期”就是组合项,它由“年”“月
讨论折半查找的平均查找长度,以树高为k的满二叉树(n=2k-1)为例。假 设表中每个元素的查找是等概率的,即Pi=1/n,则树高的第i层最多为2i1个结点,因此,折半查找的平均查找长度为
n
ASL PiC i [1 20 2 21L k 2k1 ]/n i=1 (n 1)(log2 (n 1) 1) / n ≈ log2 (n 1) 1
else low=mid+1;
/*调整到右半区*/
}
return 0;
}
[例9-1]顺序存储的有序表关键字排列为:03,12,18,21,37,56 ,64,78,80,89,95。用折半查找法在表中查找关键字为21和81的 数据元素。
① 查找关键为21的过程如图9-1所示。
由图9-1可见,21与mid所指元素的关键字相等,查找成功。
上一页 下一页 返回
9.2 静态查找
分块查找由索引表查找和块查找两步完成。设n个数据元素的查找表分
为m块,且每块均为7个元素,则t=
n m
。这样,分块查找的平均查找长
度为
ASL
ASL索引表
ASL块
1 2
(m
1)
1 2
n m
1
1 2
m
n m
1
可见,平均查找长度不仅和表的总长度n有关,而且和所分的块数m有 关。一般情况下,分块查找的时间复杂度是O(m+n),其中m是块长度 ,n是查找表的长度。
第9章 查找
1 9.1 查找的基本概念
2 9.2 静态查找
3 9.3 动态查找
4
9.4 哈希查找
5
9.5 本章小结
第9章 查找
查找又称为检索,是指在某种数据结构中找出满足给定条件的元素。在 日常工作中,会经常进行各种各样查找。例如,在英汉词典中查找某个 英文单词的中文解释;在新华字典中查找某个汉字的读音、含义……计 算机及计算机网络的广泛应用使得信息查询更快捷、方便、准确。要从 计算机中查找特定的信息,就需要在计算机中存储包含该特定信息的表 。例如,要从计算机中查找英文单词的中文解释,就需要存储类似英汉 词典这样的信息表,以及对该表进行的查找操作。
下一页 返回
9.2 静态查找
int SeqSearch(ElemType SeqList[],KeyType kx,int n)
{/*在SeqList[1]到SeqList[n]只查找关键字为kx的记录*/
int i=1;
while(i<=n&&SeqList[i].key!=kx)
i++;
上一页 下一页 返回
9.1 查找的基本概念
5. 查找表 查找表是由具有同一类型(属性)的数据元素(记录)组成的集合,分
为静态查找表和动态查找表两种。 静态查找表:仅对查找表进行查找操作,而不能改变的表。 动态查找表:对查找表除进行查找操作外,可能还要进行向表中插入数
据元素或删除表中数据元素的表。 6. 查找 在查找表中查找关键字为某一给定值的数据元素(记录)的过程称为查
找。若表中存在一个这样的数据元素(记录),则称查找成功;反之, 称查找失败。 在查找过程中,如果查找的是主关键字,由于主关键字唯一,所以查找 结果也是唯一的,一旦找到,查找成功,并给出找到的数据元素(记录 )的信息;如果整个查找没有找到相关的数据元素(记录),则查找失 败,应给出一个“空记录”或返回查找失败的信息。
9.2.1 顺序查找 顺序查找(Sequential Search)是一种最简单的查找方法。它的基本
思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和 给定值K相比较,若相等,则查找成功;若整个表扫描完毕,仍未找到 关键字等于key的记录,则查找失败。 顺序查找既适用于顺序表,也适用于链表。若用顺序表,查找可从前往 后扫描,也可以,从后往前扫描。若采用单链表,则只能从前往后扫描 。 假设有n个记录,存放在顺序表SeqList的SeqList[1]——SeqList[n]中 ,要查找关键字为kx的记录,算法如下。
② 查找关键字为81的过程如图9-2所示。
上一页 下一页 返回
9.2 静态查找
由图9-2可见,low>high,即查找区间为空,说明查找失败。 查找过程的判定树
为了分析折半查找的性能,可以用二叉树来描述折半查找过程。把当前 查找区间的中点作为根结点,前半区间和后半区间分别作为根的左子树 和右子树,前半区间再按类似的方法,由此得到二叉树称为折半查找的 判定树。例如,[例9-1]给定的关键字序列的判定树如图9-3所示。 从 图9-3可见,查找21的过程是从根到结点4的路径;查找81,应在结点10 的左子树上,但其左子树为空,故失败。
所以,折半查找的时间复杂度为O(log2n)。
上一页 下一页 返回
9.2 静态查找
9.2.3 分块查找 折半查找速度快,但要求查找表有序;顺序查找不要求查找表有序,但
速度慢。分块查找又称索引顺序查找,其效率介于顺序查找和折半查找 之间。 分块查找要求将线性表中的元素均匀地分成若干块,每一块中的元素可 以是任意排序的,但块与块之间是有序的,即后一个块中所有记录的关 键字都应该比前一块中所有记录的关键字大。此外还需要建立一个“索 引表”,给每个块建立一个索引项,每个索引项包含两项内容:关键字 项(其值为该块内的最大关键字)和指针项(存放指向对应块的起始地 址)。这样,索引表则是按关键字是有序的。查找时分两步进行:先根 据给定值在索引表中查找,以确定的要查找的数据元素属于查找表中的 哪一块,由于索引表按关键字有序,因此可以顺序查找或折半查找,然 后,再进行块内查找,因为块内可以无序,只能进行顺序查找。
本章介绍查找的基本概念、不同数据结构对应下的查找方法及查找效率 的分析等。
下一页 返回
9.1 查找的基本概念
假设在一个线性表——学生招生录取登记表里有若干学生的记录,每个 学生记录包括:学号、姓名、性别、出生年月、来源、总分、录取专业 7个数据项(如见9-1)。
1. 数据项(也称项或字段) 数据项是具有独立含义的标识单位,是数据不可分割的最小单位,如表
上一页 下一页 返回
9.1 查找的基本概念
8. 数据元素及关键字类型定义 typedef struct {keytype key; …… }Elemtype;
/*关键字*/ /*其他信息*/
上一页
返回
9.2 静态查找
静态查找是最简单的一种查找方式,适用于对小型查找表的查找,可以 采用顺序查找技术、折半查找技术和分块查找技术。
方法。但是,折半查找要求线性表是有序表,即表中记录按关键字有序 。下面的讨论中,假设有序表是递增有序的。 折半查找的基本思路是:首先以整个查找表作为查找范围,用查找条件 中的给定值key与中间位置记录的关键字比较,若相等,则查找成功; 否则,根据比较缩小查找范围。如果key的值较小,根据查找表的有序 表可知查找的数据元素可能在表的前半区,继续对前半区进行折半查找 ;若key的值较大,则可以判定查找的数据元素可能在表的后半区,继 续对后半区进行折半查找。 每进行一次折半查找,要么查找成功,结束查找;要么将查找范围缩小 一半,如此重复,直到查找成功或查找范围缩小到空,即查找失败。
上一页 下一页 返回
9.1 查找的基本概念
7. 平均查找长度(ASL)
为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的平 均值称为查找算法成功的平均查找长度ASL。
设某一数据结构共有n个元素,则查找此结构中某一元素的平均查找长
度为 n
ASL=
PiC i
i1
式中,Pi为查找第i个元素的概率,这里讨论查找所有记录的概率均等的 情况,即Pi=1/n,Ci为查找第i个元素的比较次数
/*设置初始区间*/
while(low<=high)
/*查找区间非空*/
{ mid=(low+high)/2;
/*取区间中点*/
if(kx = =binarylist[mid].key)
return mid;
/*查找成功,返回mid*/
上一页 下一页 返回
9.2 静态查找
else if(kx<binarylist[mid].key) high=mid-1; /*调整到左半区*/
如果要在上述关键字集合中查找出49这个记录时,首先顺序查找索引表 (也可以折半查找),即同第一项30比较;因为49>30,则接着同第二 项比较;因为49<62,如果有49存在就必在第二块对应的块中,所以查 找索引表结束。接着按着顺序查找查找表中指针为6开始的块,因关键 字为49的记录位于该块第3个位置,所以经过3次比较后查找成功。
ASL = = =
n
sq PiCi i1
1 n i n i1
(n 1) 2
约为表长度的一半。 由此可见,顺序查找方法虽然简单,但查找效率低。 顺序查找算法的时间复杂度为O(n)。
上一页 下一页 返回
9.2 静态查找
9.2.2 折半查找 折半查找(Binary Search)又称二分查找,它是一种效率较高的查找
上一页
返回
9.3 动态查找
动态查找的特点是:表结构本身是在查找过程中动态生成的,不但要查 找记录,还要不断地插入或删除记录。本节将讨论利用树结构存储记录 的查找算法。
9.3.1 二叉排序树 1. 二叉排序树的定义 二叉排序树(Binary Sort Tree)又称二叉查找树,它或者是一棵空的
上一页 下一页 返回
9.2 静态查找
折半查找算法如下:
int BinarySearch(ElemType BinaryList[],KeyType kx,int n)
{/*在有序表BinaryList[1]—Binary List[n]中查找关键字为kx的记录*/
int mid;
int பைடு நூலகம்ow=1,high=n;
”“日”3项组成。 3. 数据元素(记录) 数据元素是由若干数据项、组合项构成的数据单位,是在某一问题中作
为整体进行考虑和处理的基本单位。数据元素有型和值之分,表中数据 项名的集合,即表头部分就是数据元素的类型;而一个学生对应的一行 数据就是一个数据元素的值,表中全体学生即为数据元素的集合。 4. 关键字 关键字是数据元素(记录)中某个数据项或组合项的值,用它可以标识 一个数据元素(记录)。能唯一确定一个数据元素(记录)的关键字, 称为主关键字;而不能唯一确定是一个数据元素(记录)的关键字,称 为次关键字。表中“学号”即可看成主关键字,“姓名”则应视为次关 键字,因可能有同名同姓的学生。
相关文档
最新文档