第九章静态查找表
数据结构教程 第5版 第9章-查找

4、影响查找的因素
采用何种查找方法? 使用哪种数据结构来表示“表”,即表中记录是按何种方式组织的? 表中关键字的次序。是对无序集合查找还是对有序集合查找?
5/51
5. 查找方法的性能指标
查找运算时间主要花费在关键字比较上,通常把查找过程中执行的关键字平均 比较个数(称为平均查找长度)作为衡量一个查找算法效率优劣的标准。
int BinSearch(RecType R[],int n,KeyType k)
{
int low=0,high=n-1,mid;
while (low<=high)
//当前区间存在元素时循环
{ mid=(low+high)/2;
if (R[mid].key==k) //查找成功返回其逻辑序号mid+1
1
1
4
2
3
3
2
姓名 张三 李四 王五 刘六
存储
姓名 张三 李四 王五 刘六
学 生 表
学号 1 4 3 2
地址 0 1 2 3
索引表
学号 1 2 3 4
地址 0 3 2 1
提取
排序
38/51
存储地址
0 1 2 3
主数据表
学号 1 4 3 2
姓名 张三 李四 王五 刘六
索引表
学号 1 2 3 4
地址 0 3 2 1
36/51
9.2.3 索引存储结构和分块查找 1、索引存储结构
索引存储结构 = 主数据表 + 索引表
索引表中的每一项称为索引项,索引项的一般形式是: (关键字,地址)
关键字唯一标识一个记录,地址作为指向该关键字对应记录的指针,也可以 是相对地址。
第九章 查找

} // Search_Seq
例:在顺序查找表中查找key=8的关键字 ST.elem
0 8 1 100 2 10 3 0 4 8 i 5 1 6 3 7 7
查找成功 i=4
9.1.1 顺序表的查找性能分析
等概率下查找成功的平均查找长度:Pi=1/n;Ci=n-i+1,
1 ASLSS n
(n i 1)
9.1.2 有序表的查找的性能分析
•判定树:用二叉树描述折半查找过程,树中每个结点表示一个 记录,结点值为该记录在表中的位臵,结点所在的层次表示查找 该值需要进行的比较次数。则有如下的表:
位臵 0 1 2 3 4 5 6 7 8 9 10 11
05 13 19 21 37 56 64 75 80 88 92
} // Search_Seq
例:在顺序查找表中查找key=8的关键字 ST.elem
0 8 1 100 2 10 3 0 4 8 5 1 6 3 i 7 7
9.1.1 顺序表的查找
适用场合:以顺序表表示静态查找表,表内元素无序。
思想:从表中最后一条记录起,逐个比较记录关键字与给定值, 若相等查找成功;反之,直至与第一条记录不等,查找不成功 int Search_Seq( SSTable ST, KeyType key ) { ST.elem[0]. key = key;//哨兵 for ( i = ST.length ; ! EQ(ST.elem[i]. key, key ) ; - - i ); return i;
比较次数 0 3 4 2 3 4 1 3 4 2 3 4
查找的定义和术语(2)
“特定的”数据元素 关键字(Key):数据元素中某个数据项的值,用以标识一个 数据元素 主关键字(Primary Key):可以唯一标识一个记录的关键 字 次关键字(Secondary Key):用以识别若干记录的关键 字 查找(Searching):根据给定值,在查找表中确定一个其关 键字等于给定值的数据元素或记录. 查找成功(Searching Success):若存在这一记录,给 出该记录信息或指示该记录在表中的位臵 查找不成功(Searching Failed):若查找表中不存在这 一记录,给出“空记录”或“空指针”。
第九章 查找表

第九章查找表查找表是由同一类型的数据元素(或记录)构成的集合。
对查找表经常进行的操作:1)查询某个“特定的”数据元素是否在查找表中;2)检索某个“特定的”数据元素的各种属性;3)在查找表中插入一个数据元素;4)从查找表中删去某个数据元素。
静态查找表仅作上述1)和2)操作的查找表动态查找表有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入查找表;或者,从查找表中删除其“查询”结果为“在查找表中”的数据元素关键字是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)若此关键字可以识别唯一的一个记录,则称之谓“主关键字”若此关键字能识别若干记录,则称之谓“次关键字”查找根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)若查找表中存在这样一个记录,则称“查找成功”,查找结果:给出整个记录的信息,或指示该记录在查找表中的位臵;否则称“查找不成功”,查找结果:给出“空记录”或“空指针”如何进行查找?取决于查找表的结构,即:记录在查找表中所处的位臵。
然而,查找表本身是一种很松散的结构,因此,为了提高查找的效率,需要在查找表中的元素之间人为地附加某种确定的关系,换句话说,用另外一种结构来表示查找表。
本章讨论的重点:查找表的各种表示方法及其相应的查找算法9.1 静态查找表ADT StaticSearchTable {数据对象D:D是具有相同特性的数据元素的集合。
每个数据元素含有类型相同的关键字,可唯一标识数据元素。
数据关系R:数据元素同属一个集合。
基本操作P:Create(&ST, n);操作结果:构造一个含n个数据元素的静态查找表ST。
Destroy(&ST);初始条件:静态查找表ST存在;操作结果:销毁表ST。
Search(ST, key);初始条件:静态查找表ST存在,key为和查找表中元素的关键字类型相同的给定值;操作结果:若ST中存在其关键字等于key的数据元素,则函数值为该元素的值或在表中的位臵,否则为“空”。
习题第九章查找答案

第九章查找一、选择题1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( C )。
【北京航空航天大学 2000 一、8 (2分)】A. (n-1)/2 B. n/2 C. (n+1)/2 D. n2. 对N个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为( A ) 【南京理工大学1998一、7(2分)】A.(N+1)/2 B. N/2 C. N D. [(1+N)*N ]/23. 下面关于二分查找的叙述正确的是 ( D ) 【南京理工大学 1996 一、3 (2分)】A. 表必须有序,表可以顺序方式存储,也可以链表方式存储 C. 表必须有序,而且只能从小到大排列B. 表必须有序且表中数据必须是整型,实型或字符型 D. 表必须有序,且表只能以顺序方式存储4. 对线性表进行二分查找时,要求线性表必须( B )【燕山大学 2001 一、5 (2分)】A.以顺序方式存储B.以顺序方式存储,且数据元素有序C.以链接方式存储D.以链接方式存储,且数据元素有序5.适用于折半查找的表的存储方式及元素排列要求为( D ) 【南京理工大学 1997 一、6 (2分)】A.链接方式存储,元素无序 B.链接方式存储,元素有序C.顺序方式存储,元素无序 D.顺序方式存储,元素有序6.当在一个有序的顺序存储表上查找一个数据时,即可用折半查找,也可用顺序查找,但前者比后者的查找速度( C ) A.必定快 B.不一定 C. 在大部分情况下要快 D. 取决于表递增还是递减【南京理工大学 1997 一、7 (2分)】7.当采用分快查找时,数据的组织方式为 ( B ) 【南京理工大学 1996 一、7 (2分)】A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同8. 二叉查找树的查找效率与二叉树的( (1)C)有关, 在 ((2)C)时其查找效率最低【武汉交通科技大学1996 一、2(4分)】(1): A. 高度 B. 结点的多少 C. 树型 D. 结点的位置(2): A. 结点太多 B. 完全二叉树 C. 呈单枝树 D. 结点太复杂。
静态查找

查找的基本方法
基于线性表的查找法 ——顺序查找法、折半查找法、分块查找法 比较式查找法 基于树的查找法 —— ——二叉排序树、平衡二叉排序树、B树 B
顺序查找的算法
//不设置监视哨 int seqsearch(l, k) RecordList l; keytype k; { i=l.length; while(i>=1&&l.r[i].key!=k) i--; if(i>=1) return i; else return 0; }
监视哨: 监视哨:l.r[0],起 , 防止越界的作用
基本概念
关键字:数据元素的某个数据项的值。 关键字:数据元素的某个数据项的值。
主关键字: 主关键字:一个关键字可以唯一标识列表中的 一个元素 注意:如果数据元素只有一个数据项时, 注意:如果数据元素只有一个数据项时,数据 元素的值就是关键字
查找的基本概念
列表): (1)查找表 列表 :由同一类型的数据元素(或记录) )查找表(列表 由同一类型的数据元素(或记录) 构成的集合。 构成的集合。 如图的学生招生录取登记表。 如图的学生招生录取登记表。
数据元素( (5)关键字(Key)——数据元素(或记 )关键字( ) 数据元素 中某个数据项的值, 录)中某个数据项的值,用它可以标识数 据元素(或记录)。 据元素(或记录)。 (6)主关键字(Primary Key)——可以 )主关键字( ) 可以 唯一地标识一个记录的关键字称为主关键 如图的“学号” 字。如图的“学号”。
基本概念
数据结构_查找原理及典型的查找算法

