数据结构第7章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
顺序表的存储结构如下:
typedef strict {
ElemType *elem;
// 存储空间基址,建表时按照实际长度分配,0号 单元不用
int length;
// 顺序表长度
}STable;
查找可分为静态查找和动态查找两大类。 静态查找是指在查找时只对数据元素进行查询和检 索。 动态查找除包括静态查找的要求外,还包括插入数 据元素集合中不存在的数据元素,或者从数据元素集合 中删除已存在的某个数据元素。 静态查找时构造的存储结构称作静态查找表。 动态查找时构造的存储结构称作动态查找表。
折半查找的查找过程是:
首先确定待查记录所在的范围,然后逐渐缩小范围直 到查到或者查不到结果为止。假设指针low指向待查记录 所在范围的下界ST.elem[1],指针high指向待查记录所在 范围的上界ST.elem[ST.length],指针mid指向待查记录 所在范围的中间位置,即mid = (low + high)/2。用给定 值key与mid指定的值ST.elem[mid]相比较。若相等,则表 示查找成功;若不相等,则缩小范围,直到新的mid值等 于给定值或者查找区间的大小小于零时为止。
【例7-1】 已知如下10个数据元素的有序表(关键字即为数 据元素的值)
7,18,25,37,54,62,76,80,89,98 要求查找关键字为25和85的数据元素。 解:首先看给定值key=25的查找过程: (1)令指针low指向第1个元素,指针high指向第10个数据元素, 此时mid=┗(1+10)/2┛=5。
2020年5月22日星期五
int Search_Seq(STable ST, KeyType key) { // 在顺序表ST中顺序查找其关键字等于key的数据元 素 i=0; ST.elem[0].key=key; // 设置监视哨 for (i=ST.length; ST.elem[i].key!=key; --i); // 从后往前找 retirn i; // 找不到时,i为0
2020年5月22日星期五
查找算法的基本操作也就是“将记录的关键字和 给定值进行比较”,比较的次数依赖于这个数据元素 在结构中所处的位置。
为了确定要查找的记录位置,与给定值进行比较 的关键字个数的期望值称为查找算法在查找成功时的 平均查找长度ASL(average search length)。对于含 有n个记录的表,平均查找长度的计算公式为:
2020年5月22日星期五
7.1 基本概念与术语
关键字:是数据元素(或记录)中某个数据项的值, 用它可以标识(识别)一个数据元素(或记录)。
若此关键字可以唯一地标识一个记录,则称此关键 字为主关键字(primary key),不同的记录其主关键 字不同,反之,称用以识别若干记录的关键字为次关 键字(secondary key)。
2020年5月22日星期五
7.2.1 顺序查找
顺序查找适用于线性表的顺序存储结构,也适用于 链式存储结构,表内的数据元素是无序的。
顺序查找的查找过程为: 从顺序表中的最后一个记录开始,逐个进行记录的 关键字和给定值的比较,若某个记录的关键字和给定值 比较后相等,则查找成功,找到所查记录;如果直至第 一个记录,关键字和给定值比较都不等,则表明表中没 有所查找的记录,查找失败。 查找算法描述如算法7.1所示。
查找(searching):根据给定的某个值,在表中 确定一个关键字等于给定值的记录或数据元素。
2020年5月22日星期五
2020年5月22日星期五
7.2 顺序表的查找
当顺序表作为线性表的存储结构时,存储结点间 的位置关系与对应数据元素之间的逻辑关系(邻接关 系)是一致的,即数据元素在线性表中的次序与它们 在顺序表中次序相同。
序号 1 2 3 4 5 6 7 8 9 10 关键字 7 18 25 37 54 62 76 80 89 90
} // Search_Seq 算法 7.1
2020年5月22日星期五
在查找之前先将ST.elem[0]的关键字赋值key,则 ST.elem[0] 在此起到了哨兵的作用。目的是避免在查 找的每一步都要判断整个表是否查找完毕,即在for循 环中省去了判定下标越界的条件,提高了算法的效率。 ST.elem[i].key表示第i个记录的关键字,ST.length表 示顺序表中元素的个数,key为查找的对象。
第7章 查找表
本章概述
“查找”是日常生活中常有的事,人们几乎每天 都要做“查找”工作。例如,在电话号码簿中查找某 单位或某人的电话号码;在阅读文献时查阅字典以确 定某个词的含义;在程序设计中,查找也是一种常用 的基本运算,如编译程序中符号表的查找、信息处理 系统中信息的查找等。因此,如何高效率地实现查找 运算是查找表的基本问题,也是本章的重点内容。
=Pn =1/n。对于等概率的查找,其平均查找长度的计
算公式可简化为:
n
AS百度文库 =
PiCi =
i 1
1
n
n i 1
Ci
=
1n (n i 1)
n i1
= n 1 2
2020年5月22日星期五
查找算法的平均查找长度应是查找成功时的平均查找长
度与查找不成功时的平均查找长度之和的一半。如果查找不
2020年5月22日星期五
n
ASL PiCi i1
n
其中,Pi为查找第i个记录的概率, Pi 1 ; i 1
Ci为在表中找到其关键字与给定值相等的第i个记 录时,和给定值已进行过比较的关键字个数。一般 情况下,Ci等于n﹣i+1。
2020年5月22日星期五
若 查 找 每 个 元 素 的 概 率 相 同 , 即 为 P1=P2 =…
成功,比较次数为n+1。假设查找成功与不成功的可能性相
同,则 ASL =
1 1 n (n i 1) 1 (n 1)
2 n i1
2
= 3 (n 1) 4
2020年5月22日星期五
7.2.2 有序表的折半查找
2020年5月22日星期五
折半查找又称为二分查找,是一种效率较高的查找 方法,它要求线性表的结点必须是按关键字非递减(或非 递增)的次序排列的,并采用顺序结构存储。