第九章_查找

合集下载

数据结构教程 第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章 查找

大学数据结构课件--第9章 查找
——这种既查找又插入的过程称为动态查找。
二叉排序树既有类似于折半查找的特性,又采用了链表存储,它是动态 查找表的一种适宜表示。
注:若数据元素的输入顺序不同,则得到的二叉排序树形态 也不同!
17
二、二叉树的插入和删除操作
1、二叉排序树的插入和查找操作
例:输入待查找的关键字序列=(45,24,53,12,90)
折半查找举例:
已知如下11个元素的有序表:
(05 13 19 21 37 56 64 75 80 88 92), 请查找关键字为21和85的数据元素。
Low指向待查元 素所在区间的下 界
mid指向待查元素所在 high指向待查元素所
区间的中间位置
在区间的上界
8
9.1.2 折半查找(又称二分查找或对分查找)
balance。这样,可以得到AVL树的其它性质:
❖ 任一结点的平衡因子只能取:-1、0 或 1;如果树中任 意一个结点的平衡因子的绝对值大于1,则这棵二叉树 就失去平衡,不再是AVL树;
24
三、平衡二叉树
例:判断下列二叉树是否AVL树?
-1
1
-1
0
0
1
0
(a) 平衡树
2
-1
0
0
1
0
(b) 不是平衡树
(1)p为叶子结点,只需修改p双亲f的指针f->lchild=NULL或 f->rchild=NULL
(2)P只有左子树或右子树 ❖ P只有左子树,用P的左孩子代替P ❖ P只有右子树,用P的右孩子代替P
(3)P左、右子树均非空 (P左子树的根C的右子树分支找到S,S的右子树为空) ❖ P的左子树成为双亲f的左子树,P的右子树成为S的右子树 ❖ S的左子树成为S的双亲Q的右子树,用S取代p; 若C无右子树,用C取代p

查找-数据结构

查找-数据结构

平均查找长度:为确定记录在查找表中 的位置,需和给定值进行比较的关键字 个数的期望值称为查找算法在查找成功 时的平均查找长度,简称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章.查找.4.哈希表

数据结构.第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 动态查找表
二叉排序树中序遍历 中序遍历二叉排序树,可得到一个关键字的有序序列,如 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
中国科大《数据结构》

数据结构 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
动态查找表:若在查找过程中可以将查找 表中不存在的 数据元素插入 ,或者从查找表中 删除某个数据元素 ,则称这类查找表为动态查 找表。动态查找表在查找过程中查找表可能会 发生变化。对动态查找表进行的查找操作称为 动态查找。 关键字:是数据元素中的某个数据项。唯 一能标识数据元素(或记录)的关键字,即每 个元素的关键字值互不相同,我们称这种关键 字为主关键字;若查找表中某些元素的关键字 值相同,称这种关键字为次关键字。例如,银 行帐户中的帐号是主关键字,而姓名是次关键 字。

数据库系统l试题库及答案 第9章 查找

数据库系统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相等的元素,在查找不成功的情况下,最多需要检索()次。

数据结构_第9章_查找2-二叉树和平衡二叉树

数据结构_第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 ;与折半查找相同。

数据结构-第九章 查找

数据结构-第九章 查找

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

若查找每个记录的概率均等,则在具有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。

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

