第九章 查找

合集下载

数据结构第九章--查找-习题及答案

数据结构第九章--查找-习题及答案

第九章查找一、选择题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

九章查找Search

i 1
A S L
Pi Ci
n
其中: n 为表长,Pi 为查找表中第i个记录的概率,假设
每次查找都是成功的,则有pi=1
Ci为找到该记录时,比较过的关键字的个数, Ci = n-i+1,ASL = nP1 +(n-1)P2 +…+2Pn-1+Pn,如果要
查找的元素在表中的任何位置的概率是相等的,p=1/n ,ASL=(n+1)/2
第九章 查找(Search)
9.1 基本概念 9.2 静态查找表 9.3 动态查找表 9.4 Hash表
9.1 基本概念
如何评估查找方法的优劣?
查找的过程就是将给定的值与文件中各记录的关
键字逐项进行比较的过程。所以用比较次数的平均值
来评估算法的优劣,称为平均查找长度(ASL:
average search length)。i1
三、索引顺序表的查找(分块查找)
分块查找的数据结构:
D={d1,d2,….,dn} 1. 将n个数据元素分为s个块 B1,B2, …, Bs ; 2. 块之间有序:Bi+1中的任一元素小于Bi中的任一元
return ERROR; T->data = R[i]; // 生成结点
if (i==low) T->lchild = NULL; // 左子树空 else SecondOptimal(T->lchild, R, sw, low, i-1);
// 构造左子树 if (i==high) T->rchild = NULL; // 右子树空 else SecondOptimal(T->rchild, R, sw, i+1, high);

第九查找

第九查找
查找不成功:查找失败的过程就是走了一条从根结点到外部 结点的路径,和给定值进行的关键码的比较次数等于该路径 上内部结点的个数。
Data Structure
作业
设有序顺序表中的元素依次为017, 094, 154, 170, 275, 503, 509, 512, 553, 612, 677, 765, 897, 908。试画出对其进行折半搜索时的二叉判定树, 并 计算搜索成功的平均搜索长度和搜索不成功的平均 搜索长度。
查找失败:
n+1
int Search_Seq(SSTable ST,KeyType key) {
//在顺序表ST中顺序查找其关键字等于key的数据元素。 //若找到,则函数值为该元素在表中的位置,否则为0。
ST.elem[0].key = key; //0号单元作为监视哨
for ( i=ST.length; !EQ (ST.elem[i].key , key); --i ); //从后往前找
high=2 mid=1 7<14
low=2
mid=2 14=14
Data Structure
high=13
例:查找值为22的记录的过程:
0 1 2 3 4 5 6 7 8 9 10 11 12 13
7 14 18 21 23 29 31 35 38 42 46 49 52
low=1 18<22 mid=7 31>22 mid=3 high=6
Lw — —在块中查找元素的平均查找长度
若将表长为 n的表平均分成 b块,每块含 s个记录,并设表中每个 记录的 查找概率相等,则:
(1)用顺序查找确定所在块 :ASLbs
=
1 b
b j =1

数据结构教程 第5版 第9章-查找

数据结构教程 第5版 第9章-查找
4/51
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):若查找表中不存在这 一记录,给出“空记录”或“空指针”。

第九章 查找

第九章  查找

