第八章 查找

合集下载

第8章 查找

第8章 查找


• 查找的分类
1. 按查找条件分为按记录的主关键字查找和多 关键字组合查找
2. 按查找数据在外存或者内存分为外部查找和 内部查找 3. 按目的分为静态查找和动态查找。
4. 静态查找就是在查找表中查找满足条件的记 录是否存在。 5. 动态查找是确定待查记录查找的位置,进而 进行插入或删除操作。
8.2 静态查找
8.1 查找的基本概念
• 查找表:在计算机中,被查找的数据对象是 由同一类型的数据元素(或记录)构成的集 合,可称之为查找表。
• 关键字:在实际应用问题中,每个记录一般 包含有多个数据域,查找是根据其中某一个 或几个指定的域进行的,这个作为查找依据 的域称为关键字。
• 主关键字与次关键字:在所有关键字中,我 们将能唯一标识一个数据元素的关键字称为 主关键字;而其它关键字称为辅助关键字或 次关键字。 • 查找:又称检索,它是根据给定的关键字值 ,在查找表中找出其关键字等于给定值的数 据元素。若有这样一个记录,则查找成功, 查找结果可输出该记录内容或给出该记录在 文件中的位置;若不存在这样的记录,返回 特定的值,查找不成功。
• 8.2.1 顺序表上的顺序查找 • 8.2.2折半查找 • 8.2.3 分块查找
8.2.1 顺序表上的顺序查找
顺序查找的基本思想
从顺序表的一端开始,依次将每个元素的关键 字同给定值K进行比较。若某个关键字值为K, 则查找成功,返回元素所在下标i;若所有元素 都比较完,仍找不到,则查找失败,返回0。
顺序查找算法-结点定义(适用于顺序查 找和折半查找)
#define MAXSIZE 100 typedef struct { int key; // 关键字项 } Sselement; typedef struct { SSELEMENT r[MAXSIZE]; int len; // 顺序表长度 } SSTable; // 顺序表类型

第八章 查找

第八章 查找
例 关键字为 :0442205864,哈希地址位数为4 5864 4220 04 10088 H(key)=0088 5864 0224 04 6092 H(key)=6092
8.2.3 分块查找
查找过程:将表分成几块,块内无序,块间有序; 先确定待查记录所在块,再在块内顺序查找. 适用条件:分块有序表. 算法实现 用数组存放待查记录,每个数据元素至少含有关 键字域. 建立索引表,每个索引表结点含有块最大关键 字域和指向块第一个结点的指针.
分块查找方法图示
索引表 22 1 48 7 86 13 查38
直接定址法
构造:取关键字或关键字的某个线性函 数作哈希地址,即H(key)=key 或 H(key)=akey+b 特点 直接定址法所得地址集合与关键字集合 大小相等,不会发生冲突. 实际中能用这种哈希函数的情况很少.
数字分析法
构造:对关键字进行分析,取关键字的若干位或其组 合作为哈希地址. 适于关键字位数比哈希地址位数大,且可能出现的关 键字事先知道的情况.
关键码 THE A TO OF IN THAT AND IS 二进制形式 101000100000101 0001 1010001111 0111100110 0100101110 1010001000000011010 0 000010111000100 0100110011 抽取结果(散列函数值) (101)2=5 (001)2=1 (111)2=7 (110)2=6 (010)2=2 (100)2=4 (000)2=0 (011)2=3
对含有 n 个记录的表, 其中: p i 为查找表中第 c i 为找到表中第 ASL =

n
i =1
pici
i 个元素的概率,

第八章查找——精选推荐

第八章查找——精选推荐

查找一.选择题1.若查找每个元素的概率相等,则在长度为n 的顺序表上查找到表中任一元素的平均查找长度为_____________。

A. nB. n+1C. (n-1)/2D. (n+1)/2分析:本题主要考查顺序表的平均查长度的计算,在等概率下,ASLsucc=nP1+(n-1)P2+……+2Pn-1 +Pn=[n+(n-1)+ ……+1]/n = (n+1)/2,其中:Pi 为查找第i 个元素的概率。

所以答案为D。

2.折半查找的时间复杂度_____________。

A.O(n*n)B.O(n)C. O(nlog2n)D. O(log2n)分析:本题考查折半查找的基本思想和对应的判定树。