// 顺序表的查找算法 int Search_Seq(SSTable ST, KeyType key) { // 算法9.1 // 在顺序表ST中顺序查找其关键字等于key的数据元素。 // 若找到,则函数值为该元素在表中的位置,否则为0。 int i=0; ST.elem[0].key=key; // "哨兵" for (i=ST.length; ST.elem[i].key!=key; --i); // 从后往前找 return i; // 找不到时,i为0 } // Search_Seq
二叉排序树的查找算法
2、二叉排序树的插入和删除
假设待插入的数据元素为x,则二叉排序树的插 入算法可以描述为:
若二叉排序树为空,则生成一个关键字为x的新结点,并令 其为二叉排序树的根结点; 否则,将待插入的关键字x与根结点的关键字进行比较,若 二者相等,则说明树中已有关键字x,无须插入; 若x小于根结点的关键字,则将x插入到该树的左子树中, 否则将x插入到该树的右子树中去。 将x插入子树的方法与在整个树中的插入方法是相同的,如 此进行下去,直到x作为一个新的叶结点的关键字插入到二叉 排序树中,或者直到发现树中已有此关键字为止。
b 1 s 1 n / s s n s2 1 1 2 2 2 2s
当 s n 时,ASLbs取最小值
n +1
若以二分检索来确定块,则分块检索查找成功时的平均 查找长度为: ASL’bs=Lb+Lwlog2(b+1)-1+(s+1)/2 log2(n/s+1)+s/2
……
} ElemType ;, TElemType ;
9.1.1 顺序表的查找

顺序查找的过程: 从表的一端开始,顺序(逐个)扫描线 性表,依次将扫描到的结点关键字和给定 值Key相比较,若当前扫描到的结点关键字 与Key相等,则查找成功;若扫描结束后, 仍未找到关键字等于Key的结点,则查找失 败。
Destroy(&ST); 初始条件:静态查找表ST存在。 操作结果:销毁表ST。 Search(ST, key); 初始条件:静态查找表ST存在,key为和查找 表中元素的关键字类型相同的给定值。 操作结果:若 ST 中存在其关键字等于key的数 据元素, 则函数值为该元素的值或在表中的位置,否则为“空”。 Traverse(ST, Visit()); 初始条件:静态查找表ST存在,Visit是对元素操作的应 用函数。 操作结果:按某种次序对ST的每个元素调用函数Visit()一 次且仅一次,一旦Visit()失败,则操作失败。 } ADT StaticSearchTable9.2 动态查找表
动态查找表的特点 是,表结构本身是 在查找过程中动态 生成的,即对于给 定值key,若表中 存在关键字等于 key的记录,则查 找成功返回,否则 插入关键字等于 key的记录。 抽象数据类型动态 查找表的定义:

9.2.1 二叉排序树和平衡二叉树
1、二叉排序树及其查找过程 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树 (Binary Search Tree)。其定义为:二叉排序树或者是空树 ,或者是满足如下性质的二叉树: ①若它的左子树非空,则左子树上所有结点的值均小于根结 点的值; ②若它的右子树非空,则右子树上所有结点的值均大于根结 点的值; ③左、右子树本身又各是一棵二叉排序树。 上述性质简称二叉排序树性质(BST性质),故二叉排序 树实际上是满足BST性质的二叉树 按中序遍历该树所得到的中序序列是一个递增有序序列
1 在等概率查找的情况下,Pi n
顺序表查找成功的平均查找长度为:
1 n n 1 ASLss (n i 1 ) n i 1 2

为提高查找效率, 对记录按照查找概率进行排序号, 如病历 可以附设访问域频度,记录访问频度, 进而进行排需, 以方便以后的查找 算法的平均查找长度=查找成功和不成功的长度之 和: 1 n 1 3
ASLss


(n i 1) 2 (n 1) 4 (n 1) 2n
i 1
9.1.2 有序查找表
上述顺序查找表的查找算法简单,
但平均查找长度较大,特别不适用于 表长较大的查找表。
若以有序表表示静态查找表,则
查找过程可以基于“折半”进行。
例如: key = 64 的查找过程如下
二叉排序树的插入算法
对于输入实例(30,20,40,10,25,45), 创建二 叉排序树的过程如下:
30
20
30
20
30
40
(a)空树
30
(b)插入30 (c)插入20
30
(d)插入40
30
20
10
40
10
20
25
40
10
20
二叉排序树和平衡二叉树 B_树和B+树

哈希表
什么是哈希表 哈希函数的构造方法 处理冲突的方法 哈希表的查找及其分析
基本数据结构
线性表 栈和队列 串 数组和广义表 树和二叉树 图