• 9.2.2 二叉排序树 一、二叉排序树的定义 二叉排序 排序树或者是一棵空树;或者是 排序 具有如下特性的二叉树: (1)若它的左子树不空,则左子树上 所有结点的值均小于根结点的值; (2)若它的右子树不空,则右子树上 所有结点的值均大于根结点的值; (3)它的左、右子树也都分别是二叉 排序树。 排序
• 9.1 静态查找表 • 9.1.1 静态查找表的类型定义 静态查找表的抽象数据类型定义如下: ADT StaticSearchTable { 数据对象: 数据对象:D是具有相同特性的数据元素的集合。 每个数据元素含有类型相同的关键字,可唯一标识数 据元素。 数据关系:D中所有数据元素同属一个集合。 数据关系: 基本操作: 基本操作:p.216 } ADT StaticSearchTable
• 9.2 动态查找树表 • 9.3.1 动态查找表的类型定义 动态查找表的抽象数据类型定义如下: ADT DynamicSearchTable { 数据对象D: 数据对象 :D是具有相同特性的数据元素 的集合。每个数据元素含有类型相同的关键字, 可唯一标识数据元素。 数据关系R: 数据关系 :数据元素同属一个集合。 基本操作P: 基本操作 :p. 226 } ADT DynamicSearchTable
• 9.1.4 索引顺序表 静态查找表的实现方法之三 索引顺序表-静态查找表的实现方法之三 以顺序存储结构的线性表存储静态查找表中的 记录,要求线性表中的记录按关键字"分段有序", 并在建立这个"分段有序"的顺序表的同时,另建一 个"索引",索引为"索引项"的有序表,而每个索引 项则由各分段的"最大关键字"和"起始序号"组成, 由"分块有序表"和相应的"索引"构成一个"索引顺序 表"。 在索引顺序表中进行查找的过程为:首先在索 引表中进行折半或顺序查找,以确定待查关键字在 分块有序表中所在"块",然后在"块"中进行顺序查 找。这种查找方法被称为"索引顺序查找"或"分块 查找"。 演示

(完整word版)数据结构第九章查找

