《数据结构》第七章查找.
数据结构 查找
用二次探测再散列技术处理冲突
再哈希法
当发生冲突时,用另一个哈希函数计算出 另—个哈希地址,如果还发生冲突,再使 用另一个哈希函数,直至不发生冲突为止。 这种方法要求预先设置一个哈希函数的序 列。
链地址法
链地址法解决冲突的做法是将所有关键字为同义 词的结点链接在同一个单链表中。若哈希函数的 值域为0~m-1,则可将散列表定义为一个由m 个头指针组成的指针数组HT[m],凡是散列地址 为i的结点,均插入到以HT[i]为头指针的单链表 中。
7.4.4 哈希表查找的性能分析
由于冲突的存在,产生冲突后的查找仍然是给定值与 关键码进行比较的过程。
在查找过程中,关键码的比较次数取决于产生冲突的 概率。而影响冲突产生的因素有: (1)散列函数是否均匀
(2)处理冲突的方法
(3)散列表的装载因子 α =表中填入的记录数/表的长度
几种不同处理冲突方法的平均查找长度
查找算法的性能
平均查找长度:查找算法进行的关键码的比较 次数的数学期望值。计算公式为:
ASL = pi ci i =1
其中:n:问题规模,查找集合中的记录个数; pi:查找第i个记录的概率; ci:查找第i个记录所需的关键码的比较次数。
n
结论:ci取决于算法;pi与算法无关,取决于具体应用。如果 pi是已知的,则平均查找长度只是问题规模的函数。
使用条件: 线性表中的记录必须按关键码有序; 必须采用顺序存储。 基本思想: 在有序表中,取中间记录作为比较对象,若给定值与 中间记录的关键码相等,则查找成功;若给定值小于 中间记录的关键码,则在中间记录的左半区继续查找; 若给定值大于中间记录的关键码,则在中间记录的右 半区继续查找。不断重复上述过程,直到查找成功, 或所查找的区域无记录,查找失败。
数据结构7 查找
折半法算法分析
假设:查找关键字为0-6的数据
查找的过程形成二叉判定树
3
5 2 4 6
ASL=1/7(1+2×2+4×3)
1
=2.43
0
假设:有序表长度为n,且n≤2h-1 二叉判定树 若n=2h-1 则:查找过程为一棵深度为h的满二叉树,
2014-7-4 第7章 查找 18
则满二叉树的第 i 层有2i-1个结点。
分块[17,8,21,19],[31,33,25,22], [43,37,35,40], [61,73,78,55] 索引表:21 33 43 78
数据表
17 8 21 19 31 33 25 22 43 37 35 40 61 73 78 55 … … … … … … … … … … … … … … … …
(2)key与R[mid].key比较
若key=R[mid].key则查找成功; 若key<R[mid].key ,则high=mid-1,转(3)。 若key>R[mid].key ,则low=mid+1,转(3)。 (3)若low≤high, 则重复(1) 否则:查找不成功,结束。
2014-7-4
关键字 地址 21 33 43 78
2014-7-4
第7章 查找
22
表结构说明:
typedef struct {KeyType key; int link; } indextype; indextype Lr[m] typedef struct {char name[10]; KeyType key; } DataType; DataType r[Max];
ASL=∑[(1/n)×2i-1 ×i]
《数据结构(C语言版 第2版)》(严蔚敏 著)第七章练习题答案
《数据结构(C语言版第2版)》(严蔚敏著)第七章练习题答案第7章查找1.选择题(1)对n个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为()。
A.(n-1)/2B.n/2C.(n+1)/2D.n答案:C解释:总查找次数N=1+2+3+…+n=n(n+1)/2,则平均查找长度为N/n=(n+1)/2。
(2)适用于折半查找的表的存储方式及元素排列要求为()。
A.链接方式存储,元素无序B.链接方式存储,元素有序C.顺序方式存储,元素无序D.顺序方式存储,元素有序答案:D解释:折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
(3)如果要求一个线性表既能较快的查找,又能适应动态变化的要求,最好采用()查找法。
A.顺序查找B.折半查找C.分块查找D.哈希查找答案:C解释:分块查找的优点是:在表中插入和删除数据元素时,只要找到该元素对应的块,就可以在该块内进行插入和删除运算。
由于块内是无序的,故插入和删除比较容易,无需进行大量移动。
如果线性表既要快速查找又经常动态变化,则可采用分块查找。
(4)折半查找有序表(4,6,10,12,20,30,50,70,88,100)。
若查找表中元素58,则它将依次与表中()比较大小,查找结果是失败。
A.20,70,30,50B.30,88,70,50C.20,50D.30,88,50答案:A解释:表中共10个元素,第一次取⎣(1+10)/2⎦=5,与第五个元素20比较,58大于20,再取⎣(6+10)/2⎦=8,与第八个元素70比较,依次类推再与30、50比较,最终查找失败。
(5)对22个记录的有序表作折半查找,当查找失败时,至少需要比较()次关键字。
A.3B.4C.5D.6答案:B解释:22个记录的有序表,其折半查找的判定树深度为⎣log222⎦+1=5,且该判定树不是满二叉树,即查找失败时至多比较5次,至少比较4次。
(6)折半搜索与二叉排序树的时间性能()。
王道数据结构 第七章 查找思维导图-高清脑图模板
每次调整的对象都是“最小不平衡子树”
插入操作
在插入操作,只要将最小不平衡子树调整平衡,则其他祖先结点都会恢复平衡
在A的左孩子的左子树中插入导致不平衡
由于在结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子由1增
至2,导致以A为根的子树失去平衡,需要一次向右的旋转操作。
LL
将A的左孩子B向右上旋转代替A成为根节点 将A结点向右下旋转成为B的右子树的根结点
RR平衡旋转(左单旋转)
而B的原左子树则作为A结点的右子树
在A的左孩子的右子树中插入导致不平衡
由于在结点A的左孩子(L)的右子树(R)上插入了新结点,A的平衡因子由1增
LR
至2,导致以A为根的子树失去平衡,需要两次旋转操作,先左旋转再右旋转。
将A的左孩子B的右子树的根结点C向左上旋转提升至B结点的位置
本质:永远保证 子树0<关键字1<子树1<关键字2<子树2<...
当左兄弟很宽裕时,用当前结点的前驱、前驱的前驱来填补空缺 当右兄弟很宽裕时,用当前结点的后继、后继的后继来填补空缺
兄弟够借。若被删除关键字所在结点删除前的关键字个数低于下限,且与此结点 右(或左)兄弟结点的关键字还很宽裕,则需要调整该结点、右(或左)兄弟结 点及其双亲结点及其双亲结点(父子换位法)
LL平衡旋转(右单旋转)
而B的原右子树则作为A结点的左子树
在A的右孩子的右子树中插入导致不平衡
由于在结点A的右孩子(R)的右子树(R)上插入了新结点,A的平衡因子由-1
减至-2,导致以A为根的子树失去平衡,需要一次向左的旋转操作。
RR
将A的右孩子B向左上旋转代替A成为根节点 将A结点向左下旋转成为B的左子树的根结点
数据结构(C++版)课后答案 (王红梅)第7章 查找技术
第7 章查找技术课后习题讲解1. 填空题⑴顺序查找技术适合于存储结构为()的线性表,而折半查找技术适用于存储结构为()的线性表,并且表中的元素必须是()。
【解答】顺序存储和链接存储,顺序存储,按关键码有序⑵设有一个已按各元素值排好序的线性表,长度为125,用折半查找与给定值相等的元素,若查找成功,则至少需要比较()次,至多需比较()次。
【解答】1,7【分析】在折半查找判定树中,查找成功的情况下,和根结点的比较次数最少,为1次,最多不超过判定树的深度。
⑶对于数列{25,30,8,5,1,27,24,10,20,21,9,28,7,13,15},假定每个结点的查找概率相同,若用顺序存储结构组织该数列,则查找一个数的平均比较次数为()。
若按二叉排序树组织该数列,则查找一个数的平均比较次数为()。
【解答】8,59/15【分析】根据数列将二叉排序树画出,将二叉排序树中查找每个结点的比较次数之和除以数列中的元素个数,即为二叉排序树的平均查找长度。
⑷长度为20的有序表采用折半查找,共有()个元素的查找长度为3。
【解答】4【分析】在折半查找判定树中,第3层共有4个结点。
⑸假定一个数列{25,43,62,31,48,56},采用的散列函数为H(k)=k mod 7,则元素48的同义词是()。
【解答】62【分析】H(48)= H(62)=6⑹在散列技术中,处理冲突的两种主要方法是()和()。
【解答】开放定址法,拉链法⑺在各种查找方法中,平均查找长度与结点个数无关的查找方法是()。
【解答】散列查找【分析】散列表的平均查找长度是装填因子的函数,而不是记录个数n的函数。
⑻与其他方法相比,散列查找法的特点是()。
【解答】通过关键码计算记录的存储地址,并进行一定的比较2. 选择题⑴静态查找与动态查找的根本区别在于()。
A 它们的逻辑结构不一样B 施加在其上的操作不同C 所包含的数据元素的类型不一样D 存储实现不一样【解答】B【分析】静态查找不涉及插入和删除操作,而动态查找涉及插入和删除操作。
数据结构第七章参考答案
习题71.填空题(1)由10000个结点构成的二叉排序树,在等概率查找的条件下,查找成功时的平均查找长度的最大值可能达到(___________)。
答案:5000.5(2)长度为11的有序序列:1,12,13,24,35,36,47,58,59,69,71进行等概率查找,如果采用顺序查找,则平均查找长度为(___________),如果采用二分查找,则平均查找长度为(___________),如果采用哈希查找,哈希表长为15,哈希函数为H(key)=key%13,采用线性探测解决地址冲突,即d i=(H(key)+i)%15,则平均查找长度为(保留1位小数)(___________)。
答案:6,3,1.6(3)在折半查找中,查找终止的条件为(___________)。
答案:找到匹配元素或者low>high?(4)某索引顺序表共有元素275个,平均分成5块。
若先对索引表采用顺序查找,再对块元素进行顺序查找,则等概率情况下,分块查找成功的平均查找长度是(___________)。
答案:31(5)高度为8的平衡二叉树的结点数至少是(___________)。
答案: 54 计算公式:F(n)=F(n-1)+F(n-2)+1(6)对于这个序列{25,43,62,31,48,56},采用的散列函数为H(k)=k%7,则元素48的同义词是(___________)。
答案:62(7)在各种查找方法中,平均查找长度与结点个数无关的查找方法是(___________)。
答案:散列查找(8)一个按元素值排好的顺序表(长度大于2),分别用顺序查找和折半查找与给定值相等的元素,平均比较次数分别是s和b,在查找成功的情况下,s和b的关系是(___________);在查找不成功的情况下,s和b的关系是(___________)。
答案:(1)(2s-1)b=2s([log2(2s-1)]+1)-2[log2(2s-1)]+1+1(2)分两种情况考虑,见解答。
数据结构-查找
数据结构-查找写在前⾯:这些内容是以考研的⾓度去学习和理解的,很多考试中需要⽤到的内容在实际应⽤中可能⽤不上,⽐如其中的计算问题,但是如果掌握这些东西会帮你更好的理解这些内容。
这篇关于查找的博客也只是⽤来记录以便于后续复习的,所以很多地⽅只是浅谈,并没有代码的实现如果有缘发现这篇⽂章想要深⼊了解或者因为作者表达能⼒差⽽看不懂以及有错的地⽅,欢迎留⾔指出来,我会尽快去完善的,期待有缘⼈内容多和杂,如果有机会我进⼀步进⾏梳理,将其重新梳理⼀⽚⽂章(会更注重于代码)本来只是想简单写⼀下的,但是不⼩⼼就get不到重点了本来打算等逐步完善和优化后再发出来的,但那样继续往前总感觉有所顾及,所以就先给这⼏天查找的复习暂时告⼀段落吧。
导学概览总体(⼀)概念查找:在数据集合中查找特定元素的过程查找表(查找结构):同⼀类型数据元素构成的集合静态查找表:只涉及查找,不存在修改适⽤:顺序查找,折半查找,散列查找等动态查找表:动态插⼊和删除,对查找表进⾏修改适⽤:⼆叉排序树,散列查找等所有数据结构都可以看作是查找表,对于折半查找和顺序查找这些都属于查找算法关键字:数据元素中唯⼀标识该元素的某数据项的值主关键字:此关键字能唯⼀表⽰⼀个数据元素次关键字:此关键字⽤以识别若⼲记录(⼀对多)说明:在查找表中每个数据元素就相当于⼀条记录,包含有不同的数据项,例如拿学⽣为例,⼀个学⽣作为数据元素,那么学号,⾝⾼,姓名就是这个元素中的数据项,每个学⽣都有特定的学号,因此学号可以作为关键字。
(当然如果数据项包含⾝份证号,你⽤⾝份证号⾛位关键字也可以)0x01平均查找长度(重点注意:作为查找算法效率衡量的主要指标,那么查找算法的性能分析肯定是重点分析平均查找长度的,因此必须熟练掌握。
提⼀嘴,算法效率的度量前⾯学过时间和空间复杂度,但是算法效率的度量不是只取决于时间和空间复杂度,针对不同的算法还可能会有其他⼀些辅助度量,如查找算法中的平均查找长度。
数据结构:第七章 查找
索引表
22 48 86 1 7 13
查38
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 57 86 53
查找方法比较
ASL 表结构 存储结构
顺序查找 最大
折半查找 最小
关键字输入顺序:45,24,53,12,28,90
45
24
53
12
28
90
9.4 哈希查找
基本思想:在记录的存储地址和它的关键字之间建立一 个确定的对应关系(函数关系);这样,不经过比较, 直接通过计算就能得到所查元素。
一、定义
❖哈希函数——在记录的关键字与记录的存储地址之间 建立的一种对应关系叫哈希函数。
high low
1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
6
56
3
9
19
80
1
4
7
10
5 21 64 88
比较1次 比较2次 比较3次
2
13
5
8
37 75
11
92
比较4次
判定树(二叉排序树):描 述查找过程的二叉树
把当前查找区间的中间位 置上的结点作为根,左子表 和右子表中的结点分别作 为根的左子树和右子树
适用条件:采用顺序存储结构的有序表。 算法实现
❖设表长为n,low、high 和 mid分别指向待查元素所 在区间的上界、下界和中点,k为给定值
❖初始时,令low=1, high=n, mid=(low+high)/2 ❖让k与mid指向的记录比较
《数据结构(C语言)》第7章 查找
教学要求
❖ 建议学时:6学时 ❖ 总体要求
掌握顺序查找、折半查找的实现方法; 掌握动态查找表(二叉排序树、二叉平衡树)的构造
和查找方法; 掌握哈希表、哈希函数a structures
教学要求
❖ 相关知识点
顺序查找、折半查找的基本思想、算法实现和查找效 率分析
Data structures
静态查找表
❖ 顺序查找
❖1. 一般线性表的顺序查找
(2) 静态查找表的顺序存储结构
静态查找表采用顺序存储结构,其类型定义如下:
typedef struct
{ ElemType *elem; 建表时按实际长度分配*/
/*元素存储空间基址,
int TableLen;
/*表的长度*/
Data structures
静态查找表
❖ 分块查找
索引表的类型定义如下:
typedef struct{
Elemtype key;
/*块内最大关键字值*/
int stadr; 的位置*/
/*块中第一个记录
}indexItem;
typedef struct{
indexItem elem[n];
int length;
Data structures
静态查找表
❖ 折半查找
4.折半查找算法 算法7.2 折半查找算法
else if(L.elem[mid].key>key)high=mid-1; 前半部分继续查找*/
else low=mid+1; /*从后半部分继续查找*/
}
return -1; /*顺序表中不存在待查元素*/
(1) 基本思想 从线性表的一端开始,逐个检查关键字是否满足给定
数据结构》第七章查找
(最坏情况)
可编辑ppt
11
7.2 顺序查找
成功查找的平均查找长度为(n+1)/2。显然不成功 查找次数为n+1,其时间复杂度均为 O(n)。
顺序查找的优点是:算法简单且适用面广,它对表的 结构无任何要求。无论记录是否按关键字的大小有序,其 算法均可应用,而且上述讨论对线性链表也同样适用。
顺序查找的缺点是:查找效率低,当 n 较大时,不宜 采用顺序查找。
中
5 13 19 21 37 56 64 75 80 88 92
low>high 查找失败
123456
low high
mid 7 8 9 10 11
5 13 19 21 37 56 64 75 80 88 92
可编辑ppt
16
high low
7.3 二分法查找
从二分法查找的执行情况分析,每做一次比较,查找的 范围都缩小一半。因此二分法查找的平均查找长度为
【答案】
查找成功时,最少比较1次,最多比较5次。
2、已知如下11个数据元素的有序表(6,14,19, 21,36,57,63,76,81,89,93),请画出 查找键值为21和85的查找过程。
可编辑ppt
18
7.4 分块查找
可编辑ppt
10
01 64 5
23456 13 19 21 37 56
找64 7 8 9 10 11 64 75 80 88 92
监视哨
比较次数:
查找第n个元素: 1
查找第n-1个元素:2
……….
查找第1个元素: n
查找第i个元素: n+1-i
查找失败:
n+1
iiiii
数据结构(Java语言描述)第七章 查找
第七章 查找
目录
1 查找
2 静态查找表
第七章 查找
动态查找表 哈希表 小结
总体要求
•掌握顺序查找、折半查找的实现方法; •掌握动态查找表(包括:二叉排序树、二叉平衡树 、B-树)的构造和查找方法; •掌握哈希表、哈希函数冲突的基本概念和解决冲突 的方法。
7.1基本概念
1、数据项 数据项是具有独立含义的标识单位,是数据不可分 割的最小单位。 2、数据元素 数据元素数是据由项若(名干) 数据项构成的数据单位,是在某
}
性能分析:i 0 1 2 3 4
5 13 19 21 37
Ci 3 4 2 3 4
查找成功:
比较次数 = 路径上的结点数
比较次数 = 结点 4 的层数
比较次数
2
56 7 56 64 75 1 34
判定树
5
8 9 10 80 88 92 2 34
查找37 8
树的深度
0
3
6
9
≤=
log2n +1
1
4
}
【算法7-1】初始化顺序表 public SeqTable(T[] data,int n){
elem=new ArrayList<ElemType<T>>(); ElemType<T> e; for(int i=0;i<n;i++){
e=new ElemType<T>(data[i]); elem.add(i, e); } length=n; }
前者叫作最大查找长度(Maximun Search Length),即 MSL。后者叫作平均查找长度(Average Search Length) ,即ASL。
数据结构第7章查找
于等于根结点的值; (3)其左右子树本身又各是一棵二叉排序树
2021年7月21日
练习
下列图形中,哪个不是二叉排序树 ?
2021年7月21日
练习
中序遍历二叉排序 树后的结果有什么 规律?
45 12
3
37
24 3,12,24,37,45,53,61,78,90,100
• 重复上述操作,直至low>high时,查找失败
2021年7月21日
折半查找(递归算法)
int Search_Bin (SSTable ST, keyType key, int low, int high) { if(low>high) return 0; //查找不到时返回0 mid=(low+high)/2; if(key与ST.elem[mid].key) return mid; else if(key小于ST.elem[mid].key)
……..//递归 else……. //递归 }
2021年7月21日
折半查找的性能分析-判定树
1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
6 < => 3
1
4
7
1 2 9
10 内结点
-1 2 3-4 5 6-7 8 9-10 11 h
1-2 2-3
4-5 5-6
7-8 8-9 10-11 11-
外结点
查找成功时比较次数:为该结点在判定树上的层次数,不超过树 的深度 d = log2 n + 1
查找不成功的过程就是走了一条从根结点到外部结点的路径d或 d-1。
《数据结构实用教程(C语言版)》第7章查找.
返回到本节首页
返回到本节首页
2.折半查找的算法
(1)折半查找的算法如算法7.3所示。 算法7.3 int BinSearch(LineList r[], int n, KeyType k) { int low,high,mid; low=1; high=n; /*置区间初值 */ while(low<=high) /*查找区间 不为空时*/ { mid=(low+high)/2;
数据结构实用教程(C语言版)
中国水利水电出版社
第7章 查找
本章主要介绍以下内容: 静态查找方法,主要介绍顺序查找、折半查找和 分块查找 动态查找方法,主要介绍二叉排序树查找 哈希表查找
本章目录
1 2 3 4 5
7.1 基本概念
7.2 静态查找
7.3 二叉排序树查找
7.4 哈希表查找
7.5 小结
结束
7.1 基本概念
1.查找表 用于查找的数据元素集合称为查找表。查找表 由同一类型的数据元素构成。 2.静态查找表 在查找过程中查找表本身不发生变化,称为静 态查找表。对静态表的查找称为静态查找。 3.动态查找表 若在查找过程中可以将查找表中不存在的数据 元素插入,或者从查找表中删除某个数据元 素,则称这类查找表为动态查找表。对动态 查找表进行的查找称为动态查找。
返回到本节首页
7.2 静态查找
静态查找主要有顺序查找、折半查找、分块 查找三种。 7.2.1顺序查找
7.2.2 折半查找
7.2.3 分块查找
返回到总目录
7.2.1顺序查找
1.顺序查找的主要思想 顺序查找是一种最简单的查找方法,它的基本 思路是:从表的一端开始,用所给定的关键 字依次与顺序表中各记录的关键字逐个比较, 若找到相同的,查找成功;否则查找失败。
数据结构与算法课件第7章查找
1.二叉排序树的定义 二叉排序树(Binary Sort Tree),或者是一棵
空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值
均小于根结点的值; (2)若右子树不空,则右子树上所有结点的值
均大于根结点的值; (3)左、右子树本身又各都是一棵二叉排序树。
二叉排 序树
第一步以 X 为轴心,将 B 从 X 的左上方转到 X 的左下 侧,使 B 成为 X 的左孩子, X 成为 A 的左孩子。第二 步跟 LL 型一样处理 ( 应以 X 为轴心 ) 。
(4)右左(RL)型 新结点 X 插在 A 的右孩子的左子树里。分为两步进行:
第一步以 X 为轴心,将 B 从 X 的右上方转到 X 的右下 侧,使 B 成为 X 的右孩子, X 成为 A 的右孩子。第二 步跟 RR 型一样处理 ( 应以 X 为轴心 ) 。
二叉排序树 生成过程
4.二叉排序树的删除
如图三颗二叉排序树由值相同的关键字构成,但 是它们的输入顺序不ห้องสมุดไป่ตู้样:
图 (a)是按一月到十二月的自然月份序列输入所 生成的;
图 (b)的输入序列为(July, Feb, May, Mar, Aug, Jan, Apr, Jun, Oct, Sept, Nov, Dec)
比较的次数的期望值,通常记作ASL。
对于一个含有n个元素的表,查找成功时的平均查找长度 可表示为
其中,Pi为表中查找第i个记录的概率,Ci为查找第i个 记录所用到的比较次数。显然,对于不同的查找方法Ci 可能不一同。Pi很难通过分析给出,一般情形下我们认 为查找每个记录的概率相等。
顺序查找的基本思想是:从表的一端开始,顺序扫描 线性表,依次将扫描到的结点关键字和待查找值key相 比较,若相等,则查找成功,若整个表扫描完毕,仍 末找到关键字等于key的元素,则查找失败。
第1.7章 数据结构——查找
若对此算法进行一些改进, 若对此算法进行一些改进,在表尾增加一个关键字为 指定值K的记录 可避免每“比较”一次, 的记录, 指定值 的记录,可避免每“比较”一次,就要判别查找 是否结束。 很大时, 是否结束。当n很大时,大约可节省一半的时间。 很大时 大约可节省一半的时间。
The College of Computer Science and Technology
性能分析
折半查找成功的平均查找长度为: 折半查找成功的平均查找长度为: ASLbs=[log2n]+1 (求解过程从略 求解过程从略) 求解过程从略 折半查找的优点是比较次数少,查找速度快, 折半查找的优点是比较次数少,查找速度快,但只能 对有序表进行查找。 对有序表进行查找。它适用于一经建立就很少变动而又经 常需进行查找的有序表。 常需进行查找的有序表。
改进算法
#define MAXLEN n+1 int seqsearch2(DATATYPE A[],int k) { int i; i=0; A[MAXLEN−1].key=k;
The College of Computer Science and Technology
while (A[i].key!=k) i++; if (i<MAXLEN−1) return i; else return –1; } 称作监视哨, 将A[MAXLEN−1]称作监视哨,这个增加的记录起 称作监视哨 到了边界标识的作用。 到了边界标识的作用。
第一篇 数据结构
第7章 查找 章
章节分布
1 2 3 4
查找的基本概念
顺序查找
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.5 散列表及其查找
散列法查找归结为如下两个方面: (1)对给定的一组关键字构造一个计算简单且散列均 匀的散列函数; (2)拟订一个较好解决冲突的方法。
7.5 散列表及其查找
7.5.2 散列函数的构造方法
1. 直接定址法
取关键字的某个线性函数值为散列地址,即: H(key) = key 或 H(key) = a × key + b (a和b为常数)
22 48 86 0 6 12
22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 53
分块查找的过程是先确定待查记录所在的块,然后在块中 顺序查找。假设给定k=38, 则先在索引表中按顺序(或折半) 比较,因为22<k<48,则可确定38应该在第二块中,从第二块 的第一个记录 [6] 顺序查起.
表的存储 结构
顺序、链式 结构均可
等概率查 找最小
仅适用于 有序表
仅适用于 顺序存储
分块查找
次小
表中元素逐 段有序
顺序、链式 均可,索引 表顺序存储
7.5 散列表及其查找
7.5.1 散列表的概念
散列法亦称哈希(HASH)法,是在记录的存储位置和它 的关键字之间建立一个确定的对应关系 H,使每个关键字与 一个惟一的存储位置相对应。
7.2 顺序查找
顺序表的查找过程:
k
k
A
21 37 88 19 92 05 64 56 80 75 13
0 1 2 3 4 5 6 7 8 9 10 11
假设给定值 e=64, 要求 A[k] = e, 问: k = ?
7.2 顺序查找
顺序查找的查找过程为:从表中最后一个 记录开始,逐个地将记录的关键字值和给定值的 比较,若某个数据元素的关键字值和给定值相等, 则查找成功,找到所查记录;反之,若一直找到 第一个,其关键字值和给定值都不相等,则表明 数组中没有所查元素,查找不成功。
依次反复进行,在最坏的情况下,当表长缩小 为1时必然能找到;否则就表明找不到要查找的记录。
找21
1 2 3 4 5 6 7 8 9 10 11
查
5 13 19 21 37 56 64 75 80 88 92
找
的
low
mid
high
数
1 2 3 4 5 6 7 8 9 10 11
据
5 13 19 21 37 56 64 75 80 88 92
散列方法不同于顺序查找、二分查找。它不以关键字的 比较为基本操作,而采用直接寻址技术。在理想情况下,无 须任何比较就可以找到待查关键字,查找的期望时间为O(1)。
7.5 散列表及其查找
基本思想:以记录中关键字的值为自变量,通过确定 的函数H(散列函数)进行计算,求出对应的函数值, 把这个函数值作为存储地址,将该记录(或 记录的关键 字)存放在这个位置上,查找时仍按这个确定的函数H 进行计算,获得的将是待查的关键字所在记录的存储地 址。
由于直接定址法所得地址集合和关键字大小相同,因 此,关键字不会产生冲突,但实际应用中能够使用这种散 列函数的情况很少。
7.5 散列表及其查找
2. 数字分析法
键值的位数比存储区域的地址码的位数多,在这种情况 下可以对键值的各位进行分析,丢掉分布不均匀的位,留下 分布均匀的位作为地址。
适用于关键字集中的集合,且关键字是事先知道的。
• 【例如】建立一张全国30个地区的各民族统计表
– H1:取键值中第一个字母在字母表中的序号作为散列 函数。
– H2:先求键值中首尾两个字母在字母表中的序号之和, 如果这个和大于30,则减去30。
BEJING
K H1(K) H2(K)
北京 02 09
SHANXI
山西 19 28
SHANG HAI
上海 19 28
7.1 基本概念
静态查找表 •顺序查找 •二分查找 •分块查找
7.2 顺序查找
顺序查找(Sequential Search)也称为线 性查找。
基本思想:用给定的值与表中各个记录的关 键字值逐个进行比较,若找到相等的则查找成功, 否则查找不成功,给出找不到的提示信息。
这种查找方法对顺序存储和链式存储都是适 用的。
7.4 分块查找
分块查找的平均查找长度由两个部分组成:
ASL= Eb +Ew Eb为确定某一块所需的平均查找长度,Ew为在块内 的平均查找长度。假设线性表中共有n个数据元素,平均 分成b块,每块s个数据元素,并假设查找各块概率相等, 若在索引表内和块内查找均用顺序查找方法,
则Ew=(s+1)/2 , Eb =(b+1)/2 ,所以 ASL=Eb+Ew=(b+s)/2+1=(n/s+s)/2+1 当s= n 时,ASL取最小值,这时ASL= n +1。
SHAN DONG 山东
19 26
HENAN
河南 08 22
7.5 散列表及其查找
由此可见: (1)散列函数是一个映象,因此散列函数的设定很灵活,
只要使得任何键值由此所得的散列函数值都落在表长允许 的范围之内即可;
(2)对于不同的键值可能得到相同的散列地址, 即 K1≠K2,而H(K1)=H(K2),这种现象称为散列冲突。 具有相同函数值的键值称该散列函数的同义词。
2. 数字分析法 【例如】为每年招收的 1000 名新生建立一张查找表, 其关键字为学号,其值的范围为 xx000 ~ xx999 (前 两位为年份)。
若以下标为000 ~ 999 的顺序表表示之。
则查找过程可以简单进行:取给定值(学号) 的后三位,不需要经过比较便可直接从顺序表中 找到待查关键字。
• 关键字(Key)是数据元素(或记录)中某个数据项 的值,用它可以标识(识别)一个数据元素(或记录)。
• 若此关键字可以惟一地标识一个记录,则称此关键字 为主关键字(Primary Key)。
• 查找(搜索):给定一个值,在查找表中确定是否存 在一个数据元素(或记录),其关键字等于给定的值。
7.1 基本概念
7.3 二分法查找
在顺序存储的条件下,若各记录是按其关键字 值的大小依次存放的,则这个查找表称为有序表。
在有序表中可采用二分法查找(或称为折半查 找)的方法进行查找。
假设表中元素为升序排列。
7.3 二分法查找
基本思想:取表的中间记录的关键字值与给定 关键字的值相比较,如果给定值比该记录的关键字 值大,则要查找的记录一定在表的后半部分;若给定 值比该记录的关键字值小,则要查找的记录一定在 表的前半部分。
中
5 13 19 21 37 56 64 75 80 88 92
low>high 查找失败
123456
low high
mid 7 8 9 10 11
5 13 19 21 37 56 64 75 80 88 92
high low
7.3 二分法查找
从二分法查找的执行情况分析,每做一次比较,查找的 范围都缩小一半。因此二分法查找的平均查找长度为
对查找表经常进行的操作: 1)查询(检索)某个“特定的”数据元
素是否在查找表中及各种属性; 2)在查找表中插入一个数据元素; 3)从查找表中删去某个数据元素。
7.1 基本概念
查找表可分为两类: 静态查找表
仅作查询和检索操作的查找表。
动态查找表 有时还需将“查询”结果为“不在查找表中”的 数据元素插入到表中;或者,从查找表中删除其 “查询”结果为“在查找表中”的数据元素。
7.4 分块查找
查找步骤:
• 首先用给定值在索引表中查找,确定满足条 件的数据元素应存放在哪一块中。
• 然后再到相应的块中进行顺序查找,便可以 得到查找的结果。
7.4 分块查找
索引表A的每个元素包含两个字段,一个是该块的最大 关键字值,另一个是指向子表的指针。
例如,给定关键字序列如下: {22,12,13,8,9,20,33,42,44,38,24,48,60,58,74,49,86,53}, 假 设 B=3,即将该序列分成3个子表(如何划分此处不考虑), 每个子表有6个元素,则得到的主表和索引表如图:
ASL= log2(n+1) - 1 当n足够大时,可近似表示为 log2n。 优点:二分法查找比顺序查找的速度要快得多。当然, 使用二分法查找必须是在顺序存储的条件下,且事先必须做 到按关键字值排序才行。
练习
1、若有一个由17个元素组成的有序表,利用二分 法查找方法查找有序表的元素,问查找成功时, 最少比较几次?最多比较几次? 【答案】 查找成功时,最少比较1次,最多比较5次。
第7章 查 找
第7章 查 找
学习目的要求:
1. 顺序表、有序表、索引顺序表的定义、查找 及算法。
2. 散列表的定义及构造法。 3. 散列表冲突的处理方法。
第7章 查 找
7.1 基本概念 7.2 顺序查找 7.3 二分法查找 7.4 分块查找 7.5 散列表及其查找
7.1 基本概念
• 查找表(Search Table)是由同一类型的数据元素 (或记录)构成的集合。
在
表
low
mid
high
中
1 2 3 4 5 6 7 8 9 10 11
5 13 19 21 37 56 64 75 80 88 92
low high mid
找到
找70
1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
查
low
mid
high
练习
• 采用分块查找时,若线性表中共有625个元素, 查找每个元素的概率相同,假设采用顺序查找来 确定结点所在的块时,每块应分为多少个结点最 佳。 【答案】