第9章 查找
数据结构第九章--查找-习题及答案
第九章查找一、选择题1•若查找每个记录的概率均等,则在具有n 个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL 为()。
A .(n-1)/2B.n/2C.(n+1)/2D.n 2. 下面关于二分查找的叙述正确的是()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,则应作()型调整以使其平衡。
第九章 查找
} // 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. 结点太复杂。
数据结构第9章作业 查找答案
第9章 查找答案一、填空题1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是 顺序查找(线性查找) 。
2. 线性有序表(a 1,a 2,a 3,…,a 256)是从小到大排列的,对一个给定的值k ,用二分法检索表中与k 相等的元素,在查找不成功的情况下,最多需要检索 9 次。
设有100个结点,用二分法查找时,最大比较次数是 7 。
3. 假设在有序线性表a[20]上进行折半查找,则比较一次查找成功的结点数为1;比较两次查找成功的结点数为 2 ;比较四次查找成功的结点数为 8 ;平均查找长度为 3.7 。
解:显然,平均查找长度=O (log 2n )<5次(25)。
但具体是多少次,则不应当按照公式)1(log 12++=n nn ASL 来计算(即(21×log 221)/20=4.6次并不正确!)。
因为这是在假设n =2m-1的情况下推导出来的公式。
应当用穷举法罗列:全部元素的查找次数为=(1+2×2+4×3+8×4+5×5)=74; ASL =74/20=3.7 !!!4.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素 28,6,12,20 比较大小。
5. 在各种查找方法中,平均查找长度与结点个数n 无关的查找方法是 散列查找 。
6. 散列法存储的基本思想是由 关键字的值 决定数据的存储地址。
7. 有一个表长为m 的散列表,初始状态为空,现将n (n<m )个不同的关键码插入到散列表中,解决冲突的方法是用线性探测法。
如果这n 个关键码的散列地址都相同,则探测的总次数是 n(n-1)/2=( 1+2+…+n-1) 。
(而任一元素查找次数 ≤n-1)二、单项选择题( B )1.在表长为n的链表中进行线性查找,它的平均查找长度为A. ASL=n; B. ASL=(n+1)/2;C. ASL=n +1; D. ASL≈log2(n+1)-1( A )2. 折半查找有序表(4,6,10,12,20,30,50,70,88,100)。
第九章查找3哈希表
解决方案:可采用二次探测法或伪随机探测法,以 改善‚堆积‛问题。
9.3
三.处理冲突的方法
哈希表
例2:设哈希表长为11,哈希函数 H(key)=key MOD 11, 试用开放定址法中二次探测再散列解决冲突 Hi(key)=(H(key)+di) MOD 11 (di=12,-12,22,-22,…,k2,-k2 ), 试对下列关键字序列(19,13,33,02,16,29,24) 构造哈希表HT。
9.3
哈希表
0
1 BAI 2 CHEN
例:假设在例2的记录集合中添 加关键字{DAI,ZHOU,…}。 4、冲突 对不同的关键字可能得到同一 哈希地址的现象叫做冲突。
……
3 DIAO
… 6 GAO … 18 SUN 19 TANG
关 键 码 集 合
…
22 WU 23 XIAO 24 YI 25 ZHAO
9.3
三.处理冲突的方法
3.链地址法
哈希表
9.3
三.处理冲突的方法
1.开放定址法 2.再哈希法
哈希表
3.链地址法(拉链法) 4.建立公共溢出区
P258
9.3
三.处理冲突的方法
例:关键码集合 {47, 7, 29, 11, 16, 92, 22, 8, 3},散列 函数为H(key)=key mod 11,用公共溢 出区法处理冲突, 构造的散列表为:
哈希表
二.哈希函数的构造方法
1、直接定址法 思想:哈希函数为关键字的某个线性函数
H(key)= a.key+b 或 H(key)=key
适应情况:事先知道关键码,关键码集合不是 很大且连续性较好。 优点:不会产生冲突
缺点:占用连续空间,空间效率低
(完整word版)数据结构第九章查找
第九章查找:习题习题一、选择题1.散列表查找中k个关键字具有同一散列值,若用线性探测法将这k个关键字对应的记录存入散列表中,至少要进行( )次探测。
A. k B。
k+l C. k(k+l)/2 D. 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,1 B.6,l C.5,1 D. 8,15.散列表长m=15,散列表函数H(key)=key%13。
表中已有4个结点:addr(18)=5;addr(32)=6; addr(59)=7;addr(73)=8;其余地址为空,如果用二次探测再散列处理冲突,关键字为109的结点的地址是( )。
A. 8 B。
3 C. 5 D。
46.用分块查找时,若线性表中共有729个元素,查找每个元素的概率相同,假设采用顺序查找来确定结点所在的块时,每块应分( )个结点最佳。
A。
15 B. 27 C。
25 D。
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。
m B。
m-l C.m+l D。
第9章查找
high指向待查元素所 在区间的上界
(1) low =1,high =11 ,mid =6 ,待查范围是 [1,11]; (2) 若 ST.elem[mid].key < key,说明 key[ mid+1,high] , 则令:low =mid+1;重算 mid= (low+high)/2;. (3) 若 ST.elem[mid].key > key,说明key[low ,mid-1], 则令:high =mid–1;重算 mid ; (4)若 ST.elem[ mid ].key = key,说明查找成功,元素序号=mid; 结束条件: (1)查找成功 : ST.elem[mid].key = key (2)查找不成功 :high<low (意即区间长度小于0)
2013-12-24
2
2、对查找表常用的操作:
查询某个“特定的”数据元素是否在表中; 查询某个“特定的”数据元素的各种属性; 在查找表中插入一元素; 从查找表中删除一元素。
静态查找表(Static Search Table):对查找表只做 前两种“查找”操作 动态查找表(Dynamic Search Table) :对查找表 要进行后两种“查找”操作
2013-12-24
8 75 i
9 80 i
10 88 i
11 92 i
比较次数=5
6
不设置监视哨的顺序查找算法
int SeqSearch( SSTable ST, KeyType key) /*不用监视哨法,在顺序表中查找关键字等于key的元素*/ {
i=ST.length;
while (i>=1&&ST. elem[i].key!=key) i--;
数据结构.第9章.查找.4.哈希表
§9.3 哈希表
开放地址法
例:关键码集为 {47,7,29,11,16,92,22,8,3}, 设:哈希表表长为m=11; 哈希函数为Hash(key)=key mod 11; 拟用线性探测法处理冲突。建哈希表: 0 1
11 22
2
3
4
5
6
3
7
7
8
29
9
8
10
47 92 16
§9.3 哈希表
开放地址法
选用关键字的某几位组合成哈希地址。
选用原则应当是:各种符号在该位上出现的频率大致
相同。
适于关键字位数比哈希地址位数大,且可能出现的关 键字事先知道的情况。
§9.3 哈希表
数字分析法
例:有一组(例如80个)关键码,其样式如下: 讨论: 3 4 7 0 5 2 4 ① 第1、2位均是“3和4”,第3位也只有 3 4 9 1 4 8 7 3 4 8 2 6 9 6 “ 7、8、9”,因此,这几位不能用,余 3 4 8 5 2 7 0 下四位分布较均匀,可作为哈希地址选用。 3 4 8 6 3 0 5 ② 若哈希地址取两位(因元素仅80个), 3 4 9 8 0 5 8 则可取这四位中的任意两位组合成哈希地 3 4 7 9 6 7 1 址,也可以取其中两位与其它两位叠加求 3 4 7 3 9 1 9 和后,取低两位作哈希地址。 位号:① ② ③ ④ ⑤ ⑥ ⑦
拟用二次探测法处理冲突。建哈希表如下: Hi = ( H(K)+di ) mod m 其中di =12, -12, 22,-22,…, j2, -j2 ( j≤m/2)。
0 1
11 22
2
3
3
4
5
6
7
数据结构 第9章 查找3-B树
插入关键字 = 60, 90, 30
2、B-树的删除
在深度为(h+l)的m阶B-树中删除一个键值k,首先要查 到键值k所在的结点及在结点中的位置。若k在非终端 节点中,则把该结点的右边(或左边)指针所指子树中 的最小(或最大)键值与k对调,使k移到终端节点。 在终端节点中删除一个键值后,使得该结点的值个数n 减1,此时应分以下三种情况进行处理: – (1)若删除后结点中键值数目n≥ ┌m/2┐-1,在该结点 中删去键值k连同右边的指针。 – (2)若删除后结点中键值数目n< ┌m/2┐ -1,且左(或 右)兄弟结点的关键字数目> ┌m/2┐-1,则把左(或 右)兄弟结点中最大(或最小)键值移到父结点中,再 把父结点大于(或小于)上移键值的键值下移到被删 关键字所在结点中。
(3)若删除后结点中键值数目n< ┌m/2┐ -1,及 其左、右兄弟结点的键值数目都等于┌m/2┐ -1,则就必须进行结点的“合并”,即把应删 的键值删去后,将该结点中的剩余键值和指针 连同父结点中指向该结点指针的左边(或右边) 一个键值ki一起合并到左兄弟(或右兄弟)结点 中,将ki从父结点中删去。如果因此使父结点 中关键字数目< ┌m/2┐-1,则对此父结点做同 样处理,以致于可能直到对根结点做这样的处 理而使整个树减少一层。
2.查找性能的分析
在B-树中进行查找时,其查找时间 主要花费在搜索结点(访问外存)上, 即主要取决于B-树的深度 树的深度。 树的深度
问:含 N 个关键字的 m 阶 B-树可 能达到的最大深度 H 为多少?
反过来问: 深度为H的B-树中, 至少含有多少个结点? 先推导每一层所含最少结点数: 第1层 第2层 第3层 第4层 … … 第 H+1 层 1个 2个 2×m/2 个 × 2×(m/2)2 个 × 2×(m/2) H-1 个 ×
数据结构第九章动态查找
当数据结构中元素数量较大,且元素顺序不重要时,可以使
哈希查找是一种基于哈希表的查找算法,通过将键映
射到哈希表中对应的槽位,快速定位到元素。
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
动态查找的实践应用
数据结构的选择
哈希表
适用于快速查找,但需要处理哈希冲突。
数据结构 第9章 查找4-哈希表
7、随机数法 Hash(key) = random ( key ) (random为伪随机函数)
适用于:关键字长度不等的情况。造表和查找都很方便。
小结:构造哈希函数的原则:
① ② ③ ④ ⑤ 执行速度(即计算哈希函数所需时间); 关键字的长度; 哈希表的大小; 关键字的分布情况; 查找频率。
三、冲突处理方法
14 H(14)=14%7=0
6个元素用7个 地址应该足够!
1
2
23 9
3
4
39 25 11
5
6
H(25)=25%7=4 H(11)=11%7=4
有冲突!
在哈希查找方法中,冲突是不可能避免的,只能 尽可能减少。
所以,哈希方法必须解决以下两个问题:
1)构造好的哈希函数
(a)所选函数尽可能简单,以便提高转换速度; (b)所选函数对关键码计算出的地址,应在哈希地址集中 大致均匀分布,以减少空间浪费。
讨论:如何进行散列查找?
根据存储时用到的散列函数H(k)表达式,迅即可查到结果! 例如,查找key=9,则访问H(9)=9号地址,若内容为9则成功; 若查不到,应当设法返回一个特殊值,例如空指针或空记录。
缺点:空间效率低!
若干术语
哈希方法 (杂凑法)
选取某个函数,依该函数按关键字计算元素的存储位置, 并按此存放;查找时,由同一个函数对给定值k计算地址, 将k与地址单元中元素关键码进行比较,确定查找是否成 功。
3. 乘余取整法
4. 数字分析法
5. 平方取中法
常用的哈希函数构造方法有:
6. 折叠法
7. 随机数法
1、直接定址法
(a、b为常数) 优点:以关键码key的某个线性函数值为哈希地址, 不会产生冲突. 缺点:要占用连续地址空间,空间效率低。
02-第9章查找第3讲-索引顺序表的查找
L9.1.4 索引顺序表的查找1. 基本索引查找☐一般地,索引存储结构需要在数据表基础上建立一个关于索引项的索引表。
☐索引表的结构为:(索引关键字,该关键字记录在数据表中的相对地址),其中索引关键字项有序排列。
L2.分块查找若数据表中的数据呈现这样的规律:数据表可以分成若干块,每一块中的元素是无序的,但块与块之间元素是有序的,即前一块中的最大关键字小于(或大于)后一块中的最小(或最大)关键字值。
DataSet = { 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 }DataSet = { 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 } L2. 分块查找索引表中的一项对应数据表中的一块,索引项由关键字域和链域组成,关键字域存放相应块的键字,链域存放指向本块表按关键字值递增(或递减)顺序排列。
用索引表表示这种特性LL分块查找过程分为两步进行:首先确定待查找的元素属于哪一块,即查找其所在的块。
然后在块内查找相应的元素。
由于索引表是递增有序的,可以对索引表进行折半查找,当索引表中元素个数(即分块的块数)较少时,也可以对索引表采用顺序查找方法。
在进行块内查找时,由于块内元素无序,所以只能采用顺序查找方法。
L【示例-1】有一个关键字序列为:(9,22,12,14,35,42,44,38,48,60,58,47,78,80,77,82),给出分块查找的索引结构和查找算法。
922121435424438486058477880778292212143542443848605847788077829221214354244384860584778807782⏹索引顺序查找的查找成功时的平均查找长度ASL bs =ASL b +ASL wASL b 是在索引表中查找子表位置的平均查找长度; ASL w 是在子表内查找元素位置的查找成功的平均查找长度。
数据库系统l试题库及答案 第9章 查找
第9章查找9.1知识点:静态查找表一、填空题1.在数据的存放无规律而言的线性表中进行检索的最佳方法是。
2.查找表是由构成的集合。
3.若对查找表只做“查询某个特定的数据元素是否在查找表中”和“查询某个特定的数据元素的各种属性”操作,则称此类查找表为。
若在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素,则称此类查找表为。
4.在n个记录的有序顺序表中进行折半查找,最大的比较次数为。
5.是顺序查找的一种改进方法,又称索引顺序查找,具体实现为将一个主表分成n个子表,要求子表之间元素是按,而子表中元素可以无序的,用每个子表最大关键字和指示块中第一个记录在表中位置建立。
6.分块查找的时间复杂度是。
7.顺序查找n个元素的顺序表,若查找成功,则比较关键字的次数最多为次;当使用监视哨时,若查找失败,则比较关键字的次数为次。
8.由于查找运算的主要运算是关键字的比较,所以通常把______________作为衡量一个查找算法效率优劣的标准。
它的计算公式为________________________________________。
二、选择题1.()在表长为n的链表中进行顺序查找,它的平均查找长度为()。
A. ASL=nB. ASL=(n+1)/2C. ASL=+1D. ASL≈log2(n+1)-12.()采用折半查找方法查找长度为n的线性表时,平均时间复杂度为()。
A.O(n2)B.O(nlogn)C.O(n)D.O(logn)3.()折半查找有序表(4,6,10,12,20,30,50,70,88,100)。
若查找表中元素58,则它将依次与表中()比较大小,查找结果是失败。
A.20,70,30,50 B.30,88,70,50 C.20,50 D.30,88,504.()有序线性表(a1,a2,a3,…,a256)是从小到大排列的,对一个给定的值k,用二分法检索表中与k相等的元素,在查找不成功的情况下,最多需要检索()次。
李春葆《数据结构教程》(第4版)章节题库-第九章至第十二章(圣才出品)
第9章查找一、选择题1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为()。
A.(n-1)/2B.n/2C.(n+1)/2D.n【答案】C【解析】最快查找一次成功,最慢查找n次成功。
平均查找次数为(1+2+3+…+n)/n,那么ASL=(n+1)/2。
2.在一个有N个元素的有序单链表中查找具有给定关键字的结点,平均情况下的时间复杂性为()。
A.O(1)B.O(N)C.O(N2)D.O(NlogN)【答案】B【解析】二分查找的时间复杂度为O(logn)。
在一个用N个元素的有序单链表中查找具有给定关键字的结点,因为查找是从头结点开始的,需要使用指针顺序往下查找,因此时间复杂度为0(N)。
3.对线性表进行折半查找时,要求线性表必须()。
A.以顺序方式存储B.以顺序方式存储,且数据元素有序C.以链接方式存储D.以链接方式存储,且数据元素有序【答案】B【解析】二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
折半查找方法适用于对以顺序方式存储的有序表的查找,查找效率较高。
4.下列二叉排序树中查找效率最高的是()。
A.平衡二叉树B.二叉查找树C.没有左子树的二叉排序树D.没有右子树的二叉排序树【答案】A【解析】平衡二叉树的左子树和右子树的深度之差的绝对值不超过1。
这就保证了二叉树的深度是log2n级别的。
二叉查找树或者是一颗空数;或者是具有下列性质的二叉树:①若左子树不空,则左子树上所有结点的值均小于它的根结点的值;②若右子树不空,则右子树上所有结点的值均大于它的根结点的值;③左、右子树也分别为二叉排序树。
B、C、D 三项均不能保证左子树和右子树的深度之差的绝对值不超过1,甚至很大,因此查找效率低。
5.当在一个有序的顺序存储表上查找一个数据时,既可用折半查找,也可用顺序查找,但前者比后者的查找速度()。
数据结构_第9章_查找2-二叉树和平衡二叉树
F
PS
C
PR
CL Q
QL SL S SL
10
3
18
2
6 12
6 删除10
3
18
2
4 12
4
15
15
三、二叉排序树的查找分析
1) 二叉排序树上查找某关键字等于给定值的结点过程,其实 就是走了一条从根到该结点的路径。 比较的关键字次数=此结点的层次数; 最多的比较次数=树的深度(或高度),即 log2 n+1
-0 1 24
0 37
0 37
-0 1
需要RL平衡旋转 (绕C先顺后逆)
24
0
-012
13
3573
0
01
37
90
0 53 0 53
0 90
作业
已知如下所示长度为12的表:
(Jan, Feb, Mar, Apr, May, June, July, Aug, Sep, Oct, Nov, Dec)
(1) 试按表中元素的顺序依次插入一棵初始为空的二叉 排序树,画出插入完成之后的二叉排序树,并求其在 等概率的情况下查找成功的平均查找长度。
2) 一棵二叉排序树的平均查找长度为:
n i1
ASL 1
ni Ci
m
其中:
ni 是每层结点个数; Ci 是结点所在层次数; m 为树深。
最坏情况:即插入的n个元素从一开始就有序, ——变成单支树的形态!
此时树的深度为n ; ASL= (n+1)/2 此时查找效率与顺序查找情况相同。
最好情况:即:与折半查找中的判ห้องสมุดไป่ตู้树相同(形态比较均衡) 树的深度为:log 2n +1 ; ASL=log 2(n+1) –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,则应作( ) 型调整以使其平衡。
第9章查找——精选推荐
第9章查找第9 章查找⼀、单选题1、静态查找表与动态查找表两者的根本差别在于。
A、逻辑结构不同B、存储实现不同C、施加的操作不同D、数据元素的类型不同2、采⽤顺序查找⽅法查找长度为n的线性表时,每个元素的平均查找长度为。
A、n B、n/2 C、(n+1)/2 D、(n-1)/23、对线性表进⾏⼆分查找时,要求线性表必须。
A、以顺序⽅式存储B、以链式⽅式存储C、以顺序⽅式存储,且结点按关键字有序排序D、以链式⽅式存储,且结点按关键字有序排序4、在表长为n的顺序表中进⾏顺序查找,在查找不成功时,与关键字⽐较的次数为。
A、nB、1C、n+1D、n-15、对于有序表(2,5,7,11,22,45,49,62,71,77,90,93,120),折半查找值为90的结点时,经过⽐较后查找成功。
A、1B、 2C、4D、56.快速排序在最坏情况下的时间复杂度是( )。
A、O(log2n)B、O(nlog2n)C、O(n2)D、O(n3)7、如果要求⼀个线性表既能较快地查找,⼜能适应动态变化的要求,可以采⽤查找⽅法。
A、分块B、顺序C、⼆分D、散列8、有⼀个长度为12的有序表,按⼆分查找法对该表进⾏查找,在表内各元素等概率情况下查找成功所需的平均⽐较次数为。
A、35/12B、37/12C、39/12D、43/129、当采⽤分块查找时,数据的组织⽅式为。
A、数据分为若⼲块,每块内数据有序B、数据分为若⼲块,每块内数据不必有序,但块间必须有序,每块内最⼤(或最⼩)的数据组成索引块C、数据分成若⼲块,每块内数据有序,每块内最⼤(或最⼩)的数据组成索引块D、数据分为若⼲块,每块(除最后⼀块外)中数据个数需相同10.在排序过程中,键值⽐较的次数与初始序列的排列顺序⽆关的是()。
A、直接插⼊排序和快速排序B、直接插⼊排序和归并排序C、直接选择排序和归并排序D、快速排序和归并排序和归并排11、从键盘依次输⼊关键字的值:t,u,r,b,o,p,a,s,c,l。
严蔚敏版数据结构C语言版PPT第九章
度较大,特别不适用于表长较大的查找表。
数
据 结
若以有序表表示查找表,则查找过程
构 可以基于“折半”进行。
折半查找只适用于有序表,且限于顺序存储结构
13
第 9 章 查找 9.2 基于线性表的查找 ②折半查找
基本思想: 数 1.首先确定查找表的中间位置;
据
结 2.然后将待查的值与中间位置的值进行比较, 构 若相等,则查找成功并返回此位置,否则须
50 -2 60 1
80 0 (a)一棵平衡二叉排序树
58 0 (b)一棵失去平衡的二叉排序树
30
第 9 章 查找
9.4 计算式查找法—哈希表
哈希表是什么?
以上两节讨论的表示查找表的各种结构的
数
共同特点:
据
结
1.记录在表中的位置和它的关键
构
字之间不存在一个确定的关系;
2.查找的过程为给定值依次和关 键字集合中各个关键字进行比较;
23
第 9 章 查找 9.3 基于树的查找 ①二叉排序树
例如: 50
数
30
80
据 结
20
40
90
构
10 25 35
66 85
23
88
不 是二叉排序树。
24
第 9 章 查找
9.3 基于树的查找 ①二叉排序树 查找算法
若二叉排序树为空,则查找不成功;
否则,
数 1. 若给定值等于根结点的关键字,则查找成功;
线性表的三种查找方法比较
顺序查找 折半查找 分块查找
数
据 表的结构 有序、无序
有序
表间有序
结
构 表的存储 顺序、链式
顺序
顺序、链式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
e.g: 查找 key = 8 的结点所在的数组元素的下标。 key
数组 ST.elem
i
8 0
100 1
10 2
……………… 0 n-3
7 n-2
1 n-1
3 n
1、静态查找表
1、顺序表的查找 • 应用范围:顺序表或线性链表表示的静态查找表。表内元素之间无序。 • 顺序表的表示和查找。 表示:typedef struct { ElemType * elem; int length; } SStable; 实现: 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,查找失败,否则,找到 key 所在的
// 数组元素的下标地址 } // Search_Seq
第九章 查找
1、静态查找表 2、动态查找表 3、哈希查找表
1、静态查找表
1、顺序表的查找 • 应用范围:顺序表或线性链表表示的静态查找表。表内元素之间无序。 • 顺序表的表示和查找。 表示: typedef float keyType; typedef int keyType;
typedef char * keyType; typedef struct { KeyType key; // 关键字域 …… } ElemType; typedef struct { ElemType * elem; int length; } SStable; // length = n+1 // n: 结点个数
e.g: 查找 key = 8 的结点所在的数组元素的下标。 key
数组 ST.elem
i
8
0
100
1
10
2
……………… 0
n-3
7
n-2
1
n-1
3
n
1、静态查找表
1、顺序表的查找 • 应用范围:顺序表或线性链表表示的静态查找表。表内元素之间无序。 • 顺序表的表示和查找。 表示:typedef struct { ElemType * elem; int length; } SStable; 实现: int Search_Seq( Sstable ST, KeyType key )
{ ST.elem[0]. key = key; // 哨兵 for ( i = ST.length ; ! EQ(ST.elem[i]. key, key ) ; - - i )
// n: 结点个数
设置哨兵的好处: 在顺序表中总可以找到 待查结点。否则,必须将
return i; // 返回 0,查找失败,否则,找到 key 所在的
return i; // 返回 0,查找失败,否则,找到 key 所在的
// 数组元素的下标地址 } // Search_Seq
for ( i = ST.length ; ! EQ(ST.elem[i]. key, key ) ; - - i )
return i; // 返回 0,查找失败,否则,找到 key 所在的 // 数组元素的下标地址 } // Search_Seq
• 性能分析:
平均查找长度ASL(Average Search Length ) 成功查找情况下:设每个结点的查找概率相等
ASL= ∑((
i=n
1
n-i+1)
1
n
)
一般查找情况下(包括成功、不成功两种情况):设成功与不成功两种情况可能性相等,每个 结点的查找概率也相等。
= (n+1)/ 2
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 )
e.g: 查找 key = 8 的结点所在的数组元素的下标。 i key
数…………… 0
7
1
3
0
1
2
n-3
n-2
n-1
n
1、静态查找表
1、顺序表的查找 • 应用范围:顺序表或线性链表表示的静态查找表。表内元素之间无序。 • 顺序表的表示和查找。 表示:typedef struct { ElemType * elem; int length; } SStable; 实现: 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,查找失败,否则,找到 key 所在的
// 数组元素的下标地址 } // Search_Seq
{ ST.elem[0]. key = key; // 哨兵 for ( i = ST.length ; ! EQ(ST.elem[i]. key, key ) ; - - i )
return i; // 返回 0,查找失败,否则,找到 key 所在的
// 数组元素的下标地址 } // Search_Seq
e.g: 查找 key = 8 的结点所在的数组元素的下标。 i key
数组 ST.elem
8
100
10
……………… 0
7
1
3
0
1
2
n-3
n-2
n-1
n
1、静态查找表
1、顺序表的查找 • 应用范围:顺序表或线性链表表示的静态查找表。表内元素之间无序。 • 顺序表的表示和查找。 表示:typedef struct { ElemType * elem; int length; } SStable; 实现: 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,查找失败,否则,找到 key 所在的
// 数组元素的下标地址 } // Search_Seq
e.g: 查找 key = 8 的结点所在的数组元素的下标。 key
数组 ST.elem
i 8 1 3
8
100
10
……………… 0
0
1
2
n-3
n-2
n-1
n
1、静态查找表
1、顺序表的查找 • 应用范围:顺序表或线性链表表示的静态查找表。表内元素之间无序。 • 顺序表的表示和查找。 表示:typedef struct { ElemType * elem; int length; } SStable; 实现: 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,查找失败,否则,找到 key 所在的
// 数组元素的下标地址 } // Search_Seq
// 数组元素的下标地址 } // Search_Seq
判断条件 i >= 0 加进 for
语句。
e.g: 查找 key = 8 的结点所在的数组元素的下标。 key
数组 ST.elem
i
7 1 3
8
100
10
……………… 0
0
1
2
n-3
n-2
n-1
n
1、静态查找表
1、顺序表的查找 • 应用范围:顺序表或线性链表表示的静态查找表。表内元素之间无序。 • 顺序表的表示和查找。 表示:typedef struct { ElemType * elem; int length; } SStable; 实现: 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,查找失败,否则,找到 key 所在的
// 数组元素的下标地址 } // Search_Seq
{ ST.elem[0]. key = key; // 哨兵 for ( i = ST.length ; ! EQ(ST.elem[i]. key, key ) ; - - i )
return i; // 返回 0,查找失败,否则,找到 key 所在的
// 数组元素的下标地址 } // Search_Seq
1、静态查找表
1、顺序表的查找 • 应用范围:顺序表或线性链表表示的静态查找表。表内元素之间无序。 • 顺序表的表示和查找。 表示:typedef struct { ElemType * elem; int length; } SStable; // length = n+1 实现: int Search_Seq( Sstable ST, KeyType key )
e.g: 查找 key = 8 的结点所在的数组元素的下标。 i key
数组 ST.elem