数据结构 第九章查找
数据结构第9章 查找
关键字
• 是数据元素的某个值,用于识别一个数据 元素 • 若此关键字可以识别唯一的记录称主关键 字 • 若此关键字可以识别多个记录则称次关键 字
• 若查找表中存在这样一个待查记录,则称 查找成功,给出结果,查找不成功,给出 空记录或空指针
• 查找方式,取决查找表的结构 • 如:查字典和查电话不同 • 为了提高查找效率需要在查找表加一些人 为的关系
i=1 i=1 n n+1 查找不成功项
其中 ∑pi +∑gi =1
i=1 i=1
n
n+1
次优查找树
• 不考虑查找不到的情况 • 次优查找树构造方法
– 令wi=α*pi(取整数) – 如何选择二叉树的根结点,使
h i-1
ΔPi=
j=i+1
∑wj -- ∑wj 最小
j=l
某结点左边概率之和和右边概率之和差值最小的,此结点作根结点
• 顺序表块预留空位,插入方便
9.2 动态查找表
• 表结构会发生改变
定义(同静态查找表)
• 数据对象D
– 具有相同特性的数据元素集合 – 每个元素含有类型相同的关键字,可唯一识别 数据元素
• 数据关系R
– 数据元素同属一个集合
基本操作
• initDSTable(&dt)
– 构造一个空表
• destroyDSTable(&dt) • searchDSTable(dt,key)
• 顺序查找
– ci=n-i+1:从后开始查,当i=n查1次,i=1查n次 – ASL=np1+(n-1)p2+…..+pn
• 等概率情况:p*(n+1)*n/2=(n+1)/2
第9章 数据结构 查找
开始: 3 9 1 5 8 10 6 7 2 4
第1次比较: 3 9 1 5 8 10 6 7 i=0 第2次比较: 3 9 1 5 8 10 6 7 i=1 第3次比较: 3 9 1 5 8 10 6 7 i=2 第4次比较: 3 9 1 5 8 10 6 7 i=3 第5次比较: 3 9 1 5 8 10 6 7 i=4 第6次比较: 3 9 1 5 8 10 6 7 i=5 第7次比较: 3 9 1 5 8 10 6 7 i=6 查找成功,返回序号6 2 4 2 4 2 4 2 4 2 4 2 4 2 4
采用二分查找索引表的分块查找算法如下 ( 索 引表I的长度为m):
int IdxSearch(IDX I,int m,SeqList R,int n,KeyType k)
{
int low=0,high=m-1,mid,i;
int b=n/m; while (low<=high) { /*b为每块的记录个数*/ /*在索引中二分查找*/
n
例 10.1 对 于 给 定 11 个 数 据 元 素 的 有 序 表 {2,3,10,15,20,25,28,29,30,35,40}, 采用二分查找 , 试 问: (1)若查找给定值为20的元素,将依次与表中哪 些元素比较?
(2)若查找给定值为26的元素,将依次与哪些元 素比较?
(3)假设查找表中每个元素的概率相同,求查找 成功时的平均查找长度和查找不成功时的平均查 找长度。
利用二叉判定树求二分查找的平均查找长度。
该树的结点总数为:n=2h-1,
h=log2(n+1)
查找树中第i层上的结点需要比较i次,第i层上的结点个 数最多为2i-1,在等概率情况下,二分查找成功时的平 均查找长度为:
数据结构查找第九章
2020/8/14
顺序表的查找
以顺序表或线性链表表示静态查找表。
静态查找表的顺序存储结构:
Typedef struct {
ElemType *elem;
//数据元素存储空间基址,建表时按实际长度分
//配,0号单元留空
2020/8/14
(!strcmp((a),(b))) (strcmp((a),(b))<0) (strcmp((a),(b))<=0)
9。2静态查找表
❖ 顺序表的查找 ❖ 有序表的查找 ❖ 索引顺序表的查找
2020/8/14
抽象类型静态查找表定义为: ADT StaticSearchTable { 数据对象D:D是具有相同特性的数据元素的集合。各数
mid=(low+high)/2;
if (EQ (key.ST.elem[mid].key)
2020/8/14
典型的关键字类型说明和数据元素类型说明:
Typedef float KeyType; //实型
Typedef int KeyType; //整型
Typedef char *KeyType;//字符串型
数据元素类型定义为:
typedef struct {
KeyType key; //关键字域
的给定值。 操作结果:若ST中存在其关键字等于key的数据元素,则
函数值为该元素的值或在表中的位置,否则 为“空”
2020/8/14
Traverse(ST,Visit( )); 初始条件:静态查找表ST存在,Visit识对元素操作的应
用函数 操作结果:按某种次序对ST的每个元素调用函数visit( )
查找-数据结构
平均查找长度:为确定记录在查找表中 的位置,需和给定值进行比较的关键字 个数的期望值称为查找算法在查找成功 时的平均查找长度,简称ASL。
对于含有n个记录的表,查找成功时的平 均查找长度为: n ASL PiCi i 1
其找到中表:中Pi为其查关找键表字中与第给i定个值记相录等的的概第率,i个C记i为 录时和给定值已进行过比较的关键字个数。
(1)若*p 为叶子结点,直接删除即可。
45
45
12
3
37
53
f
100
24
p
61
60
90
12
53
3
删除24
f->lchild = null; delete p;
37
100
61
60
90
78
78
(2)若*p结点只有左子树PL或只有右子树PR,此 时只要令PL或PR直接成为*f的左子树即可
f
F
f
F
p
P
p
二叉排序树的插入
基本思想:
若二叉排序树为空,则待插结点作为根结点插入 到空树中;
若待插结点的关键字值和根结点的关键字值相等, 则说明树中已有此结点,无需插入;
若待插结点的关键字值小于根结点的关键字值, 则将待插结点插入到根的左子树中;
若待插结点的关键字值大于根结点的关键字值, 则将待插结点插入到根的右子树中;
mid low
mid low
mid low
mid low
mid
mid
mid
mid
6
3
9
1
47
10
2
58
11
由此可见,二分查找过程恰好是走了一条从判 定树的根到被查结点的路径,比较的关键字个 数恰为该结点在判定树中的层数。
数据结构九章节查找
9.3 动态查找表
二叉排序树中序遍历 中序遍历二叉排序树,可得到一个关键字的有序序列,如 5,13,19,21,37,56,64,92,75,80,88
56 13
5
37
64 92
21
80
19
75
88
中国科大《数据结构》
9-25
9.3 动态查找表
二叉排序树删除 删除二叉排序树中的一个结点后,必须保持二叉排序树的特性:
顺序查找算法 1. 从表中最后一个记录开始 2. 逐个进行记录的关键字和给定值的比较 3. 若某个记录比较相等,则查找成功 4. 若直到第1个记录都比较不等,则查找不成功
9-6
中国科大《数据结构》
9.2 静态查找表
顺序查找算法描述
int Search_Seq(SSTable ST, KeyType key) { // 若查找成功,返回位置
中国科大《数据结构》
9-19
9.3 动态查找表
动态查找表 如果应用问题涉及的数据量很大,而且数据经常发生变化,如
图书馆经常购进图书,每购进新书,需将新书记录插入图书表,对 这类表除了提供前面的介绍的查找外,还要提供动态查找功能: 1. 查找某个“特定”元素是否在表中,若不在,将该元素插入; 2. 查找某个“特定”元素是否在表中,若在,从表中删除; 如何组织动态查找表? 用静态查找方法不能满足要求了。本节介绍几种方法。
找到 21
64
92 无此数
80
19
75
88
找到
例1:在右图二叉排序树中查找关键字值等于37 例2:在右图二叉排序树中查找关键字值等于88 例3:在右图二叉排序树中查找关键字值等于94
中国科大《数据结构》
数据结构-第九章 查找
数据结构-第九章查找在计算机科学的世界里,数据结构就像是一个精心设计的仓库,用于高效地存储和管理数据。
而查找,作为数据结构中的重要一环,它的作用就如同在这个庞大的仓库中迅速找到我们需要的宝贝。
当我们面对大量的数据时,如何快速准确地找到特定的信息,这是查找要解决的核心问题。
在第九章中,我们会深入探讨几种常见的查找算法和数据结构。
首先,我们来谈谈顺序查找。
这是最简单也是最直观的查找方法。
想象一下,我们有一个长长的列表,就像一排摆放整齐的物品,要找某个特定的东西,我们只能从第一个开始,一个一个地依次检查,直到找到目标或者遍历完整个列表。
这种方法虽然简单直接,但效率并不高,特别是当数据量很大时,查找的时间会很长。
与顺序查找相对的是二分查找。
二分查找就聪明多了,它要求数据是有序的。
就好像我们知道物品是按照大小顺序摆放的,每次都可以通过比较中间的元素来判断目标在左边还是右边,然后不断缩小查找的范围。
通过这种方式,查找的效率大大提高。
比如说,在一个有 100 个元素的有序列表中,最多只需要 7 次比较就能找到目标元素。
接下来是二叉查找树。
它是一种特殊的数据结构,每个节点最多有两个子节点,左子节点的值小于父节点,右子节点的值大于父节点。
通过这种特殊的结构,我们可以快速地在树中查找目标元素。
插入和删除操作也相对方便,但要注意保持树的平衡,否则查找的效率可能会下降。
还有哈希表,这是一种非常高效的查找结构。
它通过一个哈希函数将关键字映射到一个特定的位置。
如果哈希函数设计得好,查找的时间复杂度可以接近常数级别。
但哈希表也有它的问题,比如可能会出现哈希冲突,需要通过合适的冲突解决方法来处理。
在实际应用中,选择哪种查找方法取决于具体的情况。
如果数据量较小,顺序查找可能就足够了;如果数据是有序的,二分查找是个不错的选择;如果需要频繁的插入和删除操作,二叉查找树可能更合适;而对于大规模数据且查找操作频繁的情况,哈希表往往能发挥出巨大的优势。
数据结构第九章动态查找
当数据结构中元素数量较大,且元素顺序不重要时,可以使
哈希查找是一种基于哈希表的查找算法,通过将键映
射到哈希表中对应的槽位,快速定位到元素。
02
哈希查找的时间复杂度为O(1),即平均时间复杂度为
常数时间,具有很高的查找效率。
03
哈希查找适用于数据量较大且数据插入、删除频繁的
平衡二叉树
如AVL树和红黑树,保持树平衡以实现高效的查找、插入和删除操作。
B树和B+树
适用于磁盘或其它直接存储设备上的数据查找,能够减少磁盘I/O操作。
算法的优化与改进
01
哈希表的负载因子
合理设置哈希表的负载因子,以 平衡哈希表的查找性能和冲突率。
02
平衡二叉树的旋转 操作
在插入和删除节点时,通过旋转 操作保持树的平衡,提高查找效 率。
03
B树和B+树的分裂 与合并
在节点分裂和合并时,合理调整 节点数据,减少磁盘I/O操作。
实际应用案例分析
数据库索引
数据库索引使用哈希表、B树或B+树等数据结构,以 提高数据查找速度。
搜索引擎
搜索引擎使用倒排索引、B树或B+树等数据结构,快 速定位网页内容。
文件系统
许多现代文件系统使用B树或B+树等数据结构,以提 高文件查找、读取和写入速度。
THANKS
感谢观看
额外空间复杂度
对于某些动态查找算法,如二分查找,需要额外的空间来存储中间结果,因此 其空间复杂度为O(log n)。而哈希表查找等其他算法则不需要额外的空间,其 空间复杂度为O(1)。
05
动态查找的实践应用
数据结构的选择
哈希表
适用于快速查找,但需要处理哈希冲突。
数据结构第九章 查找
第九章 查找
8
9.2.2 二分查找
➢ 二分查找(折半查找):要求线性表中 的元素必须按关键字递增或者递减顺序 排列,而且要使用顺序存储结构。
第九章 查找
9
1. 用要查找的关键字k与中间位置的元素 的关键字相比较,这个中间元素把线性 表分成两个子表,如果比较结果相等, 则查找完成;
2. 若该元素的值大于关键字k,则把查找 范围定位中间位置之后的子表继续循环;
二分查找过程如下:
第九章 查找
12
开始: 2 4 7 9 10 14 18 26 32 40
low=0
high=9
mid=(0+9)/2=4 第1次比较: 2 4 7 9 10 14 18 26 32 40
low=0 high=3
mid=(0+3)/2=1
第2次比较: 2 4 7 9 10 14 18 26 32 40
low=2 high=3
mid=(2+3)/2=2 第3次比较: 2 4 7 9 10 14 18 26 32 40
R[2].key=7
查找成功,返回序号2
第九章 查找
13
二分查找过程可用二叉树来描述,我们 把当前查找区间的中间位置上的记录作为 根,左子表和右子表中的记录分别作为根的 左子树和右子树,由此得到的二叉树,称为描 述二分查找的判定树或比较树。
21
例如,设有一个线性表,其中包含25个记录,其关 键字序列为{8,14,6,9,10,22,34,18,19,31,40,38,
54,66, 46,71,78,68,80,85,100, 94,88,96,87}。假设 将25个记录分为5块,每块中有5个记录,该线性表的 索引存储结构如下图所示。
数据结构第九章--查找-习题及答案
第九章查找一、选择题1。
若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( )。
A. (n—1)/2 B. n/2 C。
(n+1)/2 D。
n2. 下面关于二分查找的叙述正确的是( )A。
表必须有序,表可以顺序方式存储,也可以链表方式存储 C. 表必须有序,而且只能从小到大排列B。
表必须有序且表中数据必须是整型,实型或字符型 D. 表必须有序,且表只能以顺序方式存储3. 用二分(对半)查找表的元素的速度比用顺序法( )A.必然快 B. 必然慢 C. 相等 D. 不能确定4. 具有12个关键字的有序表,折半查找的平均查找长度( )A. 3。
1 B。
4 C. 2。
5 D. 55.当采用分块查找时,数据的组织方式为 ( )A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块C。
数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同6。
二叉查找树的查找效率与二叉树的( (1))有关, 在((2))时其查找效率最低(1): A。
高度 B。
结点的多少 C. 树型 D. 结点的位置(2): A。
结点太多 B. 完全二叉树 C。
呈单枝树 D. 结点太复杂。
7. 对大小均为n的有序表和无序表分别进行顺序查找,在等概率查找的情况下,对于查找失败,它们的平均查找长度是((1)) ,对于查找成功,他们的平均查找长度是((2))供选择的答案:A。
相同的 B。
不同的9.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是()A.(100,80, 90, 60, 120,110,130) B。
(100,120,110,130,80, 60, 90) C。
(100,60, 80, 90, 120,110,130) D。
数据结构第九章:查找
low high mid
8
1 5
2 13
3 19
4 21
5 37
6 56
7 64
8 75
9 80
10 88
11 92
high low 1 5 2 13 3 19 4 21 5 37 6 56 6 3 1 2
算法描述: 算法描述:ENTER
9
7 64
8 75
9 80
10 88
11 92
判定树: 判定树:
17
考试题型介绍: 考试题型介绍:
1. 填空题 若用链表存储一棵二叉树时,每个结点除数据域外, 若用链表存储一棵二叉树时,每个结点除数据域外,还有指向左孩子和右 孩子的两个指针。在这种存储结构中, 个结点的二叉树共有 个结点的二叉树共有________个 孩子的两个指针。在这种存储结构中,n个结点的二叉树共有 个 指针域,其中有________个指针域是存放了地址,有 指针域,其中有 个指针域是存放了地址, 个指针域是存放了地址 ________________个指针是空指针。 个指针是空指针。 个指针是空指针 2. 选择题 设有序表中有1000个元素,则用二分查找查找元素X最多需要比较( )次 个元素,则用二分查找查找元素 最多需要比较 最多需要比较( 设有序表中有 个元素 A. 25 3. 简答题 已知序列( , , , , , , , , , ) 已知序列(10,18,4,3,6,12,1,9,18,8)请用快速排序写出每一 趟排序的结果。 趟排序的结果。 4. 算法题 设计判断单链表中元素是否是递增的算法。 设计判断单链表中元素是否是递增的算法。 已知: 已知: 1. 单链表已存在,并带有头结点; 单链表已存在,并带有头结点; 2. 要求写出详细的算法步骤或画出详细的流程图; 要求写出详细的算法步骤或画出详细的流程图; B. 10 C. 7 D. 1
数据结构-第九章 查找
数据结构-第九章查找数据结构第九章查找在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地进行访问、操作和管理。
而查找,作为数据结构中的一个重要概念,在我们处理和分析数据的过程中起着关键作用。
查找,简单来说,就是在一组数据中寻找特定的元素。
这听起来似乎很简单,但实际上,它涉及到一系列复杂的算法和策略,以确保能够快速准确地找到我们所需的信息。
让我们先来了解一下顺序查找。
顺序查找是最简单也是最直观的查找方法。
它的基本思想就是从数据集合的开头,逐个元素地进行比较,直到找到目标元素或者遍历完整个集合。
这种方法对于小型数据集或者数据没有特定规律的情况是可行的,但效率相对较低。
想象一下,你要在一本没有索引的电话簿中查找一个人的号码,只能从头开始一个一个地翻,这就是顺序查找的过程。
与顺序查找相对的是二分查找。
二分查找要求数据集合是有序的。
它通过不断地将数据集一分为二,比较目标元素与中间元素的大小,从而缩小查找范围。
这种方法的效率比顺序查找高得多。
比如说,要在一本按照姓名拼音排序的电话簿中查找一个人,我们可以先比较中间的名字,如果目标在前面,就只在前半部分继续查找,反之则在后半部分查找,如此反复,大大提高了查找的速度。
除了上述两种常见的查找方法,还有哈希查找。
哈希查找的核心是通过一个哈希函数将元素映射到一个特定的位置。
哈希函数的设计至关重要,一个好的哈希函数能够使得元素均匀地分布在哈希表中,减少冲突的发生。
当我们要查找一个元素时,通过哈希函数计算出其可能的位置,然后进行比较。
如果哈希函数设计得不好,可能会导致大量的冲突,从而影响查找效率。
在实际应用中,选择合适的查找方法取决于多个因素。
数据的规模是一个重要的考虑因素。
如果数据量较小,顺序查找可能就足够了;但对于大规模的数据,二分查找或者哈希查找通常更合适。
数据的分布情况也会影响选择。
如果数据分布比较均匀,哈希查找可能效果较好;如果数据有序,二分查找则更具优势。
数据结构-第9章 查找
静态查找表 对查找表的查找仅是以查询为 目的,不改动查找表中的数据。 动态查找表 在查找的过程中同时插入不存 在的记录,或删除某个已存在的记录。
查找成功 查找表中存在满足查找条件的记 录。 查找不成功 查找表中不存在满足查找条件 的记录。
内查找 整个查找过程都在内存中进行。 外查找 在查找过程中需要访问外存。 平均查找长度ASL——查找方法时效的度量 为确定记录在查找表中的位置,需和给定值 进行比较的关键字个数的期望值。 n 查找成功时的ASL计算方法: ASL pici
3. 在二叉排序树上的操作
1)查找
[例] Key=28 f 24 12 T
45
53 28 90
Key=32 T 45 24 53 12 f 28 90 32
[算法描述]
2) 插入
[算法描述]
3) 生成
查找算法
返回
BiTree SearchBST(BiTree T,KeyType key){
//在根指针T所指二叉树中递归地查找某关键字等于 //key的数据元素,若查找成功,则返回指向该数据元 //素结点的指针,否则返回空指针
图9.1 用折半查找法查找12、50的过程 其中mid=(low+high)/2,当high<low时,表 示不存在这样的子表空间,查找失败。
成功! 位 置 1 2 3 4 5 6 7 8 9 10 11
值
6 12 15 18 22 25 28 35 45 58 60
low hign mid mid hign mid low mid (a) 用折半查找法查找12的过程
[性能分析] • 空间:一个辅助空间。 • 时间: 查找成功时的平均查找长度 设表中各记录查找概率相等 n ASLs(n)= PiCi =(1+2+ ... +n)/n =(n+1)/2 i 1 [算法特点] • 算法简单,对表结构无任何要求 • n很大时查找效率较低 • 改进措施:非等概率查找时,可将查找概率高 的记录尽量排在表后部。
数据结构第九章--查找-习题及答案
第九章查找一、选择题1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( )。
A. (n-1)/2 B. n/2 C. (n+1)/2 D. n2. 下面关于二分查找的叙述正确的是 ( )A. 表必须有序,表可以顺序方式存储,也可以链表方式存储 C. 表必须有序,而且只能从小到大排列B. 表必须有序且表中数据必须是整型,实型或字符型 D. 表必须有序,且表只能以顺序方式存储3. 用二分(对半)查找表的元素的速度比用顺序法( )A.必然快 B. 必然慢 C. 相等 D. 不能确定4. 具有12个关键字的有序表,折半查找的平均查找长度()A. 3.1B. 4C. 2.5D. 55.当采用分块查找时,数据的组织方式为 ( )A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同6. 二叉查找树的查找效率与二叉树的( (1))有关, 在 ((2))时其查找效率最低(1): A. 高度 B. 结点的多少 C. 树型 D. 结点的位置(2): A. 结点太多 B. 完全二叉树 C. 呈单枝树 D. 结点太复杂。
7. 对大小均为n的有序表和无序表分别进行顺序查找,在等概率查找的情况下,对于查找失败,它们的平均查找长度是((1)) ,对于查找成功,他们的平均查找长度是((2))供选择的答案:A. 相同的B.不同的9.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是( ) A.(100,80, 90, 60, 120,110,130) B.(100,120,110,130,80, 60, 90)C.(100,60, 80, 90, 120,110,130)D. (100,80, 60, 90, 120,130,110)10. 在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并已知A的左孩子的平衡因子为0右孩子的平衡因子为1,则应作( ) 型调整以使其平衡。
数据结构 第九章 查找
S P Q
PL
S Q
PL 中序遍历:PL P S Q
(1)
6
中序遍历:PL S Q
3 2 4 15
18
S Q P
S Q PL
PL 中序遍历:Q S PL P
1)分块有序(升序或降序) ——第I块中的最大(小)值小(大)于第i+1块中的最(大)小值
2)查找 (1)先查索引表——折半查找 (2)再查顺序表——顺序查找 块间有序,块内无序
typedef struct { int key;} Eletype; typedef struct { Elemtype *elem; int length; } SSTable; # define BLOCK_NUM 3
DeleteDSTable(&DT,key);
TraverseDSTable(DT,visit()); //遍历查找表
9.2.1二叉排序树 ( Binary Sort Tree )
定义 二叉排序树(二叉查找树) 或者是一棵空树, 或者是具有下列性质的二叉树: 每个结点都有一个作为查找依据的关键字 (key),所有结点的关键字互不相同。 左子树(若非空)上所有结点的关键字都小于 根结点的关键字。 右子树(若非空)上所有结点的关键字都大于 根结点的关键字。 左子树和右子树也是二叉排序树。
关键字:数据元素中某个数据项的值,用以 标识一个数据元素。 主关键字:可唯一地标识一个数据元素的关 键字。 次关键字:用以识别若干记录的关键字。 使用基于主关键字的查找,查找结果应是 唯一的。
静态查找表(p214) 动态查找表
关键字惟一确定一条记录
属性名 (字段名)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第九章查找:习题习题一、选择题1.散列表查找中k个关键字具有同一散列值,若用线性探测法将这k个关键字对应的记录存入散列表中,至少要进行( )次探测。
A. kB.k+lC. k(k+l)/2D. l+k (k+l)/22.下述命题( )是不成立的。
A. m阶B-树中的每一个结点的子树个数都小于或等于mB. m阶B-树中的每一个结点的子树个数都大于或等于『m/2-1C. m阶B-树中的每一个结点的子树高度都相等D.m阶B-树具有k个子树的非叶子结点含有(k-l)个关键字3.如果要求一个基本线性表既能较快地查找,又能适应动态变化的要求,可以采用( ) 查找方法。
A.分块B. 顺序C. 二分D.散列4.设有100个元素,用折半查找法进行查找时,最大比较次数是( ),最小比较次数是( )。
A.7,1B.6,lC.5,1D. 8,15.散列表长m=15,散列表函数H(key)=key%13。
表中已有4个结点:addr(18)=5;addr(32)=6; addr(59)=7; addr(73)=8;其余地址为空,如果用二次探测再散列处理冲突,关键字为109的结点的地址是( )。
A. 8B. 3C. 5D. 46.用分块查找时,若线性表中共有729个元素,查找每个元素的概率相同,假设采用顺序查找来确定结点所在的块时,每块应分( )个结点最佳。
A. 15B. 27C. 25D. 307.散列函数有一个共同性质,即函数值应当以( )取其值域的每个值。
A.同等概率B. 最大概率C. 最小概率D.平均概率8.设散列地址空间为O..m-1,k为关键字,假定散列函数为h(k)=k%p,为了减少冲突,一般应取p为( )。
A.小于m的最大奇数B. 小于m的最大素数C.小于m的最大偶数D.小于m的最大合数9.当向一棵m阶的B-树做插入操作时,若使一个结点中的关键字个数等于( ),则必须分裂成两个结点。
A.mB. m-lC.m+lD.[m+1]10.当向一棵m阶的B壤f做删除操作时,若使一个结点中的关键字个数等于( ),则可能需要用它的左兄弟或右兄弟结点合并成一个结点。
A. [m/2]B.[m-l]C. [m/2]+1D. [m+l]-211.衡量查找算法效率的主要标准是( )。
A. 元素个数B. 所需的存储量C. 平均查找长度D.算法难易程度二、填空题1.顺序查找长度为n的顺序表,查找成功的平均查找长度为____。
2.折半查找要求线性表的存储结构为____;而用顺序查找的线性表,既可以采用,也可以采用____。
3.散列查找是一种对关键字进行____的查找方法。
4.散列法既是一种查找方法,又是一种____方法。
5.在有序表(12,24,36,48,60,72,84)中二分查找关键字72时所需进行的关键字比较次数为____。
6.在散列存储中,装填因子α的值越大,存取元素时发生冲突的可能性就____;α的值越小,存取元素时发生冲突的可能性就____。
7.在线性表的散列存储中,处理冲突有____和____两类;当装填因子一定时,采用链地址法处理冲突比采用开放定址法处理冲突的平均查找长度要____。
8.在一棵10阶的B-树上,每一个树根结点中所含的关键字数目最多允许为____;最少允许为____。
9.当向B-树中插入关键字时,可能引起结点的____;最终可能导致整个B-树的高度____。
三、简答题1.对含有n个互不相同元素的集合,同时找最大元素和最小元素至少需要多少次比较?2.若对具有n个元素的有序的顺序表和无序的顺序表分别进行顺序查找,试在下述两种情况下分别讨论两者在等概率时的平均查找长度:(1)查找不成功,即表中无关键字等于给定值。
(2)查找成功,即表中有关键字等于给定值k的记录。
3.对给定的关键字集合,以不同的次序插入初始为空的树中,是否有可能得到同一棵二叉排序树?4.将二叉排序树T的前序序列中关键字依次插入初始为空的树中,所得到的二叉排序树T’与T是否相同?为什么?5.设二叉排序树中关键字由1到1000内的整数构成,现要查找关键字为363的结点,下述关键字序列哪一个不可能是在二叉排序树上查找到的序列。
(1) 2,252,401,398,330,344,397,363(2) 924,220,911,244,898,258,362,363(3) 925,202,911,240,912,245,363(4) 2,399,387,219,266,382,381,278,3636.为什么二叉排序树长高时,新结点总是一个叶子,而B-树长高时,新结点总是根?哪一种长高能保证树平衡?7.设有一组关键字(17,13,14,153,29,35)需插入到表长为12的散列表中.请回答以下问题:(l)设计一个适合该散列表的散列函数;(2)设计的散列函数将上述关键字插入到散列表中,画出其结构;并指出用线性探测法解冲突时构造散列表的装填因子为多少?8.已知记录关键字集合( 53,17,19,61,98,75,79,63,46,49),要求散列到地址区间(100,101,102,103,104,105,106,107,108,109)内,若产生冲突用开放定址法的线性探测法解决,要求写出选用的散列函数;形成散列表;计算出查找成功时平均查找长度(设等概率情况)。
9.已知一个含有100条记录的表,关键字为中国姓氏的拼音,若采用散列存储方式存放此表,请给出此表的一个散列表设计方案,要求它在等概率的情况下查找成功的平均查找长度不超过3。
四、算法设计题1.利用二叉树遍历的思想写一个判断二叉树是否为平衡二叉树的算法test(BsTree *p,i nt balance,…);其中p初值指向待判二叉树的根,balance是一判断结果的输出标志,初值为True(l),根据需要可增加其他必要的参数。
在判断各点平衡的过程中,一旦发现有悖于平衡二叉树的定义,则balance应转变为False(0),且终止该过程。
2.设单链表的结点按关键字的大小从小到大排列,试写出对此链表的查找算法,并说明是否可用折半查找。
3.试设计一个算法,求出指定结点在给定的二叉排序树中的层次。
4.编写对有序表进行顺序查找的算法,并画出对有序表进行顺序查找的判定树,假设每次查找时的给定值为随机值,查找成功和不成功的概率也相等,试求进行每依次查找时,与给定值进行比较的关键字个数的期望值。
5.已知一组递增有序的关键字k[0…n-1];k0≤k i≤…≤k n-1,在等概率查找的前提下,可以生成一棵二叉排序树。
以哪个关键字为根结点,按什么方式生成二叉排序树既有平衡性又简单?阐明算法思路,写出相应的算法。
如果k[0…10]为:(7,12,13,15,21,33,38, 41,49,55,58)。
按你的算法画出这棵二叉排序树。
6.编写判定给定的二叉树是否是二叉排序树的函数。
7.编写一个算法,删除二叉排序树中除根结点以外的任一结点p,已知p的双亲结点f。
8.已知某散列表的装填因子小于1,散列函数h(k)为k(k为标识符,均小写)的第一个字母在字母表中的序号。
采用开放定址法的线性探测再散列解决冲突。
试编写一个按第一个字母的顺序输出散列表中所有关键字的算法。
第九章查找第9章查找一.选择题1.C 2.D 3.A 4.D 5.D 6.B7.A 8.B 9.A 10.D 11.C二.填空题1.(n+l)/2。
2.顺序存储结构、顺序存储结构、链接存储结构。
3.运算。
4.存储。
5.2 6.越大,越小。
7.开放定址法,链地址法,短。
8.9,4。
9.分裂,增加l。
三、简答题1.按照下面的顺序查找算法,如果初始序列递增有序,则只需比较n-l次;如果初始序列递减有序,则需比较2(n-l)次。
因此,对含有n个互不相同元素的集合,同时找最大元素和最小元素至少需要比较n-l次,最多需要比较2(n-l)次。
max=min=r[O].key;for(i=1;i<n;i++)if(r[i]. key>max) max-r[i]. key;else if(r[i]. key<min) min=r[i].key;2.(1)查找不成功的情况。
1)对于有序表,第一小的元素在0号位置,第二小的元素在l号位置,第n小的元素,即最大的元素在n-l号位置。
显然,查找第i小的元素只要比较i+l次就能够确定查找不成功。
因此,在等概率的情况下,查找不成功的平均查找长度为2)对于无序的顺序表,查找每一个元素都要比较n+l次才能确定其查找不成功。
因此在等概率的情况下查找不成功的平均查找长度为n+l。
(2)查找成功的情况。
不论是有序表还是无序表,在位置i上查找成功的比较次数均为i+l次,因此在等概率的情况下,其成功的平均查找长度均为(n+l)/2。
3.除单元素外,对给定关键字集合,以不同的次序插入初始为空的树中不可能得到同一棵二叉排序树。
4.因为按二叉排序树T的前序序列将关键字依次插入到初始为空的二叉排序树T’中的插入过程与二叉排序T,的前序遍历过程完全一致,次序不会改变,所以T’与T完全相同。
5.关键字序列(3)不可能是在二叉排序树上查找到的序列。
因为根据序列(3),240是911的左孩子,912在240的后面,是240的右孩子;而实际上,912比911大,应当在911的右子树上,即912不可能出现在911的左子树上,所以序列(3)不可能出现。
6.因为二叉排序树的插入总是从根结点开始逐层往下比较,若比根小,则走左边;若比根大,则走右边。
这样找到的插入位置,不是某结点的空闲左链域就是某结点的空闲右链域,即新结点总是作为叶结点插入进来的。
B-树的插入不是在树中添加一个叶结点;而是首先在最底层的某个终端结点中添加一个关键字,若该结点的关键字数不超过m-l,则完成插入,否则进行向上“分裂”,从而使新结点总是以根的形式出现。
B-树的插入能保证树的平衡。
7.(1)由于散列表的长度为12,则可选不超过表长的最大素数ll作为除留余数法的模,则可得其散列函数为h(k)=k%11。
(2)若用线性探测法解决冲突,则可构造出散列表如下:此时,其装填因子为:α= 6/12=0.5。
8.散列函数:H(key)=lOO+(key个位数+key十位数)%10。
形成散列表为:查找成功时的平均长度为:(1×5+2×1+3×1+5×3)/10=2.59.(1)确定该散列表的装填因子a。
散列表的查找效率与采用的处理冲突的方法及散列表的装填因子α有关。
α越小,表中的记录数越少或表越长,发生冲突的可能性就越小,此时的查找效率越高:反之,α越大,表中的记录数越多或表的长度越小,表中记录的密度越高,发生冲突的可能性越大,查找效率越低,所花的时间也越长。