何谓查找表 ?
查找表是由同一类型的数据元
素(或记录)构成的集合。
由于“集合”中的数据元素之间存在 着松散的关系,因此查找表是一种应用 灵便的结构。
二叉排序树的查找过程
对于一棵给定的二叉排序树,树中的查找运算很 容易实现,其算法可描述如下:
(1)当二叉树为空树时,检索失败;
(2)如果二叉排序树根结点的关键字等于待检索的 关键字,则检索成功; (3)如果二叉排序树根结点的关键字小于待检索的 关键字,则用相同的方法继续在根结点的右子树中检 索; (4)如果二叉排序树根结点的关键字大于待检索的 关键字,则用相同的方法继续在根结点的左子树中检 索。
一般情况下,表长为 n 的折半查找 的判定树的深度和含有 n 个结点的完全 二叉树的深度相同。 假设 n=2h-1 并且查找概率相等
1 n 1 h n 1 j 1 则 ASLbs Ci j 2 log2 (n 1) 1 n i 1 n j 1 n
从有序表构造出的二叉搜索树(判定树)
搜索成功的情形

搜索不成功的情形
若设 n = 2h-1,则描述对分搜索的二叉搜索树是高 度为 h-1 的满二叉树。2h = n+1, h = log2(n+1)。 第0层结点有1个,搜索第0层结点要比较1次;第1 层结点有2个,搜索第1层结点要比较2次;…,
第九章
郭延文
查找
内容回顾-第七章 图
图的定义和术语 图的存储结构 (数组表示法、邻接表、十字 链表、邻接多重表) 图的遍历 (深度优先搜索、广度优先搜索) 图的连通性问题 有向无环图及其应用 最短路径

最短路径问题:如果从图中某一顶点(称为源点)到 达另一顶点(称为终点)的路径可能不止一条,如何 找到一条路径使得沿此路径上各边上的权值总和达 到最小。
图9.2 分块有序表的索引存储表示 2、分块查找的基本思想 分块查找的基本思想是: (1)首先查找索引表 索引表是有序表,可采用二分查找或顺序查找, 以确定待查的结点在哪一块。 (2)然后在已确定的块中进行顺序查找
由于块内无序,只能用顺序查找。 分块检索方法通过将查找缩小在某个块中从而提高了检 索的效率,其查找的效率由两部分组成,一是为确定某一块 对索引表的平均查找长度Lb,二是块内查找所需的平均查找 长度Lw 。 若以顺序检索来确定块,则分块查找成功时的平均查找 长度为: ASLbs=Lb+Lw=
分析顺序查找的时间性能。
定义: 查找算法成功时的平均查找长度 (Average Search Length)
ASL PiCi
i 1
n
其中: n 为表长,Pi 为查找表中第i个记录的概率,

P 1
i 1 i
n
Ci为找到该记录时,曾和给定值
比较过的关键字的个数
对顺序表而言,Ci = n-i+1 ASL = nP1 +(n-1)P2 + +2Pn-1+Pn
9.1 静态查找表
ADT StaticSearchTable { 数据对象D: D是具有相同特性的数据元素的集, 每个数据元素含有类型相同的关键字,可唯一标 识数据元素。 数据关系R:数据元素同属一个集合。 基本操作P:
Create(&ST,n); 操作结果:构造一个含 n 个数据元素 的静态查找表ST。
ST.elem
ST.length
05 13 19 21 37 56 64 75 80 88 92
0 1 2
low
3 4
5 6
7 8
9 10 11
high
low high mid mid mid
low 指示查找区间的下界; high 指示查找区间的上界; mid = (low+high)/2。
int Search_Bin ( SSTable ST, KeyType key ) { // 算法9.2 // 在有序表ST中折半查找其关键字等于key的数据元素。 // 若找到,则函数值为该元素在表中的位置,否则为0。 int low, high, mid; 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; // 顺序表中不存在待查元素 } // Search_Bin
相关文档
最新文档