数据结构 第九章查找

71
中中中中C++ 中中中中中中中中中中 中中 中中中中中中中中中中中中 中中中中中中中中中中中中 中中中中 中中中中 中中中 中中中 中中 中中

Upload: allen-diaz

Post on 03-Jan-2016

175 views

Category:

Documents


3 download

DESCRIPTION

数据结构 第九章查找. 本章内容 9.1 查找的基本概念 9.2 静态查找表 9.3 动态查找表 9.4 哈希表. 9.1 查找的基本概念. 查找表 (Search Table) 查找表是由同一类型的数据元素 ( 或记录 ) 构成的集合。对查找表的操作主要有: 查询某个“特定的”数据元素是否在查找表中; 检索某个“特定的”数据元素的各种属性; 在查找表中插入一个数据元素; 从查找表中删去某个数据元素。 查找表分类 静态查找表  仅作查询和检索操作的查找表。 动态查找表 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 数据结构 第九章查找

中国科大《 C++ 程序设计实习》

《 数据结构》课程

中国科学技术大学网络学院中国科学技术大学网络学院

数据结构数据结构第九章第九章 查找查找

Page 2: 数据结构 第九章查找

本章内容

9.1 查找的基本概念9.2 静态查找表9.3 动态查找表9.4 哈希表

Page 3: 数据结构 第九章查找

9-3 中国科大《数据结构》

9.1 查找的基本概念

查找表查找表 (Search Table)(Search Table)

查找表是由同一类型的数据元素查找表是由同一类型的数据元素 (( 或记录或记录 )) 构成的集合。对查找构成的集合。对查找表的操作主要有:表的操作主要有:1.1. 查询某个“特定的”数据元素是否在查找表中;查询某个“特定的”数据元素是否在查找表中;2.2. 检索某个“特定的”数据元素的各种属性;检索某个“特定的”数据元素的各种属性;3.3. 在查找表中插入一个数据元素;在查找表中插入一个数据元素;4.4. 从查找表中删去某个数据元素。从查找表中删去某个数据元素。

查找表分类查找表分类 静态查找表静态查找表 仅作查询和检索操作的查找表。 仅作查询和检索操作的查找表。 动态查找表动态查找表 在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删 在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删

除已存在的某个数据元素除已存在的某个数据元素

Page 4: 数据结构 第九章查找

9-4 中国科大《数据结构》

9.1 查找的基本概念

关键字关键字 (Key)(Key)

关键字是数据元素(或记录)中某个数据项的值,用以标关键字是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。识(识别)一个数据元素(或记录)。 主关键字:可以识别唯一的一个记录的关键字主关键字:可以识别唯一的一个记录的关键字 次关键字:能识别若干记录的关键字次关键字:能识别若干记录的关键字

查找查找 (Searching)(Searching)

是根据给定的某个值,在查找表中确定一个其关键字等于是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。给定值的数据元素(或记录)。

Page 5: 数据结构 第九章查找

9-5 中国科大《数据结构》

9.1 查找的基本概念

衡量查找算法的标准衡量查找算法的标准 时间复杂度时间复杂度;; 空间复杂度空间复杂度;; 平均查找长度平均查找长度 ASLASL ::定义为确定记录在表中的位置所进行的和定义为确定记录在表中的位置所进行的和

关键字比较的次数的平均值关键字比较的次数的平均值 nn ASL = ∑ PASL = ∑ PiiCCii i=1i=1

nn 为查找表的长度,即表中所含元素的个数为查找表的长度,即表中所含元素的个数PPii 为查找第为查找第 ii 个元素的概率个元素的概率 (∑P(∑Pii=1)=1)CCii 是查找第是查找第 ii 个元素时同给定值个元素时同给定值 KK 比较的次数比较的次数

Page 6: 数据结构 第九章查找

9-6 中国科大《数据结构》

9.2 静态查找表

9.2.19.2.1 顺序表的查找顺序表的查找顺序查找算法是顺序表(既无序表)的查找方法。在顺序查找算法顺序查找算法是顺序表(既无序表)的查找方法。在顺序查找算法中,以顺序表或线性链表表示静态查找表。中,以顺序表或线性链表表示静态查找表。

面临的问题面临的问题下标越界的检查,需要相当的时间和空间代价。解决的办法是,将下标越界的检查,需要相当的时间和空间代价。解决的办法是,将ST.elem[0].key ST.elem[0].key 置为置为 key,key, 所有元素检查完还没有找到时,在所有元素检查完还没有找到时,在 ST.ST.elem[0]elem[0] 处一定找到。从而免去了检查下标越界的时间。处一定找到。从而免去了检查下标越界的时间。

顺序查找算法顺序查找算法1.1. 从表中从表中最后一个记录最后一个记录开始开始2.2. 逐个进行记录的关键字和给定值的比较逐个进行记录的关键字和给定值的比较3.3. 若某个记录比较相等,则查找成功若某个记录比较相等,则查找成功4.4. 若直到第若直到第 11 个记录都比较不等,则查找不成功个记录都比较不等,则查找不成功

Page 7: 数据结构 第九章查找

9-7 中国科大《数据结构》

9.2 静态查找表

顺序查找算法描述顺序查找算法描述

设置“哨兵”的目的是省略对下标越界的检查,提高算法执行设置“哨兵”的目的是省略对下标越界的检查,提高算法执行速度。当然,哨兵也可以设置在高下标处。速度。当然,哨兵也可以设置在高下标处。

int Search_Seq(SSTable ST, KeyType key) {int Search_Seq(SSTable ST, KeyType key) {// // 若查找成功,返回位置若查找成功,返回位置ST.elem[0].key = key; ST.elem[0].key = key; // “// “ 哨兵”,哨兵”,for (i=ST.length; ST.elem[i].key!=key; --i); for (i=ST.length; ST.elem[i].key!=key; --i); // // 从后往前找从后往前找return i; return i; // // 找不到时找不到时 ,i=0,i=0

}}

Page 8: 数据结构 第九章查找

9-8 中国科大《数据结构》

9.2 静态查找表

顺序查找示举例顺序查找示举例在下列顺序表中寻找在下列顺序表中寻找 6262 ,如果找到,给出其所在位置的下标。,如果找到,给出其所在位置的下标。

监视哨兵i=11i=7, 找到 i=8 i=9 i=10

比较次数 =5比较次数分析:查找第 n 个元素: 1 次查找第 n-1 个元素: 2 次……….查找第 1 个元素: n 次查找第 i 个元素: n+1-i 次查找失败: n+1 次

0 1 2 3 4 5 6 7 8 9 10 11

62 5 13 19 21 37 56 62 75 80 88 92

Page 9: 数据结构 第九章查找

9-9 中国科大《数据结构》

9.2 静态查找表