(完整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章 查找2-二叉树和平衡二叉树

数据结构:第9章 查找2-二叉树和平衡二叉树
NODE *t; char x; {if(t==NULL)
return(NULL); else
{if(t->data==x) return(t);
if(x<(t->data) return(search(t->lchild,x));
else return(search(t->lchild,x)); } }
——这种既查找又插入的过程称为动态查找。 二叉排序树既有类似于折半查找的特性,又采用了链表存储, 它是动态查找表的一种适宜表示。
注:若数据元素的输入顺序不同,则得到的二叉排序树形态 也不同!
讨论1:二叉排序树的插入和查找操作 例:输入待查找的关键字序列=(45,24,53,45,12,24,90)
二叉排序树的建立 对于已给定一待排序的数据序列,通常采用逐步插入结点的方 法来构造二叉排序树,即只要反复调用二叉排序树的插入算法 即可,算法描述为: BiTree *Creat (int n) //建立含有n个结点的二叉排序树 { BiTree *BST= NULL;
for ( int i=1; i<=n; i++) { scanf(“%d”,&x); //输入关键字序列
– 法2:令*s代替*p
将S的左子树成为S的双亲Q的右子树,用S取代p 。 若C无右子树,用C取代p。
例:请从下面的二叉排序树中删除结点P。
F P
法1:
F
P
C
PR
C
PR
CL Q
CL QL
Q SL
S PR
QL S
SL
法2:
F
PS
C
PR
CL Q
QL SL S SL

第9章查找

第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.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 次比较就能找到目标元素。

接下来是二叉查找树。

它是一种特殊的数据结构,每个节点最多有两个子节点,左子节点的值小于父节点,右子节点的值大于父节点。

通过这种特殊的结构,我们可以快速地在树中查找目标元素。

插入和删除操作也相对方便,但要注意保持树的平衡,否则查找的效率可能会下降。

还有哈希表,这是一种非常高效的查找结构。

它通过一个哈希函数将关键字映射到一个特定的位置。

如果哈希函数设计得好,查找的时间复杂度可以接近常数级别。

但哈希表也有它的问题,比如可能会出现哈希冲突,需要通过合适的冲突解决方法来处理。

在实际应用中,选择哪种查找方法取决于具体的情况。

如果数据量较小,顺序查找可能就足够了;如果数据是有序的,二分查找是个不错的选择;如果需要频繁的插入和删除操作,二叉查找树可能更合适;而对于大规模数据且查找操作频繁的情况,哈希表往往能发挥出巨大的优势。

数据结构 C语言版(严蔚敏版)第9章 查找

数据结构 C语言版(严蔚敏版)第9章 查找

若大于,查找范围的高端数据元素指针high 不变,低端数据元素指针low更新为mid+1; (4)重复步骤(2)、(3)直到查找成功或 查找范围空(low>high),即查找失败为止。 (5)如果查找成功,返回找到元素的存放位 置,即当前的中间项位置指针 mid;否则返回 查找失败标志。
折半查找的c语言算法程序: int Search_Bin( SSTable ST, int n, int key) {int low, high,mid;
查找:在数据元素集合中查找满足某种条 件的数据元素的过程称为查找。最简单且最常 用的查找条件是“关键字值等于某个给定值” ,在查找表搜索关键字等于给定值的数据元素 (或记录)。若表中存在这样的记录,则称查 找成功,此时的查找结果应给出找到记录的全 部信息或指示找到记录的存储位置;若表中不 存在关键字等于给定值的记录,则称查找不成 功,此时查找的结果可以给出一个空记录或空 指针。若按主关键字查找,查找结果是唯一的 ;若按次关键字查找,结果可能是多个记录, 即结果可能不唯一。
while(ST[i].key!=key) i- -;
return i; }
0 1 0
/*从表尾往前查*/ 找到:返回元素 的存 1 2 3 4 在线 5 性表 6 中7 10 20 40 80 储位置; 30 60 25 (a) 初态 未找到:返回0。
2 3 4 5 6 7
80
监视哨 0
10
1
20
动态查找表:若在查找过程中可以将查找 表中不存在的 数据元素插入 ,或者从查找表中 删除某个数据元素 ,则称这类查找表为动态查 找表。动态查找表在查找过程中查找表可能会 发生变化。对动态查找表进行的查找操作称为 动态查找。 关键字:是数据元素中的某个数据项。唯 一能标识数据元素(或记录)的关键字,即每 个元素的关键字值互不相同,我们称这种关键 字为主关键字;若查找表中某些元素的关键字 值相同,称这种关键字为次关键字。例如,银 行帐户中的帐号是主关键字,而姓名是次关键 字。

第+9+章+查找n

第+9+章+查找n

else return 0 ; 0 1 2 3 4 5
一次查找所需的平均
6 7 8 9 10 11
}
60 5 37 19 21 13 5时6 间6几4 乎92减少88一半80。75
优点:算法简单,适应面广。 顺序查找
缺点:平均查找长度大,不适用于表长大的查找表。
制作:计算机科学与技术系 徐振中
数据结构
typedef struct { ElemType * elem; int length; // 表长度
} SSTable;
静态查找表的顺序存储结构
制作:计算机科学与技术系 徐振中
数据结构
第九章 查找
当静态查找表用不同的方法表示时,实现查找操作的
方法也不同。
顺序表 表示静态查找表
线性链表
顺序查找
9.1.1 顺序表的查找(顺序查找)
而这样的“查询”或“检索”是任何计算机应用系统中使用频 度都很高的操作,因此设法提高查找表的查找效率,是本章讨 论问题的出发点。
可以想像的到,如果能有目标地进行查找肯定比在一大堆 事物中瞎摸要有效得多,因此为提高查找效率,一个办法就是 在构造查找表时,在集合中的数据元素之间人为地加上某种确 定的约束关系。本章正是讨论查找表的各种组织方法及其查找 过程的实施。
2、记录的查找概率无法测定时如何提高查找效率?
方法:
1)、在每个记录中设一个访问频度域;
2)、始终保持记录按非递增有序的次序排列;
3)、每次查找后均将刚查到的记录直接移至表头。
制作:计算机科学与技术系 徐振中

数据结构
第九章 查找
9.1.2 有序表的查找(折半查找)
有序表表示静态查找表
折半查找

数据结构-第九章 查找

数据结构-第九章 查找

数据结构-第九章查找数据结构第九章查找在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地进行访问、操作和管理。

而查找,作为数据结构中的一个重要概念,在我们处理和分析数据的过程中起着关键作用。

查找,简单来说,就是在一组数据中寻找特定的元素。