因为对n 个结点的线性表进行折半查找,对应的判定树的深度是 log2n +1,折半查找的过程就是走了一条从判定树的根到末端结点的路径,所以答案为D。

3.采用分块查找时,数据的组织方式为_____________。

A. 把数据分成若干块,每块内数据有序B. 把数据分成若干块,块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引表C. 把数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引表D. 把数据分成若干块,每块(除最后一块外)中的数据个数相等分析:本题主要考查分块查找的数据组织方式特点。

在分块查找时,要求块间有序,块内或者有序或者无序。

这样,在查找记录所在的块时,可以采用折半查找。

所以答案为B。

4.二叉排序树的查找效率与二叉排序树的(1)有关,当(2)时,查找效率最低,其查找长度为n。

(1) A.高度B.结点的个数C.形状D.结点的位置(2) A.结点太多B.完全二叉树C.呈单叉树D.结点的结构太复杂分析:本题主要考查二叉排序树的查找效率与二叉排序树形存在一定的关系。

当二叉排序树的前 log2n 层是满二叉树时,其查找效率最高,其查找长度最大为 log2n +1;当二叉排序树呈单叉树时,其查找效率最低,其查找长度最大为n,此时相当于顺序查找。

数据结构第8章 查找 答案

数据结构第8章 查找 答案

第8章 查找 测试题 及答案一、填空题1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是 顺序查找(线性查找) 。

2. 线性有序表(a 1,a 2,a 3,…,a 256)是从小到大排列的,对一个给定的值k ,用二分法检索表中与k 相等的元素,在查找不成功的情况下,最多需要检索 8 次。

设有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.【计研题2000】折半查找有序表(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)。

第8章 查找

第8章 查找

72
85
88
90
11
[ 35 ↑ ↑ low mid [ 35 ↑ low
64
72
85
88
90
98
5
11
23 ] ↑ high
64
72
85
88
90
98
(b) 查找K=30的过程(三次关键字比较后查找失败)
6 3 9
1
4
7
10
•不成功:从根到叶子或度1结点
2
5
8
11
二、算法实现
(略)
三、性能分析
•最坏:不超过树高, log2(n + 1) •平均:ASL≈(n+1)/n*log2(n+1)-1 ≈log2(n+1)-1=O(log2n) 。
第8章 查找
8.1 8.2 8.3 8.4 基本概念 静态查找表 树表的查找 散列表
查找就是在数据集合中寻找满足某种条件的数据对象。
知识点结构
查找的基本概念 查找结构 查找算法的时间性能
静态表的查找技术 顺序查找 二分查找
树表的查找技术 二叉排序树
散列表的查找技术 散列的基本思想
插值查找
斐波那契查找
6 3 9
1
4
7
10
2
5
8
11

10个结点的有序表,用二分查找,成功和不成功的ASL=?
首先,建立判定树:mid=(low+high)/2
5 2 1 3 4 6 7 8 9 10
查找成功时:ASL=(1×1+2×2+3×4+4×3)/10 不成功时:ASL=(3×5+4×6)/11

第8章 查找 习题参考答案

第8章 查找 习题参考答案

习题八 参考答案一、选择题1.对线性表进行二分查找时,要求线性表必须( B )A.以顺序方式存储B.以顺序方式存储,且结点按关键字值有序排列C.以链接方式存储D.以链接方式存储,且结点按关键字值有序排列2. 用二分查找法查找具有n 个结点的顺序表时,查找每个结点的平均比较次数是( D )A.O(n 2)B.O(nlog 2n)C.O(n)D.O(log 2n)3. 对长度为4的顺序表进行查找,若查找第一个记录的概率为1/24, 查找第二个记录的概率为1/6, 查找第三个记录的概率为2/3, 查找第四个记录的概率为1/8,则查找任意一个记录的平均查找长度为( A )A.23/8B.20/8C.17/8D.14/84. 若有一个长度为64的有序表,现用二分查找方法查找某一记录,则查找不成功,最多需要比较( B )次。

A.9B.7C.5D.35. 当采用分块查找时,数据的组织方式为( C )A.数据必须有序B.数据不必有序C.数据分成若干块,每块内数据不必有序,但块间必须有序D.数据分成若干块,每块内数据必须有序,但块间不必有序6. 一棵深度为k 的平衡二叉树,其每个非终端结点的平衡因子均为0,则该平衡二叉树共有( C )个结点。

A.2k-1-1B.2k-1+1C.2k -1D.2k +17. 具有5层结点的平衡二叉树至少有( B )个结点。

A.10B.12C.15D.178. 若结点的存储地址与其关键字之间存在某种映射关系,则称这种存储结构为( D )A.顺序存储结构B.链式存储结构C.索引存储结构D.散列存储结构9. 以下有关m 阶B-树的叙述中,错误的是( B )。

A.根结点至多有m 棵子树B.每个结点至少有⎥⎥⎤⎢⎢⎡2m 棵子树 C.所有叶子结点都在同一层上 D.每个结点至多有m-1个关键字10.哈希表的地址区间为0~17,哈希函数为h(key)=K%17。

采用线性探测法处理冲突,并将关键字序列{26,25,72,38,8,18,59}依次存储到哈希表中,则在哈希表中查找元素59需要搜索的次数为( C )。

西北大学:数据结构第8章 查 找

西北大学:数据结构第8章 查 找
返回主目录
基于线性表的查找法
比较式查找法 查找的基本方法:
基于树的查找法
计算式查找法-HASH(哈希)查找法
返回主目录
8.2 基于线性表的查找法
具有顺序查找法、折半查找法和分块查找法三种
8.2.1 顺序查找法 顺序查找法的特点是:用所给关键字与线性表中 各元素的关键字逐个比较,直到成功或失败。 顺序结构 存储结构: 链式结构
返回主目录
LB= 1 ∑j= b j=1
b
b+1 2
Lw= 1 ∑j= s i=1
b+s +1 2
s
s+1 2
ASLbs=LB+LW = 将b=n/s代入,得 ASLbs=
1 ( n +s) +1 2 s
返回主目录
8.3 基于树的查找法
基于树的查找法(树表查找法),是将待查表组 织成特定树的形式并在树结构上实现查找的方法 。
return(i);
}
其中l.r[0]为监视哨,可以起到防止越界的作用。
返回主目录
不设置监视哨的顺序查找算法
int SeqSearch(RecordList l, KeyType k) /*不用监视哨法,在顺序表中查找关键字等于k的元素*/ {
l.r[0].key=k; i=l.length;
while (i>=1&&l.r[i].key!=k) i--; if (i>=1) return(i)else return (0); } 循环条件i>=1判断查找是否越界。
返回主目录
生成二叉排序树的算法:
void CreateBST(BSTree *bst)
/*从键盘输入元素的值,创建相应的二叉排序树*/