顺序查找性能分析顺序查找性能分析 对顺序表而言,对顺序表而言, CCii=n-i+1=n-i+1

在等概率查找的情况下,在等概率查找的情况下, PPii=1/n=1/n

平均查找长度 平均查找长度 ASLASLssss=n*P=n*P11 +(n-1)P +(n-1)P22 +…+ 2P +…+ 2Pn-1n-1+ P+ Pnn = (n+1)/2 = (n+1)/2

如果被查找的记录概率不等时, 如果被查找的记录概率不等时, ASLASLssss 在 在 PPnn≥P≥Pn-1n-1 ≥…≥P ≥…≥P22≥P≥P11 时取时取极小值极小值

若查找概率无法事先测定,则查找过程采取的改进办法是,在每次查若查找概率无法事先测定,则查找过程采取的改进办法是,在每次查找之后,将刚刚查找到的记录直接移至表尾的位置上。找之后,将刚刚查找到的记录直接移至表尾的位置上。

顺序查找特点顺序查找特点 优点:优点:

1.1. 简单简单2.2. 适应面广适应面广 (( 对表的结构无任何要求对表的结构无任何要求 ))

缺点:缺点:1.1. 平均查找长度较大平均查找长度较大2.2. 特别是当特别是当 nn 很大时,查找效率很低很大时,查找效率很低

Page 10: 数据结构 第九章查找

9-10 中国科大《数据结构》

9.2 静态查找表

9.2.2 9.2.2 折半查找折半查找折半查找算法是折半查找算法是有序表有序表的查找方法。在折半查找算法中,静态查找的查找方法。在折半查找算法中,静态查找表按关键字大小的次序,有序地存放在顺序表中。表按关键字大小的次序,有序地存放在顺序表中。

折半查找的原理折半查找的原理1.1. 先确定待查记录所在的范围先确定待查记录所在的范围 (( 前部分或后部分前部分或后部分 ))2.2. 逐步缩小逐步缩小 (( 一半一半 )) 范围直到找范围直到找 (( 不不 )) 到该记录为止到该记录为止

Page 11: 数据结构 第九章查找

9-11 中国科大《数据结构》

9.2 静态查找表

折半查找算法折半查找算法1.1. nn 个对象从小到大存放在有序顺序表个对象从小到大存放在有序顺序表 STST 中中,, kk 为给定值为给定值2.2. 设设 lowlow 、、 highhigh 指向待查元素所在区间的下界、上界,即指向待查元素所在区间的下界、上界,即 low=low=

1, high=n1, high=n

3.3. 设设 midmid指向待查区间的中点,即 指向待查区间的中点,即 mid=(low+high)/2mid=(low+high)/24.4. 让让 kk 与与 midmid指向的记录比较指向的记录比较

若 若 k=ST[mid].keyk=ST[mid].key ,查找成功,查找成功 若 若 k<ST[mid].keyk<ST[mid].key ,则,则 high=mid-1high=mid-1 [[ 上半区间上半区间 ]] 若 若 k>ST[mid].keyk>ST[mid].key ,则,则 low=mid+1low=mid+1 [[ 下半区间下半区间 ]]

5.5. 重复重复 3,43,4操作,直至操作,直至 low>highlow>high 时,查找失败。时,查找失败。

Page 12: 数据结构 第九章查找

9-12 中国科大《数据结构》

9.2 静态查找表

折半成功查找举例:在下列有序表中用折半查找法查找折半成功查找举例:在下列有序表中用折半查找法查找 6262 所在位所在位置。置。 Key = 62Key = 62

1 2 3 4 5 6 7 8 9 10 11

5 13 19 21 37 56 62 75 80 88 92

low=1 mid=6 high=11

第一步: low=1, high=11, mid=6 ST[mid]=ST[6]=56<62, 则改变 low ;

第二步: low=mid+1=7, mid=9

mid=9low=7

ST[mid]=ST[9]=80>62, 则改变 high ;

第三步: high=mid-1=8, mid=7

high=8mid=7

ST[mid]=ST[7]=62=62, 找到!

62

Page 13: 数据结构 第九章查找

9-13 中国科大《数据结构》

9.2 静态查找表

折半查找失败举例:在上例有序表中找折半查找失败举例:在上例有序表中找 6161 。。

1 2 3 4 5 6 7 8 9 10 11

5 13 19 21 37 56 62 75 80 88 92

high=6 low=7

找 61

当下界 low大于上界 high时,说明有序 表中没有关键字等于 K的元素,查找失败

Page 14: 数据结构 第九章查找

9-14 中国科大《数据结构》

9.2 静态查找表

折半查找的性能分析折半查找的性能分析折半查找过程可以用二叉树(也叫判定树)来描述:折半查找过程可以用二叉树(也叫判定树)来描述: 判定树上每个结点需要的查找次数刚好为该结点所在的层数; 查找成功时查找次数不会超过判定树的深度 n 个结点的判定树的深度为 log2n +1

比较次数最多不超过 log2n +1

折半查找的算法复杂度为 log2n +1

3 9

41 7

5

6

10

2 118

判定树

Page 15: 数据结构 第九章查找

9-15 中国科大《数据结构》

9.2 静态查找表

折半查找特点折半查找特点 折半查找的效率比顺序查找高,特别是查找表的长度很长时;折半查找的效率比顺序查找高,特别是查找表的长度很长时; 折半查找只能适用于等概率有序表,并且以顺序存储结构存储。折半查找只能适用于等概率有序表,并且以顺序存储结构存储。

Page 16: 数据结构 第九章查找

9-16 中国科大《数据结构》

9.2 静态查找表

9.2.3 9.2.3 分块查找分块查找

分块查找是一种索引顺序表分块查找是一种索引顺序表 (( 分块有序表分块有序表 )) 查找方法,是折半查查找方法,是折半查找和顺序查找的简单结合;找和顺序查找的简单结合;

索引顺序表索引顺序表 (( 分块有序表分块有序表 )) 将整个表分成几块,块内无序,块间将整个表分成几块,块内无序,块间有序有序

所谓块间有序是指后一块表中所有记录的关键字均大于前一块所谓块间有序是指后一块表中所有记录的关键字均大于前一块表中的最大关键字表中的最大关键字

Page 17: 数据结构 第九章查找

9-17 中国科大《数据结构》

9.2 静态查找表

基本概念基本概念 主表:用数组存放待查记录主表:用数组存放待查记录 ,, 每个数据元素至少含有关键字域每个数据元素至少含有关键字域 索引表:每个结点含有最大关键字域和指向本块第一个结点的索引表:每个结点含有最大关键字域和指向本块第一个结点的指针指针

1 2 3 4 5 6 7 8 9 10 11

5 19 13 21 75 56 62 37 88 80 92

211

755

929

主表

索引表

