数据结构 第九章 查找

合集下载

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

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

第九章查找一、选择题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,则应作()型调整以使其平衡。

数据结构第9章 查找

数据结构第9章 查找

静态查找表基本操作
• • • • create(&st,n) //构造含n个元素的查找表 destroy(&st) search(st,key)//返回等于关键字key的元素位置 Traverse(st,visit()) // 遍历查找表
静态查找表使用顺序结构的存储
typedef struct { ElemType *elem; //动态定义 int length; //元素个数 }SSTable; • 查找过程,数据不需移动
2).有序查找表
• 查找表内的数据有序 • 折半查找
查75
low 初始 0 第1次后 5 13 19 21 37 5 1 13 19 2 3 21 4 37 5

high 56 6 m 56 64 7 75 8 low 64 75 80 88 80 9 88 10 92 11 high 92
0 第2次后
按关键字查找
int search_Seq(SSTable st,keyType key){ st.elem[0].key=key;//设置哨兵
//从后往前找,终能找到,不用判断越界
for (i=st.length;st.elem[i].key!=key;--i); return i; //i==0 找不到,i>0找到 } //search_Seq 例:search_Seq.c
• 例:
I key 1 A 2 B 3 C 4 D 5 E 6 F 7 G 8 H 9 I 10 J 11 K
Wi
1
1
28 9 1
2
25 6 2
5
18 1
3
10 9
4
3
4
5 11

大学数据结构课件--第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

第9章 数据结构 查找

第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,在等概率情况下,二分查找成功时的平 均查找长度为:

查找-数据结构

查找-数据结构

平均查找长度:为确定记录在查找表中 的位置,需和给定值进行比较的关键字 个数的期望值称为查找算法在查找成功 时的平均查找长度,简称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个记录,该线性表的 索引存储结构如下图所示。

数据结构第九章:查找

数据结构第九章:查找

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章 查找

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

数据结构第9章  查找 4

8 75
9 80
10 88
11 92
high
2 13
3 19
4 21
5 37
6 56
7 64
8 75
9 80
10 88
11 92
若 k==r[mid] .key,查 找成功 若 k<r[mid]. key,则 high=mid1 若 k>r[mid]. key,则 low=mid+ 1
low 1 2 5 13
low mid high 6 7 8 9 56 64 75 80 low high 7 mid 8 9 64 75 80
10 88
11 92
1 5
2 13
3 19
4 21
5 37
6 56
10 88
11 92
high low
找21
1 5 low
1 5
2 13
3 19
4 21
5 37
6 56
mid
7 64
动态查找表
二叉排序树定义(Binary Sorting Tree)
它或者是一棵空树,或者是一棵具有如下特征的非空二叉树: 若 它 的 左 子 树 非 空 , 则 左 子 树 上 所 有 结 点 的 关 键 字 均 小于根结点的关键字; 若 它 的 右 子 树 非 空 , 则 右 子 树 上 所 有 结 点 的 关 键 字 均 大于等于根结点的关键字;
2 有序表查找(折半查找)
查找过程:每次将待查记录所在区间缩小一半 适用条件:采用顺序存储结构的有序表 算法实现
设表长为n,low、high和mid分别指向待查元素所在 区间的上界、下界和中点, k为给定值 初始时,令low=1,high=n,mid=(low+high)/2 让k与mid指向的记录比较

数据结构 第九章 查找-哈希表

数据结构 第九章 查找-哈希表

冲突是很难避免的, 冲突是很难避免的,其不可避免性具有它一 定的内因。 定的内因。因为关键字的值域往往比哈希表的个 数大的多,所以哈希函数是一种压缩映射, 数大的多,所以哈希函数是一种压缩映射,碰撞 是难免的。 是难免的。 例如,存储100个学生记录,尽管安排 个学生记录, 例如,存储 个学生记录 尽管安排120 个地址空间,要找到一个哈希函数把100个任意 个地址空间,要找到一个哈希函数把100个任意 的学生名映射成[0…119]内的不同整数,实际上 内的不同整数, 的学生名映射成 内的不同整数 是不可能的。 是不可能的。 问题在于一旦发生了冲突应如何处理? 问题在于一旦发生了冲突应如何处理?
解决冲突的主要方法 :
(1)开放地址法 (1)开放地址法 为了便于发现冲突和溢出, 为了便于发现冲突和溢出,首先要对哈希表 HT[0…m-1]进行初始化,置表中每个位置为 进行初始化, 进行初始化 置表中每个位置为NULL。就 。 关键字而言, 关键字而言,它表示不属于关键字值域的一种特定的特 殊符号。 殊符号。 假定记录Ri和 的关键字分别为 的关键字分别为Ki和 , 假定记录 和Rj的关键字分别为 和Kj,而有 H[Ki]=H[Kj]=t时,则说发生了冲突。如果 已装入 时 则说发生了冲突。如果Ri已装入 HT[t]中,那么 就不能再装入 那么Rj就不能再装入 中 那么 就不能再装入HT[t]中,但只要 中还 中 但只要HT中还 有空位,总可以把Ri存入 存入HT[t]的“下一个”空位上。 有空位,总可以把 存入 的 下一个”空位上。 寻找“下一个”空位的过程称为探测 探测。 寻找“下一个”空位的过程称为探测。下面介绍两种探 测方法。 测方法。
哈希函数的构造方法回顾
(1)直接定址法 (1)直接定址法 (2)平方取中法 (2)平方取中法 (3)数字分析法 (3)数字分析法 (4)除留余数法 (4)除留余数法
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

●数据结构第九章查找
●基本查找:
⏹顺序查找成功和失败的查找长度
⏹折半查找
⏹分块查找(sqrt(数据)才是最大效率)
●二叉排序树查找、插入、删除操作,以及查找长度
●平衡二叉树的构建过程以及查找长度
⏹平衡二叉树的一定高度结点最少为Fibonacci(h + 2) – 1,而此时所有非叶节点的平
衡因子绝对值均为1
●B-树的基本概念、性质和定义,(非根非叶结点最多m分支,m – 1个关键字,最少m
/ 2 向上取整个分支),B+树的定义
⏹B-树插入关键字只能插在叶子结点的位置,当该结点关键字数目达到m时开始分
裂分裂自下而上,写入时需要遍历h个结点,每次分裂写出2个结点,共n次,最
后写出分裂的根节点,则共需要读入n次,写出2n + 17次
⏹如果被删关键字不在叶结点,则需要用它右边子树最小关键字(在叶结点内)或它子
树最大关键字(在叶结点内)填补上来,再到叶结点中删除填补上去的关键字,这这
个过程需要读盘h次。

假设它们一直保存在内存中,最坏情况下从叶结点到根结点
的下一层结点共h-1层要做结点合并,每次合井需读入1个兄弟结点,写出合并
后的结点,共3h-2次读/写盘,另外共删除了h个结点。

⏹N个结点的m树的失败结点为n + 1
⏹树的最大高度为log m/2[(n + 1) / 2] (取下整) + 1
●散列表的建立以及解决冲突的方式
⏹装载因子a = n / m,n为要装载元素个数,m为散列表的大小
⏹Hash构造方法
⏹直接定址法Hash(key) = a * key + b
⏹数字分析法
⏹平方取中法
⏹除留余数法Hash(key) = key mod p;p 为不大于m的最大素数
⏹处理冲突的方式:
⏹开放定址法,
◆平方探查法
◆线性探查法
◆查找范围为序列号0~m-1,查找失败时要算上空格
⏹链地址法
●查找失败时不计算查找空间为NULL的部分
1、M阶B-树是一棵()
A、m叉查找树
B、m叉平衡查找树
C、m – 1叉平衡查找树
D、m + 1叉平衡
查找树
2、将关键字序列{7、8、30、11、18、9、14}散列存储到散列表中,散列表的存储空间是一
个下标从0开始的一维数组,散列函数为H(key)=(key*3) Mod 7,处理冲突采用线性探测再散列法,要求装填因子为0.7。

1)请画出所构造的散列表。