这听起来似乎很简单,但实际上,它涉及到一系列复杂的算法和策略,以确保能够快速准确地找到我们所需的信息。

让我们先来了解一下顺序查找。

顺序查找是最简单也是最直观的查找方法。

它的基本思想就是从数据集合的开头,逐个元素地进行比较,直到找到目标元素或者遍历完整个集合。

这种方法对于小型数据集或者数据没有特定规律的情况是可行的,但效率相对较低。

想象一下,你要在一本没有索引的电话簿中查找一个人的号码,只能从头开始一个一个地翻,这就是顺序查找的过程。

与顺序查找相对的是二分查找。

二分查找要求数据集合是有序的。

它通过不断地将数据集一分为二,比较目标元素与中间元素的大小,从而缩小查找范围。

这种方法的效率比顺序查找高得多。

比如说,要在一本按照姓名拼音排序的电话簿中查找一个人,我们可以先比较中间的名字,如果目标在前面,就只在前半部分继续查找,反之则在后半部分查找,如此反复,大大提高了查找的速度。

除了上述两种常见的查找方法,还有哈希查找。

哈希查找的核心是通过一个哈希函数将元素映射到一个特定的位置。

哈希函数的设计至关重要,一个好的哈希函数能够使得元素均匀地分布在哈希表中,减少冲突的发生。

当我们要查找一个元素时,通过哈希函数计算出其可能的位置,然后进行比较。

如果哈希函数设计得不好,可能会导致大量的冲突,从而影响查找效率。

在实际应用中,选择合适的查找方法取决于多个因素。

数据的规模是一个重要的考虑因素。

如果数据量较小,顺序查找可能就足够了;但对于大规模的数据,二分查找或者哈希查找通常更合适。

数据的分布情况也会影响选择。

如果数据分布比较均匀,哈希查找可能效果较好;如果数据有序,二分查找则更具优势。

数据结构-第9章 查找

数据结构-第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很大时查找效率较低 • 改进措施:非等概率查找时,可将查找概率高 的记录尽量排在表后部。

数据结构 第九章 查找

数据结构 第九章  查找

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) 动态查找表
关键字惟一确定一条记录
属性名 (字段名)

第9章查找——精选推荐

第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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第九章查找习题及答案一、基础知识题1.对含有n个互不相同元素的集合,同时找最大元和最小元至少需进行多少次比较?2.若对具有n个元素的有序的顺序表和无序的顺序表分别进行顺序查找,试在下述两种情况下分别讨论两者在等概率时的平均查找长度:(1)查找不成功,即表中无关键字等于给定值K的记录;(2)查找成功,即表中有关键字等于给定值K 的记录。

3.画出对长度为18的有序的顺序表进行二分查找的判定树,并指出在等概率时查找成功的平均查找长度,以及查找失败时所需的最多的关键字比较次数。

答:如图:4.为什么有序的单链表不能进行折半查找?5.设有序表为(a,b,c,e,f,g,i,j,k,p,q),请分别画出对给定值b,g和n进行折半查找的过程。

6.将(for, case, while, class, protected, virtual,public, private, do, template, const ,if,int)中的关键字依次插入初态为空的二叉排序树中,请画出所得到的树T。

然后画出删去for之后的二叉排序树T',若再将for插入T'中得到的二叉排序树T''是否与T相同?最后给出T"的先序、中序和后序序列。

答:二叉排序树T如下图:删去for后的二叉排序树如下图:圈内的for表示再插入后的结点:7.对给定的关键字集合,以不同的次序插入初始为空的树中,是否有可能得到同一棵二叉排序树?8.将二叉排序树T的先序序列中的关键字依次插入一空树中,所得和二叉排序树T'与T"是否相同?为什么?9.设二叉排序树中关键字由1至1000的整数构成,现要查找关键字为363的结点,下述关键字序列哪一个不可能是在二叉排序树上查找到的序列?(a) 2,252,401,398,330, 344,397,363;(b) 924, 220, 911, 244, 898, 258, 362, 363;(c) 925, 202, 911, 240, 912, 245, 363;(d) 2, 399, 387, 219, 266, 382, 381, 278, 363.10.设二叉排序树中关键字互不相同,则其中最小元必无左孩子,最大元必无右孩子。