Page 18: 数据结构 第九章查找

9-18 中国科大《数据结构》

9.2 静态查找表

分块查找举例分块查找举例 采用折半查找方法在索引表中找到块(第采用折半查找方法在索引表中找到块(第 22块)块) 用顺序查找方法在主表对应块中找到记录(第用顺序查找方法在主表对应块中找到记录(第 33个记录)个记录)

1 2 3 4 5 6 7 8 9 10 11

5 19 13 21 75 56 62 37 88 80 92

211

755

929

主表

索引表

找 62

Page 19: 数据结构 第九章查找

9-19 中国科大《数据结构》

9.2 静态查找表

分块查找性能分析分块查找性能分析 若将长度为若将长度为 nn 的表分成的表分成 bb 块,每块含块,每块含 ss 个记录,并设表中每个个记录,并设表中每个

记录查找概率相等记录查找概率相等 用折半查找方法在索引表中查找索引块,用折半查找方法在索引表中查找索引块, ASLASL 块间块间≈≈ loglog22(n/s+1)(n/s+1)

用顺序查找方法在主表对应块中查找记录,用顺序查找方法在主表对应块中查找记录, ASLASL 块内块内 =s/2=s/2

ASL≈log2(n/s+1) + s/2ASL≈log2(n/s+1) + s/2

Page 20: 数据结构 第九章查找

9-20 中国科大《数据结构》

9.3 动态查找表

动态查找表 如果应用问题涉及的数据量很大,而且数据经常发生变化,

如图书馆经常购进图书,每购进新书,需将新书记录插入图书表,对这类表除了提供前面的介绍的查找外,还要提供动态查找功能:1. 查找某个“特定”元素是否在表中,若不在,将该元素插入;2. 查找某个“特定”元素是否在表中,若在,从表中删除;

如何组织动态查找表?用静态查找方法不能满足要求了。本节介绍几种方法。

Page 21: 数据结构 第九章查找

9-21 中国科大《数据结构》

9.3 动态查找表

9.3.1 9.3.1 二叉排序树二叉排序树二叉排序树又称二叉查找树二叉排序树又称二叉查找树

空树或者是具有如下特性的二叉树:空树或者是具有如下特性的二叉树:1.1. 若左子树不空,则左子树上所有结点的值均小于根结点的值;若左子树不空,则左子树上所有结点的值均小于根结点的值;2.2. 若右子树不空,则右子树上所有结点的值均大于根结点的值;若右子树不空,则右子树上所有结点的值均大于根结点的值;3.3. 左、右子树也都分别是二叉排序树。左、右子树也都分别是二叉排序树。

21

二叉排序树 非二叉排序树

56

64

5 9237

8819

8021

13

75

60

56

64

5 9237

8819

8021

13

75

Page 22: 数据结构 第九章查找

9-22 中国科大《数据结构》

9.3 动态查找表

二叉排序树查找算法二叉排序树查找算法 给定值与根结点比较:给定值与根结点比较:

1.1. 若相等,查找成功若相等,查找成功2.2. 若小于,查找左子树若小于,查找左子树3.3. 若大于,查找右子树若大于,查找右子树

56

64

5 9237

8819

8021

13

75

例 1 :在右图二叉排序树中查找关键字值等于 37

37

找到

例 2 :在右图二叉排序树中查找关键字值等于 88

找到

例 3 :在右图二叉排序树中查找关键字值等于 94

无此数

Page 23: 数据结构 第九章查找

9-23 中国科大《数据结构》

9.3 动态查找表

二叉排序树插入二叉排序树插入二叉排序树是一种动态树表。二叉排序树是一种动态树表。 当树中不存在查找的结点时,作插入操作当树中不存在查找的结点时,作插入操作 新插入的结点一定是叶子结点(只需改动一个结点的指针)新插入的结点一定是叶子结点(只需改动一个结点的指针) 该叶子结点是查找不成功时路径上访问的最后一个结点左孩子该叶子结点是查找不成功时路径上访问的最后一个结点左孩子

或右孩子或右孩子 ((新结点值小于或大于该结点值新结点值小于或大于该结点值 ))

56

64

5 9237

8819

8021

13

75

例:在右图二叉树中插入结点例:在右图二叉树中插入结点 9494 。。

94

Page 24: 数据结构 第九章查找

9-24 中国科大《数据结构》

9.3 动态查找表

二叉排序树生成二叉排序树生成例:画出在初始为空的二叉排序树中依次插入例:画出在初始为空的二叉排序树中依次插入 56,64,92,80,88,7556,64,92,80,88,75时该树的生长全过程时该树的生长全过程

56

64

92

88

80

75

Page 25: 数据结构 第九章查找

9-25 中国科大《数据结构》

9.3 动态查找表

二叉排序树中序遍历二叉排序树中序遍历中序遍历二叉排序树,可得到一个关键字的有序序列中序遍历二叉排序树,可得到一个关键字的有序序列 ,, 如如 5,13,19,5,13,19,21,37,56,64,92,75,80,8821,37,56,64,92,75,80,88

56

64

5 9237

8819

8021

13

75

Page 26: 数据结构 第九章查找

9-26 中国科大《数据结构》

9.3 动态查找表

二叉排序树删除二叉排序树删除删除二叉排序树中的一个结点后,必须保持二叉排序树的删除二叉排序树中的一个结点后,必须保持二叉排序树的

特性:左子树的所有结点值小于根结点,右子树的所有结点值大于特性:左子树的所有结点值小于根结点,右子树的所有结点值大于根结点。也即保持中序遍历后,输出为有序序列根结点。也即保持中序遍历后,输出为有序序列

被删除结点具有以下三种情况被删除结点具有以下三种情况1.1. 是叶子结点是叶子结点2.2. 只有左子树或右子树只有左子树或右子树3.3. 同时有左、右子树同时有左、右子树

下面针对三种情况各举一例。下面针对三种情况各举一例。

Page 27: 数据结构 第九章查找

9-27 中国科大《数据结构》

9.3 动态查找表

被删除结点是叶子结点:直接删除结点,并让其父结点指向该结点被删除结点是叶子结点:直接删除结点,并让其父结点指向该结点的指针变为空。的指针变为空。

例:删除右二叉例:删除右二叉排序排序树中的树中的 8888 节点节点

56

64

5 9237

8819

8021

13

75

Page 28: 数据结构 第九章查找

9-28 中国科大《数据结构》

9.3 动态查找表

被删除结点只有左子树或右子树被删除结点只有左子树或右子树删除结点删除结点 ,,让其父结点指向该结点的指针指向其左子树让其父结点指向该结点的指针指向其左子树 (( 或右子树或右子树 ),),即用孩子结点替代被删除结点即可即用孩子结点替代被删除结点即可