程序设计基础(C语言)第8章 查找和排序算法

程序设计基础(C语言)第8章 查找和排序算法
mid = low + (high - low) / 2;
8.2.3二分查找的实际应用
• 【例8.3】用二分法求下面的
一元三次方程 x3 x 1 0
在区间[1, 3]上误差不大于 10-6的根。先从键盘输入迭 代初值 x0和允许的误差 , 然后输出求得的方程根和所 需的迭代次数。
//函数功能:用二分法计算并返回方程的根 double Iteration(double x1, double x2, double eps) {
8.1.2线性查找算法的程序实现
#include <stdio.h>
#define N 40
int ReadRecord(int num[], int weight[]);
int LinSearch(int num[], int key, int n);
//主函数
int main(void)
{
int num[N], weight[N], n, pos, key;
double x0; do{
return BinSearch(num, key, mid+1, high); //在后一子表查找 } else if (key < num[mid]) {
return BinSearch(num, key, low, mid-1); //在前一子表查找 } return mid; //找到,返回找到的位置下标 }
序排列的。
int BinSearch(int num[], int key, int low, int high) {
int mid = (high + low) / 2; //取数据区间的中点 if (low > high) //递归结束条件 {
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A.折半查找方法不适用于按值有序链接的链表的查找
B.折半查找方法适用于按值有序的顺序表的查找
C.折半查找方法适用于按关键字值大小有序排列的顺序文件的查找
D.折半查找方法适用于排序连续顺序文件的查找
(5)在有序表(k1,k2,...,k9,)中采用折半查找方法查找99次,其中,至少有一个元素被比较了99次,该元素是--。
A.参加比较的关键字值的多少
B.被查找的关键字值在关键字序列中的位置
C.关键字序列中是否存在被查找关键字值
D.关键字值的平均比较次数的多少
(2)顺序查找方法的优点之一是- 。 ·
A.对于被查找对象几乎没有限制 B.适合排序连续顺序文件的查找
(1)按该线性表中元素的顺序构造出一棵二叉排序树;
(2)若每个元素的查找概率均等,查找此二叉排序树中任意一个结点的平均查找长度ASL是多少?
(3)若对线性表的元素按字典顺序从小到大排列以后,再用折半查找方法,则查找其中任意一个元素的平均查找长度ASL是多少?
(4)画出相应的平衡二叉树。
A.K99 B.k50 C.K49 D.k1
(6)为了实现分块查找,线性表必须采用--结构。
A.顺序存储 B.链式存储
C.索引存储 D.散列存储
(7)只能在顺序存储结构上才能实现的查找方法是 法。
A.顺序查找 B.树型查找
(11)索引文件包括--和--两个部分。
(12)索引表的特点是--,并且--。
(13)在索引文件中查找一个记录的过程是先查--,然后--。
(14)具有144项的表分成--块最好,若每块的最佳长度为8,则平均查找长度为--
(15)在3阶B-树上,每个分支结点包含的子树的数目最多为--,最少为--。
A.折半查找 B.树型查找
C.分块查找 D.散列查找
(10)若在n个记录中查找其中任意一个记录至少要比较2次,则所采用的查找方法可能是
A.分块查找 B'折半查找 C.树型查找 D.散列查找
(11)折半查找过程可以利用一棵称之为判定树的二叉树来描述。在长度为12的序列中进行折半查找对应的判定树的根结点的右孩子的值(某元素在序列中的位置)是--。
(4)只有在顺序存储结构上才能采用顺序查找方法。 ( )
(7)只要按值有序排列的线性表采用顺序存储结构就可以采用折半查找方法。 ( )
(8)建立稠密索引的优点是节省存储空间。 ( )
(9)分块查找的效率与文件中的记录被分成多少块有关。 ( )
9.6 折半查找过程可以利用一棵判定树来描述。请画出n'13时的判定树。
9.7 何谓散列冲突?何谓冲突处理?简要说明冲突处理的过程。
9.8 已知散列函数为H(k)二k%7,并采用线性探测再散列方法处理冲突,所建立的散列表如下所示,请依次将关键字17,27填人表中。
9.9 在初始为空的散列表中依次插入以下关键字序列:Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sept,Oct,Nov,Dec。散列函数为H(k):i%p,其中,i为关键字的第一个字母在英文字母表中的序号。请分别画出按以下两种情况构成的散列表:
(15)在散列文件中进行查找不涉及关键字的比较。 ( )
(16)散列冲突是指同一个关键字对应了多个不同的散列地址。 ( )
(17)散列表的负载因子等于存人散列表中的关键字的个数。 ( )
(18)在散列表的查找过程中,关键字的比较次数与表中关键字的数目直接相关。 ( )
B.每个结点最多具有m棵子树
C.分支结点中包含的关键字的个数
D.m阶B-树的深度
(18)下面关于B-树和B+树的叙述中,不正确的是--。
A.B-树和B+树都是平衡的多分树
B.B-树和B+树都可以用于文件的索引结构
D.B-树和B+树都能有效地支持随机检索
(19)下面的命题中,不成立的是 。
A.m阶B-树中的每一个分支结点的子树的数量都小于或等于m。
B.m阶B-树中的每一个分支结点的子树的数量都大于或等于m/2上取整
C.m阶B-树中的任何一个结点的子树的深度都相等。
D.m阶B-树中有k个子树的分支结点包含k-1个关键字。
A.10,15,12,18,19 B.10,15,12,13,14
C.10,15,16,1查找方法查找某个元素,依次被比较过的元素在该序列中的位置不可能是--。
A.10,5,7,8,9 B.10,5,2,1
C.10,5,6,7,8 D.10,5,7,6
(15)将数据元素2,4,6,8,10,12,14,16,18,20依次存放于一个一维数组中,然后采用折半查找方法查找元素12,被比较过的数组元素的下标依次为--。
A.10,16,12 B.10,12,16 C.4,7,5 D.4,5,7
(16)一棵B+树上通常有两个头指针(即查找的人口指针),其中一个指向--,另一个指向--。
(17)散列函数建立了--之间的对应关系。
(18)设计一个散列表通常应包括三个内容,分别是--、--和--。
(19)一个好的散列函数是指--。处理冲突的方法通常有--、--和--一O
(20)评价散列函数质量好坏的标准是--。
A.函数是否简单 B.计算是否快
C.是否是解析式 D.函数的取值是否均匀
(21)在一个初始状态为空的散列表中依次插入关键字序列(MON,TUE,WED,THU,FRI, SAT,SUN),散列函数为H(key):i%7,其中,i为关键字key的第一个字母在英文字母表中的序号,地址值域为[0:6],采用线性再散列法处理冲突。
(20)一个待散列存储的线性表为K二(18,25,63,50,42,32,9),散列函数为H(k):k%9,则与元素18发生冲突的元素有--个。
9.4 试叙述索引顺序文件与顺序文件相比较的优缺点,指出一种适用于索引顺序文件的外存设备。
9.5 已知一个长度为12的线性表(Dec,Feb,Nov,Oct,Jul,Sept,Aug,Apr,May,Jun,Jan,Mar)。
(19)在利用线性探测法处理冲突的散列表中,散列函数值相同的关键字总是存放在一片地址连续的存储单元中。
(20)在采用链地址法处理冲突的散列表中,散列函数值相同的关键字是链接在同一个链表中的。 ( )
9.2单项选择题。
(1)衡量查找算法性能好坏的主要标准是 。
(16)索引文件中的索引表具有的特点是----。
A.索引项按关键字值有序,并且由用户提供
B.索引项按关键字值有序,并且由系统提供
C.索引项按关键字值无序,并且由用户提供
D.索引项按关键宇值无序,并且由系统提供
(17)m阶B-树中的m是指--。
A.每个结点至少具有m棵子树
(3)文件的关键字是--。
(4)文件最基本操作是 和 。
(5)对线性表采用折半查找方法,该线性表必须采用--存储结构,并且--。
(6)在按值有序的线性表(5,8,11,12,15,20,32,41,57)中采用折半查找法查找20需要进行--次元素间的比较。
(7)具有n个结点的判定树的深度h = -- 。
(8)若每个记录的查找概率相等,则在具有n个记录的顺序文件中采用顺序查找法的平均查 找长度ASL=--。
(9)在具有n个记录的排序连续顺序文件中采用折半查找法的平均查找长度ASL=?
(10)索引文件的索引表中的一个索引项是--之间的对照关系。
9.12 请写出一个从散列文件中删除一个记录的算法。设所用的散列函数为H(k),处理冲突的方法为线性再散列法。
9.13 请写出一个从散列文件中删除一个记录的算法。设所用的散列函数为H(k),处理冲突的方法为链地址法。
9.14 已知一长度为n的线性表A和待散列地址空间为[0,m-1),其中m≥n。若采用除留余数法构造散列函数与步长为根号下N下取整的线性探测再散列法处理冲突,请分别写出建立该散列表和在该散列表上进行查找的算法。
A.7 B.8 C.9 D.10
(12)若在序列中采用折半查找方法进行查找,用来描述该查找过程的判定树的形状与--有关。
A.序列中元素的值 B.序列中元素的排列次序
C.序列中元素的类型 D.序列中元素的个数
(13)在某序列中采用折半查找方法查找某个元素,依次被比较过的元素在该序列中的位置只能是--。
第八章 查找
习 题
9.1 判断题(在你认为正确的题后的括号中打√,否则打X)。
(1)用来惟一区分文件中不同记录的属性或属性组称为主关键字。 ( )
(2)查找成功与否的关键在于是否按主关键字查找。 ( )
(3)顺序文件必须用一片地址连续的存储空间来存放。 ( )
(22)在具有n个元素的序列中进行查找,平均查找长度为O(n)的方法是--。
A.顺序查找方法 B.散列查找方法
C.分块查找方法 D.树型查找方法
9.3 填空题。
(1)文件的逻辑结构是指--,文件的物理结构是指--。
(2)文件在物理结构中通常有--、--和--三种组织方式。
(1)散列地址空间为[0,12],p=13,用线性再散列法处理冲突;
(2)散列地址空间为[0,6],p=7,用链地址法处理冲突。
9.10 在散列函数与散列地址范围都分别相同的前提下,采用链地址法处理冲突比采用开放地址法处理冲突的时间效率要高,为什么?
9.11 已知有长度为M的散列表HT[0,M-1],散列函数为H(k),并且采用线性探测再散列方法处理冲突。请写出在该散列表中查找关键字值为key的元素存在与否的算法。若存在,则给出它在表中的位置,否则给出相应的信息。
相关文档
最新文档