此命题是否正确?最小元和最大元一定是叶子吗?一个新结点总是插在二叉排序树的某叶子上吗?11.在一棵m阶的B-树中,当将一关键字插入某结点而引起该结点的分裂时,此结点原有多少个关键字?若删去某结点中的一个关键字,而导致结点合并时,该结点中原有几个关键字?12.在一棵B-树中,空指针数总是比关键字数多一个,此说法是否正确?请问包含8个关键字的3阶B-树(即2-3树)最多有几个结点?最少有几个结点?画出这两种情况的B-树。

答:图如下:13.从空树开始,依次输入20,30,50,52,60,68,70,画出建立2-3树的过程。

并画出删除50和68后的B-树状态。

答:过程如下:(1) 插入20,30: (2) 插入50:(3) 插入52: (4) 插入60:(5) 插入68: (6) 插入70:(7)删去50: (8) 删去68(答案及点评) 14。

画出依次插入z,v,o,p,w,y到图9.12(h)所示的5阶B-树的过程。

答:如图:第一步,插入z:第二、三步,插入v,o:第四五六步,插入p,w,y:15. 在含有n个关键字的m阶B-树中进行查找,至多读盘多少次?完全平衡的二叉排序树的读盘次数大约比它大多少倍?16.为什么在内存中使用的B-树通常是3阶的,而不使用更高阶的B-树?17.为什么二叉排序树长高时,新结点总是一个叶子,而B-树长高时,新结点总是根?哪一种长高能保证树平衡?18.已知关键字序列为(PAL,LAP,PAM,MAP,PAT,PET,SET,SAT,TAT,BAT)试为它们设计一个散列函数,将其映射到区间[0..n-1]上,要求碰撞尽可能的少。

这里n=11,13,17,19.19.对于一组给定的、固定不变的关键字序列,有可能设计出无冲突的散列函数H,此时称H为完备的散列函数(perfect hashing function),若H能无冲突地将关键字完全填满散列表,则称H是最小完备(minimal perfect)的散列函数。

通常找完备的散列函数非常困难,找最小完备的散列函数就更困难。

请问:(1)若h是已知关键字集合K的完备的散列函数,若要增加一个新的关键字到集合K,一般情况下H还是完备的吗?(2)已知关键字集合为(81,129,301,38,434,216,412,487,234),散列函数为H(x)=(x+18)/63,请问H是完备的吗?它是最小完备的吗?(3)考虑由字符串构成的关键字集合(Bret,Jane,Shirley,Bryce,Michelle,Heather),试为散列表[0..6]设计一个完备的散列函数。

(提示:考虑每个字符串的第3个字符,即s[2])20.设散列函数为h(key)=key%101,解决冲突的方法为线性探查,表中用"-1"表示空单元。

若删去散列表HT中的304(即令HT[1]=-1)之后,在表HT中查找707将会发生什么?若将删去的表项标记为"-2",查找时探查到-2继续向前搜索,探查到-1时终止搜索。

请问用这种方法删304后能否正确地查找到707?0 1 2 3 100┌──┬──┬──┬──┬─┬─┬─┬─┬─┬─┬─┐HT │202│304 │507 │707 │... ... │└──┴──┴──┴──┴─┴─┴─┴─┴─┴─┴─┘21.设散列表长度为11,散列函数h(x)=x%11,给定的关键字序列为:1,13,13,34,38,33,27,22.试画出分别用拉链法和线性探查法解决冲突时所构造的散列表,并求出在等概率情况下,这两咱方法查找成功和失败时的平均查找长度。