例:对于右边二叉例:对于右边二叉排序排序树中,先删除节点树中,先删除节点 3737,再删除节点,再删除节点 6464。。

56

64

5 37

19

21

13

92

88

80

75

Page 29: 数据结构 第九章查找

9-29 中国科大《数据结构》

9.3 动态查找表

被删除结点被删除结点 pp 既有左子树,又有右子树既有左子树,又有右子树

以中序遍历时的直接前驱以中序遍历时的直接前驱 ss 替代被删除结点替代被删除结点 pp ,然后再按照前面介,然后再按照前面介绍的发删除该直接前驱绍的发删除该直接前驱 ss (只可能有左孩子)(只可能有左孩子)

56

64

5 9237

88

80

19

21

13

75

例:在右边二叉排序树中例:在右边二叉排序树中 ,, 节点节点 5656

的中序遍历的直接前趋是节点的中序遍历的直接前趋是节点 3737 。。

Page 30: 数据结构 第九章查找

9-30 中国科大《数据结构》

9.3 动态查找表

二叉排序树性能分析二叉排序树性能分析 在最好的情况下,二叉排序树在最好的情况下,二叉排序树

为一近似完全二叉树时,其查为一近似完全二叉树时,其查找深度为找深度为 loglog22nn 量级,即其时量级,即其时间复杂性为间复杂性为 O(logO(log22n)n)

在最坏的情况下,二叉排序树在最坏的情况下,二叉排序树为近似线性表时为近似线性表时 (( 如以升序或如以升序或降序输入结点时,见右图降序输入结点时,见右图 )) ,,其查找深度为其查找深度为 nn 量级,即其量级,即其时间复杂性为时间复杂性为 O(n)O(n)

80

88

92

64

75

21

19

13

56

37

5

Page 31: 数据结构 第九章查找

9-31 中国科大《数据结构》

9.3 动态查找表

二叉排序树特性二叉排序树特性 一个无序序列可以通过构造一棵二叉排序一个无序序列可以通过构造一棵二叉排序树而变成一个有序序列(通过中序遍历)树而变成一个有序序列(通过中序遍历)

插入新记录时,只需改变一个结点的指针,插入新记录时,只需改变一个结点的指针,相当于在有序序列中插入一个记录而不需相当于在有序序列中插入一个记录而不需要移动其它记录要移动其它记录

二叉排序树既拥有类似于折半查找的特性,二叉排序树既拥有类似于折半查找的特性,又采用了链表作存储结构又采用了链表作存储结构

但当插入记录的次序不当时但当插入记录的次序不当时 (( 如升序或降如升序或降序序 )) ,则二叉排序树深度很深(见右图),,则二叉排序树深度很深(见右图),增加了查找的时间增加了查找的时间

80

88

92

64

75

21

19

13

56

37

5

Page 32: 数据结构 第九章查找

9-32 中国科大《数据结构》

9.3 动态查找表

平衡二叉树平衡二叉树平衡二叉树平衡二叉树 (Balanced Binary Tree, Height-Balanced Tr(Balanced Binary Tree, Height-Balanced Tr

eeee,,又称又称 AVLAVL 树树 ,,Adelsen - Velskii and LandisAdelsen - Velskii and Landis ,,阿德尔森一维尔斯和兰迪斯 )) 是二叉排序树的另一种形式。其特点为:树中每个是二叉排序树的另一种形式。其特点为:树中每个结点的左、右子树深度之差的绝对值不大于结点的左、右子树深度之差的绝对值不大于 11 ,即,即 |h|hLL-h-hRR|≤1|≤1 。可。可以证明,它们的深度和以证明,它们的深度和 lognlogn 是同数量级的(其中是同数量级的(其中 nn 为节点个数)。为节点个数)。

56

64

5 9237

8819

8021

13

75

60

56

5 64

19

13

7537

80

92

88

21

AVL树 非 AVL树

Page 33: 数据结构 第九章查找

9-33 中国科大《数据结构》

9.3 动态查找表

平衡二叉树平衡因子平衡二叉树平衡因子 每个结点附加一个数字每个结点附加一个数字 , , 给出该结点左子树的高度减去右子树给出该结点左子树的高度减去右子树

的高度所得的高度差的高度所得的高度差 ,,这个数字即为结点的平衡因子这个数字即为结点的平衡因子 (balance (balance factor)factor)

AVLAVL 树任一结点平衡因子只能取 树任一结点平衡因子只能取 -1, 0, 1-1, 0, 1 若某个结点的平衡因子的绝对值大于若某个结点的平衡因子的绝对值大于 11 ,则这棵二叉搜索树就,则这棵二叉搜索树就

失去了平衡,不再是失去了平衡,不再是 AVLAVL 树。树。

56

5 64

19

13

7537

80

92

88

21

0

0 -1

0

-1

00

0

1

0

0

Page 34: 数据结构 第九章查找

9-34 中国科大《数据结构》

9.3 动态查找表

非平衡二叉树的平衡处理若一棵二叉排序树是平衡二叉树,扦入某个结点后,可能

会变成非平衡二叉树,这时,就可以对该二叉树进行平衡处理,使其变成一棵平衡二叉树。

处理的原则应该是处理与插入点最近的、而平衡因子又比1 大或比 -1 小的结点。下面将分四种情况讨论平衡处理。

Page 35: 数据结构 第九章查找

9-35 中国科大《数据结构》

9.3 动态查找表

1.1. LLLL 型 的处理型 的处理 ((左左型左左型 )) 如下图所示,若在如下图所示,若在 CC 的左孩子的左孩子 BB 上扦入一个左孩子结点上扦入一个左孩子结点 AA ,使,使

CC 的平衡因子由的平衡因子由 11变成了变成了 22 ,成为不平衡的二叉树序树。,成为不平衡的二叉树序树。 平衡处理:将平衡处理:将 CC 顺时针旋转,成为顺时针旋转,成为 BB 的右子树,而原来的右子树,而原来 BB 的右的右子树则变成子树则变成 CC 的左子树,待扦入结点的左子树,待扦入结点 AA 作为作为 BB 的左子树。的左子树。

C

B

A

2

1

0 C

B

A0

0

0

结点旁边的数字表示该 结点的平衡因子结点旁边的数字表示该 结点的平衡因子

Page 36: 数据结构 第九章查找

9-36 中国科大《数据结构》

9.3 动态查找表

2. LR 型的处理 (左右型 )

如下图所示,在 C 的左孩子 A 上扦入一个右孩子 B ,使的 C

的平衡因子由 1变成了 2 ,成为不平衡的二叉排序树。 平衡处理:将 B变到 A与 C 之间,使之成为 LL 型,然后按

第 1 种情形 LL 型处理。

C

B

A

2

1

0 C

B

A0

0

0

C

B

A

2

-1

0