2)分别计算等概率下,查找成功和查找不成功时的平均查找长度
3、设包含4个数据元素的集合S= {"do", "for","repeat",”while"},各元素的查找概率依次
为:p1=0.35,p2=0.15,p3=0.15, p4=0.35。

将S保存在一个长度为4的顺序表中,采用折半查找法,查找成功时的平均查找长度为2.2。

请回答:
1)若采用顺序存储结构保存S,且要求平均查找长度更短,则元素应如何排列?应使用
何种查找方法?查找成功时的平均查找长度是多少?
2)若采用链式存储结构保存S,且要求平均查找长度更短,则元素应如何排列?应使用
何种查找方法?查找成功时的平均查找长度是多少?
4、B-树的结构为
typedef struct bTreeNode
{
int n;
int key[maxSize];
bTreeNode* ptr[maxSize];
}bTreeNode;
5、散列表的平均查找长度与表长度无关,与处理冲突方法和装载因子有关。

6、已知有序顺序表(13,18,24,35,47,50,62,83,90,115,134),当用折半查找法查找值为18的关键字时,查我成功的数据比较次数为( )。

A.1
B.2
C.3
D. 4
7、若将关键字1, 2,3,4,5, 6, 7依次插入到初始为空的平衡二叉树T中,则中平衡因子为0的分支结点的个数是。

相关文档
最新文档