请问装填因子的值是什么?22.假定有k个关键字互为同义词,若用线性探查法把这些同义词存入散列表中,至少要进行多少次探查?23.为什么说当装填因子非常接近1时,线性探查类似于顺序查找?为什么说当装填因子比较小(比如α=0.7左右)时,散列查找的平均查找时间为O(1)?答案:1、答:我们可以设立两个变量max和min用于存放最大元和最小元(的位置),第一次取两个元素进行比较,大的放入max,小的放入min,从第2次开始,每次取一个元素先和max比较,如果大于max则以它替换max,并结束本次比较;若小于max则再与min相比较,在最好的情况下,一路比较下去都不用和min相比较,所以这种情况下,至少要进行n-1次比较就能找到最大元和最小元。

(顺便说一下,最坏情况下,要进行2n-3次比较才能得到结果) 2、答:查找不成功时,需进行n+1次比较才能确定查找失败。

因此平均查找长度为n+1,这时有序表和无序表是一样的。

查找成功时,平均查找长度为(n+1)/2,有序表和无序表也是一样的。

因为顺序查找对表的原始序列的有序性不感兴趣。

3、答:请看题图。

等概率情况下,查找成功的平均查找长度为:ASL=(1+2*2+3*4+4*8+5*3)/18=3.556 也可以用公式代,大约为:ASL=(18+1)lg(18+1)/18-1=3.346查找失败时,最多的关键字比较次树不超过判定树的深度,此处为5.4、答:因为链表无法进行随机访问,如果要访问链表的中间结点,就必须先从头结点开始进行依次访问,这就要浪费很多时间,还不如进行顺序查找,而且,用链存储结构将无法判定二分的过程是否结束,因此无法用链表实现二分查找。

5、解: b的查找过程如下(其中括号表示当前查找区间,圆括号表示当前比较的关键字)下标: 1 2 3 4 5 6 7 8 9 10 11 12 13第一次比较:[a b c d e f (g) h i j k p q]第二次比较:[a b (c)d e f] g h i j k p q第三次比较:[a(b)]c d e f g h i j k p q经过三次比较,查找成功。

g的查找过程如下:[a b c d e f (g) h i j k p q]一次比较成功。

n的查找过程如下:下标: 1 2 3 4 5 6 7 8 9 10 11 12 13第一次比较:[a b c d e f (g) h i j k p q]第二次比较: a b c d e f g [h i (j) k p q]第三次比较: a b c d e f g h i j [k (p) q]第四次比较: a b c d e f g h i j [k] p q]经过四次比较,查找失败。

6、答:见题图:T"的先序序列是:do case class const while protected private if for int virtual public templateT"的中序序列是:case class const do for if int private protected public template virtual whileT"的后序序列是:const class case for int if private template public virtual protected while do7、答:有可能。

如有两个序列:3,1,2,4 和 3,4,1,2,它们插入空树所得的二叉排序树是相同的。

8、答:这两棵二叉树完全相同。

9、答:(c)是不可能查找到的序列。

我们可以把这四个序列各插入到一个初始为空的二叉排序树中,结果可以发现,(c)序列所形成的不是一条路径,而是有分支的,可见它是不可能在查找过程中访问到的序列。

10、答:此命题正确。

假设最小元有左孩子,则根据二叉排序树性质,此左孩子应比最小元更小,如此一来就产生矛盾了,因此最小元不可能有左孩子,对于最大元也是这个道理。

但最大元和最小元不一定是叶子,它也可以是根、内部结点(分支结点)等,这得根据插入结点时的次序而定。

如3,1,2,4 这个集合,根据不同的插入次序可以得到不同的二叉排序树:○3/ \○1 ○4○2○2 / \ ○1 ○3 \○4○4\○3 \○2 \○1○2/ \○1 ○4/○3新结点总是插入在二叉排序树的某个叶子上的。

11、答:在此树中,若由于一关键字的插入某结点而引起该结点的分裂时,则该结点原有m-1个关键字。

若删去某结点中一个关键字而导致结点合并时,该结点中原有┌m/2┐-1个关键字。

12、答:这个说法是正确的。

包含8个关键字的3阶B-树最多有7个结点,最少有4个结点。

见题图。

相关文档
最新文档