结点旁边的数字表示该 结点的平衡因子结点旁边的数字表示该 结点的平衡因子

Page 37: 数据结构 第九章查找

9-37 中国科大《数据结构》

9.3 动态查找表

3. RR 型的处理 (右右型 )

如下图所示,在 A 的右孩子 B 上扦入一个右孩子 C ,使 A 的平衡因子由 -1变成 -2 ,成为不平衡的二叉排序树。

平衡处理:将 A逆时针旋转,成为 B 的左子树,而原来 B 的左子树则变成 A 的右子树,待扦入结点 C 成为 B 的右子树。

C

B

A

-2

-1

0 C

B

A0

0

0

结点旁边的数字表示该 结点的平衡因子结点旁边的数字表示该 结点的平衡因子

Page 38: 数据结构 第九章查找

9-38 中国科大《数据结构》

9.3 动态查找表

4. RL 型的处理 (右左型 )

如下图所示,在 A 的右孩子 C 上扦入一个左孩子 B ,使 A 的平衡因子由 -1变成 -2 ,成为不平衡的二叉排序树。

平衡处理:将 B变到 A与 C 之间,使之成为 RR 型,然后按第 (3) 种情形 RR 型处理。

C

B

A

-2

-1

0 C

B

A0

0

0

结点旁边的数字表示该 结点的平衡因子结点旁边的数字表示该 结点的平衡因子

A

C

B

-2

1

0

Page 39: 数据结构 第九章查找

9-39 中国科大《数据结构》

9.3 动态查找表

例 1 :给定一个关键字序列 4,5,7,2 ,1,3,6 ,试生成一棵平衡二叉树。 分析:平衡二叉树实际上也是一棵二叉排序树,故可以按建立二叉排序树

的思想建立,在建立的过程中,若遇到不平衡,则进行相应平衡处理,最后就可以建成一棵平衡二叉树。具体生成过程见下图。

40

a) 插入 4 ,平衡

4-1

b) 插入 5 ,平衡

50

c) 插入 7 ,不平衡,要处理

4-2

5-1

70 4

05

0

70

RR 型处理

Page 40: 数据结构 第九章查找

9-40 中国科大《数据结构》

9.3 动态查找表

40

51

70

d) 插入 7 ,平衡

2

14

1

52

70

2

2

e) 插入 1 ,不平衡,要处理

10

4

0

50

70

2

0

1 0

LL 型处理

4

0

52

70

2-1

1 1

f) 插入 3 ,不平衡,要处理

30

LR 型处理

30

40

5-1

2

0

10

70

Page 41: 数据结构 第九章查找

9-41 中国科大《数据结构》

9.3 动态查找表

30

4-1

5-2

2

0

10

71

f) 插入 6 ,不平衡,要处理

06

RL 型处理

30

40

60

2

0

1

0

7

0

50

Page 42: 数据结构 第九章查找

9-42 中国科大《数据结构》

9.3 动态查找表

平衡二叉树的查找及性能分析平衡二叉树本身就是一棵二叉排序树,故它的查找与二叉

排序树完全相同。但它的查找 性能优于二叉排序树,不像二叉排序树一样,会出现最坏的时间复杂度 O(n) ,它的时间复杂度与二叉排序树的最好时间复杂相同,都为 O(log2n) 。

Page 43: 数据结构 第九章查找

9-43 中国科大《数据结构》

9.3 动态查找表

例 2 ,对例 1 给定的关键字序列 4,5,7,2,1,3,6 ,试用二叉排序树和平衡二叉树两种方法查找,给出查找 6 的次数及成功的平均查找长度。

分析:由于关键字序列的顺序己经确定,故得到的二叉排序树和平衡二叉树都是唯一的。得到的平衡二叉树见下座图,得到的二叉排序树见下右图。

3

4

62

1 75

平衡二叉树

3

4

52

1 7

6二叉排序树

从右图的二叉排序树可知,查找 6 需 4次,平均查找长度ASL=(1+2+2+3+3+3+4)/7=18/7≈2.57

从左图的平衡二叉树可知,查找 6 需 2 次,平均查找长度ASL=(1+2+2+3+3+3+3)=17/7≈2.43

从结果可知,平衡二叉树的查找性能优于二叉排序树。

Page 44: 数据结构 第九章查找

9-44 中国科大《数据结构》

9.4 哈希表

9.4.19.4.1 哈希表哈希表哈希哈希 (Hash)(Hash) 表又称散列表表又称散列表 ,, 是一种直接计算记录存放地址是一种直接计算记录存放地址

的方法,它在关键码与存储位置之间直接建立了映象。的方法,它在关键码与存储位置之间直接建立了映象。 哈希哈希函数函数

哈希函数是从关键字空间到存储地址空间的一种映象哈希函数是从关键字空间到存储地址空间的一种映象 哈希函数在记录的关键字与记录的存储地址之间建立起一种对哈希函数在记录的关键字与记录的存储地址之间建立起一种对应关系。可写成:应关系。可写成:

addr(aaddr(aii)= H(key)= H(keyii))

H( )H( ) 为哈希函数为哈希函数 keykeyii 是表中元素是表中元素 aaii 关键字关键字 ,,addr(aaddr(aii)) 是存储地址是存储地址

Page 45: 数据结构 第九章查找

9-45 中国科大《数据结构》

9.4 哈希表

哈希查找哈希查找 哈希查找也叫散列查找,是利用哈希函数进行查找的过程哈希查找也叫散列查找,是利用哈希函数进行查找的过程 首先利用哈希函数及记录的关键字计算出记录的存储地址首先利用哈希函数及记录的关键字计算出记录的存储地址 然后直接到指定地址进行查找然后直接到指定地址进行查找 不需要经过比较,一次存取就能得到所查元素不需要经过比较,一次存取就能得到所查元素

哈希冲突哈希冲突 不同的记录,其关键字通过哈希函数的计算,可能得到相同的不同的记录,其关键字通过哈希函数的计算,可能得到相同的地址地址

把不同的记录映射到同一个散列地址上,这种现象称为冲突把不同的记录映射到同一个散列地址上,这种现象称为冲突

Page 46: 数据结构 第九章查找

9-46 中国科大《数据结构》

9.4 哈希表

哈希表定义哈希表定义 根据设定的哈希函数 根据设定的哈希函数 H(key) H(key) 和所选中的处理冲突的方法和所选中的处理冲突的方法 将一组关键字映象到一个有限的、地址连续的地址集上将一组关键字映象到一个有限的、地址连续的地址集上 以关键字在地址集中的“象”作为相应记录在表中的存储位置以关键字在地址集中的“象”作为相应记录在表中的存储位置 如此构造所得的查找表称之为“哈希表”。如此构造所得的查找表称之为“哈希表”。