3.对非线性(树)结构如何进行折半查找? 可借助二叉排序树来查找(属动态查找表形式)。
9.1.2 有序表的查找
折半查找过程可以描述为一棵二叉树
折半查找的判定树 如:(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
总之:
二叉排序树既有类似于折半查找的特性,又采用了链 表存储,它是动态查找表的一种适宜表示。
一、二叉排序树
(3)构造过程: 例:输入序列{45,12,37,3,53,100,24}
45
12
53
3
37
100
24
一、二叉排序树
(2)非递归查找过程 BiTree SearchBST(BiTree T,KeyType key){
CH9 查找
查找的基本概念 9.1 静态查找表
9.1.1 顺序查找 9.1.2 有序表的查找 9.1.3 索引顺序表的查找
9.2 动态查找表
9.2.1 二叉排序树和平衡二叉树 9.2.2 B-和B+树
9.3 哈希表
查找的基本概念
1.查找表 2.查找
关键字 主关键字 次关键字
}
9.2.1 二叉排序树和平衡二叉树
一、二叉排序树 二、平衡二叉树
一、二叉排序树
1.定义、特点、构造过程
(1)定义 二叉排序树或者是一棵空树,或是具有下列性质的二叉树:
若左子树非空,则左子树上所有结点的值均小于它的 根结点的值。
若右子树非空,则右子树上所有结点的值均大于它的 根结点的值。
有序/无序表 有序表
顺序/链式存 储
顺序存储
分块查找 介于二者之间 表中元素逐段有序 顺序/链式存储
数据结构查找表

如何进行查找
在一个结构中查找某个数据元素的过程,依赖于数据 元素在结构中的地位,即依赖于数据元素的组织关系 (人为的)。
在计算机中进行查找的方法随数据结构不同而不同。 即随查找表的不同而不同。
9.1 静态查找表
顺序表的查找 有序表的查找 静态树表的查找
查找表的结构 查找过程描述 查找性能分析 查找方法比较
n ASLbs log 2 ( 1) 1 s
9.2 动态查找表
动态查找表的ADT
动态查找表的特点是,表结构本身是在查找过程中动态生成的。即, 对于给定值key,若表中存在其关键字等于key的记录,则查找成 功返回;否则,插入关键字等于key的记录。
P226: SearchDSTable(DT,key ); InsertDSTable(&DT,e ); DeleteDSTable(&DT, e );
给定值进行比较的关键字个数最多也不超过log2 n 1
折半查找的ASL
假设有序表的长度为n=2h-1,则描述折半查找的判定树是深度 为h的满二叉树。 该树中层次为1的结点有1个,层次为2的结点有2个,…,层次 为h的结点有2h-1个。 假设有序表中每个记录的查找概率相等(Pi = 1/n)。
05 low 13 19 21 37 56 64 75 80 88 92 high
mid
high low
mid (low high) / 2
例子
给定值key = 21的查找过程: 给定值key = 85的查找过程:
下界low>上界high,查找不成功。
int Search_Bin( SSTable ST,KeyType key ){ low = 1; high = ST.length; while( low <= high ){ mid = ( low + high ) /2; if EQ( key , ST.elem[mid].key ) return mid; else if LT( key , ST.elem[mid].key ) high = mid-1; else low = mid +1; } return 0; }
平衡二叉树

构造二叉平衡(查找)树的方法是:
在插入过程中,采用平衡旋转技术。
例如:依次插入的关键字为5, 4, 2, 8, 6, 9
5 4 2
向右旋转 一次
4 2 5 8 2
4 6 5
先向右旋转 再向左旋转
8
6
向左旋转一次
4 2 5 6 8 9 4 6 8 5 9
继续插入关键字 9
2
④平衡调整 假设由于在二叉排序树上插入结点而失去平衡的最小子树 根结点的指针为a(即a是离插入结点最近,且平衡因子绝对值 超过1的祖先结点),则失去平衡后进行调整的规律可归纳为下 列4种情况: 1.单向右旋平衡处理: 由于在*a的左子树根结点的左子树上插入结点,*a的平衡 因子由1增至2,致使以*a为根的子树失去平衡,则需进行一次 向右的顺时针旋转操作。如图9.6(a)所示。
0 C
RL
0 A AL CL CR
-1 B BR
插入结点
⑤插入算法 算法思想: 在平衡二叉排序树BBST上插入一个新的数据元素e的递归算法 可描述如下: 1.若BBST为空树,则插入一个数据元素为e的新结点作为 BBST的根结 点,树的深度增1; 2.若e的关键字和BBST的根结点的关键字相等,则不进行插入; 3.若e的关键字小于BBST的根结点的关键字,而且在BBST的 左子树中不存在和e有相同关键字的结点,则将e插入在BBST的 左子树上,并且当插入之后的左子树深度增加(+1)时,分别 就下列不同情况处理之:
p
lc
算法9.10如下:
#define #define #define
LH EH RH
+1 0 -1
//左高 //等高 //右高
Status InsertAVL (BSTree &T, ElemType e, Boolean &taller) { //若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入 //一个数据元素为e的新结点,并返回1,否则返回0。若因插入而使二 //叉排序树失去平衡,则作平衡旋转处理,布尔变量taller反映T长高 //与否。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
回顾顺序表的查找过程:
k
ST.elem
k
2 3 4 5 6 7 8 9 10 11 ST.Length
21 37 88 19 92 05 64 56 80 75 13
0 1
假设给定值 e=64,
要求 ST.elem[k] = e, 问: k = ?
int location( SqList L, ElemType& e,
如何进行查找?
查找的方法取决于查找表的结构。 由于查找表中的数据元素之间不存在 明显的组织规律,因此不便于查找。 为了提高查找的效率, 需要在查找表
中的元素之间人为地 附加某种确定的关系,
换句话说,用另外一种结构来表示查找表。
• 衡量一个搜索算法的时间效率的标准是:
在搜索过程中关键码的平均比较次数,这 个 标 准 也 称 为 平 均 搜 索 长 度 ASL(Average Search Length) ,通常它是搜索结构中对 象总数 n 或文件结构中物理块总数 n 的 函数。
Destroy(&ST);
初始条件:静态查找表ST存在; 操作结果:销毁表ST。
Search(ST, key);
初始条件: 静态查找表ST存在,key 为
和查找表中元素的关键字类 型相同的给定值;
操作结果: 若 ST 中存在其关键字等于
key 的数据元素,则函数值 为该元素的值或在表中的位 置,否则为“空”。
ST.elem
i
2 3 4 5 6 7 8
i
64 21 37 88 19 92 05 64 56 80 75 13
0 1 9 10 11 ST.Length
key=64 i
ST.elem
i
60 21 37 88 19 92 05 64 56 80 75 13
0 1 2 3 4 5 6 7 8 9 10 11 ST.Length
Status (*compare)(ElemType, ElemType))
{
p = L.elem; for ( k=1; k<=L.length && !(*compare)(*p++,e); k++); if ( k<= L.length) return k; else return 0; } //location
// 数据元素存储空间基址,建表时
// 按实际长度分配,0号Байду номын сангаас元留空
int
length; // 表的长度
} SSTable;
数据元素类型的定义为:
typedef struct { keyType key; // 关键字域 // 其它属性域
……
} ElemType ;, TElemType ;
一、顺序查找表 二、有序查找表 三、索引顺序表
key=60
int Search_Seq(SSTable ST, KeyType key) { // 在顺序表ST中顺序查找其关键字等于
// key的数据元素。若找到,则函数值为 // 该元素在表中的位置,否则为0。
ST.elem[0].key = key; // “哨兵” for (i=ST.length; ST.elem[i].key!=key; --i);
• 另外衡量一个搜索算法还要考虑算法所需 要的存储量和算法的复杂性等问题。
9.1 静态查找表 9.2 动态查找树表 9.3 哈希表
9.1 静态查找表
ADT StaticSearchTable {
D是具有相同特性的数 数据对象D: 据元素的集合。每个数 据元素含有类型相同的 关键字,可唯一标识数 据元素。
Traverse(ST, Visit());
初始条件: 静态查找表ST存在,Visit
是对元素操作的应用函数;
操作结果:按某种次序对ST的每个元
素调用函数Visit()一次且仅 一次,一旦Visit()失败,则 操作失败。
假设静态查找表的顺序存储结构为
typedef struct {
ElemType *elem;
一、顺序查找表
以顺序表或线性链表
表示静态查找表
顺序查找 (Sequential Search)
• 所谓顺序查找,又称线性查找,主要用于在 线性结构中进行查找。 • 设若表中有 n 个对象,则顺序查找从表的一 端开始,顺序用各对象的关键码与给定值x进 行比较,直到找到与其值相等的对象,则查 找成功,给出该对象在表中的位置。 • 若整个表都已检测完仍未找到关键码与 x相等 的对象,则查找失败。给出失败信息。
数据关系R: 数据元素同属一个集合。
基本操作 P:
Create(&ST, n);
Destroy(&ST); Search(ST, key);
Traverse(ST, Visit()); } ADT StaticSearchTable
Create(&ST, n);
操作结果:构造一个含n个数据元素
的静态查找表ST。
之谓“次关键字”。
查找(搜索 、 Search)
所谓查找,就是在数据集合中寻找满足某种条 件的数据对象。 查找的结果通常有两种可能: 查找成功,即找到满足条件的数据对象。这 时,作为结果,可报告该对象在结构中的位置, 还可进一步给出该对象中的具体信息。 查找不成功,或搜索失败。作为结果,也应 报告一些信息,如失败标志、失败位置等。 通常称用于搜索的数据集合为查找表,它是由 同一数据类型的对象(或记录)组成。
何谓查找表 ?
查找表是由同一类型的数据元素
(或记录)构成的集合。
由于“集合”中的数据元素之间存在 着松散的关系,因此查找表是一种应用 灵便的结构。
对查找表经常进行的操作:
• 1 )查询某个“特定的”数据元素是否在查找表 中;
• 2)检索某个“特定的”数据元素的各种属性; • 4 )从查找表中删去某个(已经存在的)数据元 素。
• 3 )在查找表中插入一个(不存在的)数据元素;
查找表可分为两类:
静态查找表
仅作查询和检索操作的查找表。
动态查找表
有时在查询之后,还需要将“查询”结 果为“不在查找表中”的数据元素插入 到查找表中;或者,从查找表中删除其 “查询”结果为“在查找表中”的数据
关键字
是数据元素(或记录)中某个数据项 的值,用以标识(识别)一个数据元 素(或记录)。 若此关键字可以识别唯一的一个记 录,则称之谓“主关键字”。 若此关键字能识别若干记录,则称