哈希函数均匀性哈希函数均匀性 哈希函数实现的一般是从一个大的集合(部分元素,空间位置哈希函数实现的一般是从一个大的集合(部分元素,空间位置

上一般不连续)到一个小的集合(空间连续)的映射上一般不连续)到一个小的集合(空间连续)的映射 一个好的哈希函数,对于记录中的任何关键字,将其映射到地一个好的哈希函数,对于记录中的任何关键字,将其映射到地址集合中任何一个地址的概率应该是相等的址集合中任何一个地址的概率应该是相等的

即关键字经过哈希函数得到一个“随机的地址”即关键字经过哈希函数得到一个“随机的地址”

Page 47: 数据结构 第九章查找

9-47 中国科大《数据结构》

9.4 哈希表

9.4.2 9.4.2 哈希函数哈希函数 要求要求

哈希函数应是简单的,能在较短的时间内计算出结果哈希函数应是简单的,能在较短的时间内计算出结果 哈希函数的定义域必须包括需要存储的全部关键字,如果散列哈希函数的定义域必须包括需要存储的全部关键字,如果散列

表允许有 表允许有 m m 个地址时,其值域必须在 个地址时,其值域必须在 0 0 到 到 m-1 m-1 之间 之间 散列函数计算出来的地址应能均匀分布在整个地址空间中散列函数计算出来的地址应能均匀分布在整个地址空间中

Page 48: 数据结构 第九章查找

9-48 中国科大《数据结构》

9.4 哈希表

哈希函数哈希函数 (( 直接定址法直接定址法 )) 直接定址法中,哈希函数取关键字的线性函数直接定址法中,哈希函数取关键字的线性函数 H(key) = a ×key + bH(key) = a ×key + b

 其中 其中 aa 和和 bb 为常数为常数 直接定址法举例直接定址法举例

H(key) = key - 2005131000H(key) = key - 2005131000

003003 20051310032005131003 朱嘉成朱嘉成 男男 网络学院网络学院

005005 20051310052005131005 陈乾陈乾 男男 网络学院网络学院

006006 20051310062005131006 桂许升桂许升 男男 网络学院网络学院

007007 20051310072005131007 罗杨洋罗杨洋 男男 网络学院网络学院

008008 20051310082005131008 叶建行叶建行 男男 网络学院网络学院

009009 20051310092005131009 曹亚仑曹亚仑 男男 网络学院网络学院

012012 20051310122005131012 欧东欧东 男男 网络学院网络学院

Page 49: 数据结构 第九章查找

9-49 中国科大《数据结构》

9.4 哈希表

直接定址法特性直接定址法特性 直接定址法仅适合于地址集合的大小与关键字集合的大小相等直接定址法仅适合于地址集合的大小与关键字集合的大小相等

的情况的情况 当当 a=1a=1 时,时, H(key)=keyH(key)=key ,即用关键字作地址,即用关键字作地址 在实际应用中能使用这种哈希函数的情况很少在实际应用中能使用这种哈希函数的情况很少

Page 50: 数据结构 第九章查找

9-50 中国科大《数据结构》

9.4 哈希表

哈希函数哈希函数 (( 数字分析法数字分析法 ))

假设关键字集合中的每个关键字都是由 假设关键字集合中的每个关键字都是由 s s 位数字组成 位数字组成 (u(u11, u, u22, ,

…, u…, uss))

分析关键字集中的全体分析关键字集中的全体

从中提取从中提取分布均匀分布均匀的若干位或它们的组合作为地址。的若干位或它们的组合作为地址。

Page 51: 数据结构 第九章查找

9-51 中国科大《数据结构》

9.4 哈希表

数字分析法举例数字分析法举例有有 8080 个记录,关键字为个记录,关键字为 88位十进制数,哈希地址为位十进制数,哈希地址为 22 位十进制数位十进制数

8 1 3 4 6 5 3 28 1 3 7 2 2 4 28 1 3 8 7 4 2 28 1 3 0 1 3 6 78 1 3 2 2 8 1 7 8 1 3 3 8 9 6 78 1 3 6 8 5 3 78 1 4 1 9 3 5 5

分析:只取 8 只取 1 只取 3、 4 只取 2、 7、 5 数字分布近乎随机所以:取任意两位或两位与另两位的叠加作哈希地址

Page 52: 数据结构 第九章查找

9-52 中国科大《数据结构》

9.4 哈希表

数字分析法特性数字分析法特性 数字分析法仅适用于事先明确知道表中所有关键码每一位数值数字分析法仅适用于事先明确知道表中所有关键码每一位数值

的分布情况的分布情况 数字分析法完全依赖于关键码集合。数字分析法完全依赖于关键码集合。 如果换一个关键码集合,选择哪几位要重新决定。如果换一个关键码集合,选择哪几位要重新决定。

Page 53: 数据结构 第九章查找

9-53 中国科大《数据结构》

9.4 哈希表

哈希函数哈希函数 (( 平方取中法平方取中法 ))以关键字的平方值的中间几位作为存储地址。以关键字的平方值的中间几位作为存储地址。

求“关键字的平方值” 的目的是“扩大差别” 求“关键字的平方值” 的目的是“扩大差别” 同时平方值的中间各位又能受到整个关键字中各位的影响。同时平方值的中间各位又能受到整个关键字中各位的影响。

Page 54: 数据结构 第九章查找

9-54 中国科大《数据结构》

9.4 哈希表

平方取中法举例平方取中法举例此方法在词典处理中使用十分广泛。它先计算构成关键码此方法在词典处理中使用十分广泛。它先计算构成关键码

的标识符的内码的平方的标识符的内码的平方 , , 然后按照散列表的大小取中间的若干位作然后按照散列表的大小取中间的若干位作为散列地址。为散列地址。

标识符的八进制内码表示及其平方值标识符的八进制内码表示及其平方值

标识符  标识符  内码内码              内码的平方 内码的平方   散列地址   散列地址AA 0101 0101 001 001AA11 01340134 2204204200 042 042BB 0202 44 004 004 DMAXDMAX 0415013004150130 2152621526443443617100617100 443 443DMAXDMAX1 1 04150130340415013034 52644752644735235221514202151420 352 352 AMAX AMAX 0115013001150130 135413542362361710017100 236 236AMAXAMAX1 1 01150130340115013034 34542434542465265221514202151420 652 652

Page 55: 数据结构 第九章查找

9-55 中国科大《数据结构》

9.4 哈希表

平方取中法特性平方取中法特性 平方取中法是较常用的构造哈希函数的方法平方取中法是较常用的构造哈希函数的方法 适合于关键字中的每一位都有某些数字重复出现且频度很高的适合于关键字中的每一位都有某些数字重复出现且频度很高的

情况情况 中间所取的位数,由哈希表长决定中间所取的位数,由哈希表长决定

Page 56: 数据结构 第九章查找

9-56 中国科大《数据结构》

9.4 哈希表

哈希函数哈希函数 (( 折叠法折叠法 ))将关键字分割成位数相同的若干部分将关键字分割成位数相同的若干部分 (( 最后部分的位数可最后部分的位数可

以不同以不同 )) ,然后取它们的叠加和,然后取它们的叠加和 ((舍去进位舍去进位 )) 为哈希地址。为哈希地址。 移位叠加移位叠加 ::将分割后的几部分低位对齐相加将分割后的几部分低位对齐相加 间界叠加间界叠加 ::从一端沿分割界来回折送,然后对齐相加从一端沿分割界来回折送,然后对齐相加

Page 57: 数据结构 第九章查找

9-57 中国科大《数据结构》

9.4 哈希表

折叠法举例:关键字为:折叠法举例:关键字为: 04422058640442205864,哈希地址位数为,哈希地址位数为 44

折叠法特性折叠法特性折叠法适合于关键字的数字位数特别多,而且每一位上数折叠法适合于关键字的数字位数特别多,而且每一位上数

字分布大致均匀的情况字分布大致均匀的情况

5 8 6 44 2 2 0

0 41 0 0 8 8

H(key)=0088

移位叠加

5 8 6 40 2 2 4

0 4 6 0 9 2

H(key)=6092

间界叠加

Page 58: 数据结构 第九章查找

9-58 中国科大《数据结构》

9.4 哈希表

哈希函数哈希函数 (( 除留余数法除留余数法 ))取关键字被某个不大于哈希表长取关键字被某个不大于哈希表长 mm 的数的数 pp除后所得余数为哈希地址除后所得余数为哈希地址

H(key) = key MOD p ( p≤m )H(key) = key MOD p ( p≤m ) mm 为表长 为表长 pp为不大于为不大于 mm 的素数或是不含的素数或是不含 2020 以下的质因子以下的质因子

哈希函数哈希函数 (( 除留余数法-除留余数法- pp值值 ))给定一组关键字为给定一组关键字为 : 12,39,18,24,33,21: 12,39,18,24,33,21 ,若取 ,若取 p=9, p=9, 则他们对则他们对

应的哈希函数值将为应的哈希函数值将为 : : 3, 3, 0, 6, 6, 33, 3, 0, 6, 6, 3

可见,若可见,若 pp中含质因子中含质因子 3, 3, 则所有含质因子则所有含质因子 33的关键字均映射到的关键字均映射到““ 3 3 的倍数”的地址上,从而增加了“冲突”的可能的倍数”的地址上,从而增加了“冲突”的可能

除留余数法特性除留余数法特性 除留余数法是一种最简单、最常用的构造哈希函数的方法除留余数法是一种最简单、最常用的构造哈希函数的方法 可以对关键字直接取模可以对关键字直接取模 (MOD)(MOD) ,也可在折叠、平方取中等运算之后取,也可在折叠、平方取中等运算之后取模。模。

Page 59: 数据结构 第九章查找

9-59 中国科大《数据结构》

9.4 哈希表

9.4.3 9.4.3 处理冲突法处理冲突法““ 处理冲突” 的实际含义是:为产生冲突的地址寻找下一处理冲突” 的实际含义是:为产生冲突的地址寻找下一

个哈希地址。处理冲突的方法主要有三种:个哈希地址。处理冲突的方法主要有三种:1.1. 开放定址法开放定址法2.2. 再哈希法再哈希法3.3. 链地址法链地址法

Page 60: 数据结构 第九章查找

9-60 中国科大《数据结构》

9.4 哈希表

处理冲突的方法处理冲突的方法 (( 开放定址法开放定址法 ))

为产生冲突的地址 为产生冲突的地址 H(key) H(key) 求得一个空的地址序列求得一个空的地址序列:: HH00, H, H

11, H, H22, …, H, …, Hss ,, 1≤s≤m-11≤s≤m-1

HHii = [H(key)+d = [H(key)+dii] MOD m ( i=1,2,…,s )] MOD m ( i=1,2,…,s )

H(key)H(key) 为哈希函数为哈希函数 mm 为哈希表长为哈希表长

当当 ddii 取取 1,2,3,…,m-11,2,3,…,m-1 时,称这种开放定址法为时,称这种开放定址法为线性探测再散列。线性探测再散列。

Page 61: 数据结构 第九章查找

9-61 中国科大《数据结构》

举例:在长度为举例:在长度为 1111 的哈希表中已填有关键字分别为的哈希表中已填有关键字分别为 1717,, 6060 和和 2929的记录(哈希函数的记录(哈希函数 H(key)H(key)= = key MOD 11key MOD 11 ),现有第四个记录,),现有第四个记录,其关键字为其关键字为 3838,由哈希函数得到的哈希地址为,由哈希函数得到的哈希地址为 55,产生冲突。,产生冲突。 线性探测再散列:得到下一个地址线性探测再散列:得到下一个地址 66 ,仍冲突;再求下一个地,仍冲突;再求下一个地址址 77,仍冲突;直到哈希地址为,仍冲突;直到哈希地址为 88的位置(“空”)时止。的位置(“空”)时止。

二次探测再散列:应填入序号为二次探测再散列:应填入序号为 44的位置。的位置。 伪随机探测再散列:伪随机数列伪随机探测再散列:伪随机数列 9, … 9, … 应填入序号为应填入序号为 22 的位置。的位置。

9.4 哈希表

Page 62: 数据结构 第九章查找

9-62 中国科大《数据结构》

9.4 哈希表

0 1 2 3 4 5 6 7 8 9 60 17 29

(a) 插入前

60 17 29 38

(b) 线性探测再散列

38 60 17 29

(c) 二次探测再散列

60 17 29 38

(d) 伪随机探测再散列

用开放定址处理冲突时,关键字为 38的记录插入前后的哈希表

Page 63: 数据结构 第九章查找

9-63 中国科大《数据结构》

9.4 哈希表

处理冲突的方法处理冲突的方法 ((再哈希法再哈希法 ))HHii = RH = RHii (key) (key) ( i = 1, 2, … , k ) ( i = 1, 2, … , k )

其中,其中, RR、、 HHii 均是不同的哈希函数,即在同义词产生地址冲突时计算均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生。另一个哈希函数地址,直到冲突不再发生。

再哈希法特点:不易产生聚集,但增加计算时间再哈希法特点:不易产生聚集,但增加计算时间

处理冲突的方法处理冲突的方法 (( 链地址法链地址法 ))将所有关键字为同义词的记录存储在同一线性链表中。假设某哈将所有关键字为同义词的记录存储在同一线性链表中。假设某哈

希函数产生的哈希地址区间希函数产生的哈希地址区间 [0, m[0, m-- 1]1] 上,则设立一个指针型向量:上,则设立一个指针型向量:Chain Chain Hash[m];Chain Chain Hash[m];

其每个分裂的初始状态都是空指针。凡哈希地址为其每个分裂的初始状态都是空指针。凡哈希地址为 ii 的记录都插入到头指的记录都插入到头指针为针为 Chain Hash[m]Chain Hash[m] 的链表中。在链表中的插入位置可以在表头或表尾,的链表中。在链表中的插入位置可以在表头或表尾,也可以在中间,以保持同义词在同一线性链表中按关键字有序。也可以在中间,以保持同义词在同一线性链表中按关键字有序。

Page 64: 数据结构 第九章查找

9-64 中国科大《数据结构》

9.4 哈希表

举例:给定关键字集合举例:给定关键字集合 {1{19,01,23,14,55,68, 11,89,01,23,14,55,68, 11,82,36}2,36},设定哈希函数,设定哈希函数 HH(key)=key MOD 11 ((key)=key MOD 11 ( 表表长长 =11)[=11)[ 表后插入表后插入 ]]

查找不成功,再插入新结查找不成功,再插入新结点时,用表后插入方法较点时,用表后插入方法较好好

0123456789

10

19 ^

01

14

55

68 ^

11 ^

82 ^

36 ^

23 ^

Page 65: 数据结构 第九章查找

9-65 中国科大《数据结构》

9.4 哈希表

举例:给定关键字集合举例:给定关键字集合 {1{19,01,23,14,55,68, 11,82,9,01,23,14,55,68, 11,82,36}36} ,,设定哈希函数设定哈希函数 H(keH(key)=key MOD 11 y)=key MOD 11 (( 表长表长 =1=11)[1)[ 表头插入表头插入 ]]

给定关键字集合,逐步生给定关键字集合,逐步生成哈希表时,用表头插入成哈希表时,用表头插入方法较好方法较好

0123456789

10

19 ^

23

36

11

68 ^

55 ^

82 ^

14 ^

01 ^

Page 66: 数据结构 第九章查找

9-66 中国科大《数据结构》

9.4 哈希表

9.4.4 9.4.4 哈希表的实现哈希表的实现假设哈希函数为关键字求模运算,哈希表用拉链法解决冲假设哈希函数为关键字求模运算,哈希表用拉链法解决冲

突,其结构可以定义如下:突,其结构可以定义如下:

#define LEN 31 // 表长 LEN 最好为质数typedef struct node {

int data; struct node *next;

} node;struct node HashTab[LEN];

Page 67: 数据结构 第九章查找

9-67 中国科大《数据结构》

9.4 哈希表

哈希表的实现-哈希函数哈希表的实现-哈希函数 hash()hash()返回值为哈希表地址返回值为哈希表地址 ::

查找过程查找过程 对于给定值对于给定值 keykey ,计算哈希地,计算哈希地址 址 p=hash(Key)p=hash(Key)

若若 HashTab[p].next=NULLHashTab[p].next=NULL ,,则查找不成功则查找不成功

若若 HashTab[p].next.data = keHashTab[p].next.data = keyy ,则查找成功,则查找成功

否则 “求下一地址”,再进行否则 “求下一地址”,再进行比较比较

int hash(int key) {

retAddr = key MOD LEN;

return(retAddr);

}

给定 k值

计算 hash(key)

此地址为空

关键字 ==key

查找失败返回或插入新结点

查找成功

按处理冲突方法计算下一地址

Y

N

Y

N

Page 68: 数据结构 第九章查找

9-68 中国科大《数据结构》

9.4 哈希表

查找函数查找函数 search()search()若找到若找到 keykey ,返回其结点指针;否则将其插入表中再返回,返回其结点指针;否则将其插入表中再返回

其结点指针其结点指针 [[ 链地址法解决冲突,表头插入链地址法解决冲突,表头插入 ]]

node *search(int key) {i = hash(key);p = HashTab[i].next;while (p != NULL)) {

if (p.data == key) return(p);p = p.next;}

q = malloc(sizeof(node)); // 表头插入q.data = key; q.next = HashTab[i].next;HashTab[i].next = q; return(q);

}

Page 69: 数据结构 第九章查找

9-69 中国科大《数据结构》

9.4 哈希表

9.4.59.4.5 哈希哈希查找的性能分析查找的性能分析哈希查找按理论分析,它的时间复杂度应为哈希查找按理论分析,它的时间复杂度应为 O(1)O(1) ,它的平,它的平

均查找长度应为均查找长度应为 ASL=1ASL=1 ,但实际上由于冲突的存在,它的平均查,但实际上由于冲突的存在,它的平均查找长度将会比找长度将会比 11 大。下面将分析几种方法的平均查找长度。大。下面将分析几种方法的平均查找长度。

线性探查法的性能分析线性探查法的性能分析由于线性探查法解决冲突是线性地查找空闲位置的,平均由于线性探查法解决冲突是线性地查找空闲位置的,平均

查找长度与表的大小查找长度与表的大小 mm 无关,只与所选取的散列函数无关,只与所选取的散列函数 HH 及装填因及装填因子子 αα 的值和该处理方法有关,这时的成功的平均查找长度为的值和该处理方法有关,这时的成功的平均查找长度为 ASL=ASL=1/2 (1+1/(1- α)) 1/2 (1+1/(1- α)) 。。

链地址法的性能分析链地址法的性能分析由于拉链法查找就是在单链表上查找,查找单链表中第一由于拉链法查找就是在单链表上查找,查找单链表中第一

个结点的次数为个结点的次数为 11 ,第二个结点次数为,第二个结点次数为 22 ,其余依次类推。它的平,其余依次类推。它的平均查找长度均查找长度 ASL=1+α/2ASL=1+α/2 。。

Page 70: 数据结构 第九章查找

9-70 中国科大《数据结构》

9.4 哈希表

哈希查找的性能分析哈希查找的性能分析 (( 平均查找长度平均查找长度 ASL)ASL) 线性探测再散列的哈希表查找成功时:线性探测再散列的哈希表查找成功时:

ASL ≈ (½)(1 + 1/(1-α))ASL ≈ (½)(1 + 1/(1-α))

二次探测再散列的哈希表查找成功时:二次探测再散列的哈希表查找成功时:ASL ≈ -(1/α)ln(1-α)ASL ≈ -(1/α)ln(1-α)

链地址法处理冲突的哈希表查找成功时:链地址法处理冲突的哈希表查找成功时:ASL ≈ (1 + α/2)ASL ≈ (1 + α/2)

Page 71: 数据结构 第九章查找

9-71 中国科大《数据结构》

习题

本章习题参见教师网页:本章习题参见教师网页:http://staff.ustc.edu.cn/~leeyihttp://staff.ustc.edu.cn/~leeyi