第九章和第十章介绍数据处理中常用的两种操作:查找和排序。...

111
第第第第第第第第第第第第第第第第第第第第第 第第第第第第 :。 第第第第第第第第第第第第第第第第第第 第第 第第第第第第 Word 第第第第第第第第 第第第 第第 第第第 第第第第第第第第 第第第第第第第第第第第第第第第第 、、,,。 第第第第第第第第第第第第第 第第第第第第 第第第第第第第第第第第第 ,, 第第 第第第第第第 第第第第第第第第第第 ,,。 第第 第第第第第第第第第第第第第第第 第第第第第 第第第第第第第第 ,、, 第第

Upload: unity-bonner

Post on 13-Mar-2016

164 views

Category:

Documents


5 download

DESCRIPTION

第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word , 各种信息管理软件。 线性表、树、图等,都可以根据需要,将查找或排序作为它们的基本操作。 由于查找和排序操作应用面广,使用频率高,所以对查找和排序的算法的质量,如时间效率,空间效率要求比较高。 这里,讨论应用中常用的几种查找方法、排序方法,它们的特点及适用场合。. 第 9 章 查找. 9.0 概述 9.1 静态查找表 9.2 动态查找表 9.3 哈希表 习题. 9.0 概 述. 一、查找表的定义 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

第九章和第十章介绍数据处理中常用的两种操作:查找和排序。• 许多软件都为用户提供了查找和排序功能。

例如:文本编辑软件 Word , 各种信息管理软件。• 线性表、树、图等,都可以根据需要,将查找或排序作为它们的基本操作。

由于查找和排序操作应用面广,使用频率高,所以对查找和排序的算法的质量,如时间效率,空间效率要求比较高。这里,讨论应用中常用的几种查找方法、排序方法,它们的特点及适用场合。

Page 2: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

第 9 章 查找 9.0 概述

9.1 静态查找表9.2 动态查找表9.3 哈希表

习题

Page 3: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

9.0 概 述一、查找表的定义

• 1. 查找表:由同一类型数据元素(或记录)构成的集合。在查找表中数据元素除了同属一个集合,不考虑元素之间其它关系

• 2 查找表基本操作1 ) 构造查找表 Create(&ST,n)2 ) 销毁查找表 Destroy(&ST)3 ) 各种查找操作

Page 4: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

二、查找的有关概念1. 静态查找表、动态查找表• 查找表最基本的操作是查找,常用的查找操作:

1 )查询某个“特定”元素是否在表中;2 )检索某个“特定”元素的各种属性;3 )查找某个“特定”元素是否在表中,若不在,则将该元素插入表中;4 )从查找表中删除某个“特定”元素;

• 静态查找表:若对查找表只有 1 )、 2 )两种操作• 动态查找表:若对查找表还提供 3 )、 4 )两种操作

Page 5: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

学号 姓名 专业 年龄 01 王洪 计算机 17 02 孙文 计算机 18 03 谢军 计算机 18 04 李辉 计算机 20 05 沈祥福 计算机 25 06 余斌 计算机 19 07 巩力 计算机 17 08 王辉 计算机 18

2. 记录、关键字• 记录:由若干数据项构成的数据元素。• 关键字:数据元素(或记录)中某个数据项,用它可以标识一个数据元素(或记录) 。

例:学生管理系统,若想按姓名查找,可将姓名作为关键字,若想按学号查找,可将学号作为关键字,

Page 6: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

说明:• ① 记录的任何数据项都可用作关键字;• ② 若此关键字的值能唯一标识记录,则称该关键字为主关键字,否则次关键字;

例:学号是主关键字,姓名是次关键字

Page 7: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

3. 查找• 查找:给定某个值,在查找表中查找关键字值等于给定值的记录。

若表中存在这样的记录,则称查找成功,查找结果为该记录(在表中)的位置;否则,称查找不成功,查找结果为 0 或 nu11 。

Page 8: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

4. 平均查找长度• 查找算法的效率用平均查找长度衡量(设查找不成功的可能性很小,可忽略不计)• 平均查找长度 ASL = 在查找过程中与给定值比较的关键字个数的数学期望值

PiCi– Ci 为在查找表中查找第 i 个记录所需的比较次数,– Pi 为在查找表中查找第 i 个记录的概率– i=1,2…n

Page 9: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

三、查找表的组织与查找 如何在查找表中查找?取决于如何组织查找表

• 例 1 : 查找索引号为 TP312.12 的图书 1 )若图书馆中的图书无序地摆放,则只能顺序查找; 2 )若图书按索引号顺序摆放,则可先找到 TP 类图书,再找到

TP3 。• 例 2 在词典中查找单词 are

1 )若词典中无序排列,则只能顺序查找。 2 )先找到 a 打头的单词,再在 a 打头的单词中找。

本章介绍:• 静态查找表的组织方法与查找• 动态查找表的组织方法与查找• 哈希表的组织方法与查找

Page 10: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

约定:• 1 )本章查找是关于主关键字查找;• 2 )假设本章涉及的关键字为整型类型;• 3 )为使查找的图示简洁,对于查找表中的每一记录,只写出其关键字。

typedef struct{ KeyType key; // 关键字域 … // 其它域 }ElemType;

typedef int KeyType;

关键字类型定义 记录类型定义

Page 11: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

两关键字比较的宏定义 #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)< (b)) #define LQ(a,b) ((a)<=(b))

Page 12: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

9.1 静态查找表静态查找表:只提供如下两种查找的查找表。

• 1 ) 查询某个“特定”元素是否在表中;• 2 ) 检索某个“特定”元素的各种属性;

对静态查找表介绍两种组织与查找方法• 顺序表及查找• 有序表及查找

Page 13: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

9.1.1 顺序表及查找查找表组织:

• 查找表用线性表表示。即将查找表的记录排成一个记录序列。L1=(45,53,12,3,37,24,100,61,90,78)

设查找表用顺序表存储,其类型定义如下:Tyypedef struct { ElemType *elem; int length;}SSTable ;

Page 14: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

顺序查找法• 1 )基本思想:从表的最后一个记录(或第一个记录)开始,依次将记录的关键字与给定值比较,若相等,查找成功,否则,继续查找。

Page 15: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

2) 算法int Search_Seq(SSTable ST, KeyType key){ // 在顺序表 ST 中顺序查找其关键字等于 key 的数据元素。 // 若找到,则函数值为该元素在表中的位置,否则为

0 。 ST.elem[0].key=key; // ST.elem[0].key 为“哨兵” for(i=ST.length; !EQ(ST. elem[i]. Key, key); - -i) ;

// 从后向前找 return i; // 若表中不存在待查元素, i=0}//Search_Seq

elemlength

key 012...length-1length

Page 16: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

比较:算法 2.6(P25)

int Location( SqList L, ElemType e,Status (*compare)(ElemType, ElemType)) {

// 在顺序表 L 中查找第 1 个值与 e满足 compare( )// 的元素的位序

k = 1;p = L.elem;while ( k<=L.length && !(*compare)(*p++,e)))

k++; if ( k<= L.length) return k; else return 0;

} //Location

Page 17: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

3) 说明:• 1 )算法简单;• 2 )顺序查找法对于查找表的存储结构没有特别的要求,既可用顺序表,也可用线性链表存储;• 3) 平均查找长度 ASLSS= ( n+1 ) /2

取 Pi=1/n

ASL = Pi Ci = nP1+(n-1)P2+...+2Pn-1+Pn

= [n+(n-1) +...+2+1]*1/n = (n+1)/2

若查找成功与不成功的概率相同,则:ASL = (n+1)/4+(n+1) /2= 3(n+1)/4

Page 18: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

9.1.2 有序表及查找有序表

• 线性表中的记录按关键字有序查找表组织

• 查找表用有序表表示。即将查找表的记录排成按关键字有序的序列。

Page 19: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

二分查找法(也称为折半查找法)• 1 )基本思想:将查找范围中间位置的记录关键字与给定值比较,若< :继续在前半个表中用二分查找法查找= : 查找成功,返回记录位置> :继续在后半个表中中用二分查找法查找

Page 20: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

1 2 3 4 5 6 7 8 9 10 3 12 24 37 45 53 61 78 90 100

low mid high

1 2 3 4 5 6 7 8 9 10 3 12 24 37 45 53 61 78 90 100

low mid high

24 < 45 继续在前半个表中用二分查找法查找

1 2 3 4 5 6 7 8 9 10 3 12 24 37 45 53 61 78 90 100

Low mid high

24 > 12 继续在后半个表中用二分查找法查找

例 1. L2=( 3,12,24,37,45,53,61,78,90,100 ) ,查找 Key=24 的记录

Page 21: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

2) 算法int Search_Bin(SSTable ST, KeyType key){// 在有序表 ST 中折半查找其关键字等于 key 的数据元素。// 若找到,则函数值为该元素在表中的位置,否则为 0 。 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

Page 22: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

平均查找长度: ASL = PiCi = ( 1+22+34+43 ) /10=2.9

5

4

3 1 6

7

9

8 2

10

二分查找法查找过程可用判定树描述 1 2 3 4 5 6 7 8 9 10

• 例: L2=( 3,12,24,37,45,53,61,78,90,100 ) ,查找过程可用如下判定树描述。查找次数 = 结点所在的层数。查找成功时查找次数不会超过判定树的深度。n 个结点的判定树的深度为 [log2n]+1.

Page 23: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

折半搜索性能分析折半查找法的平均查找长度

• 假设描述折半查找法的判定树高度为 h 的满二叉树 (n = 2h-1) ,则第 j层的结点个数为 2j-1(j=1,…,h)ASL = PiCi

= 1/n j * 2j-1

=(n+1)/n *log(n+1)-1

≈ log(n+1)-1

(证明见书上 P221 )

5

4

3 1 6

7

9

8 2

10

Page 24: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

3 )说明• 折半查找法效率比顺序查找高 ; 平均查找长度

ASLbs=log2 ( n+1 ) -1• 要求表中的记录按关键字有序;• 表中的记录要用顺序结构存储;

例:在有 1000 个记录的查找表查找• 顺序查找法平均要比较 500 次• 折半查找法平均要比较 9 次

可见折半查找法效率比顺序查找高。

Page 25: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

插值查找如果事先已经知道数据的分布情况,就可以充分利用数据的分布情况提高搜索的性能。基本思路

• 根据待查找数据的取值预估其在数据结构中的位置与折半查找的主要差别

• 中点的计算考虑了检索数据的取值和数据的分布假设数据是均匀分布 , 根据插值公式计算中值,

mid= low+(key-ST. elem [low])/(ST. elem[high]-ST. elem [low]) *(high-low)

Page 26: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

设有一个有序的线性表 {0, 1, 2, 3, 4, 5, 6, 7,8, 9, 10, 11} ,需要搜索关键字为 8 的数据。

插值查找• 由于 8 在 0-11 的区间中的位置是 66.6% ,首先和线性表中位于 66.6% 位置的数据进行比较。• Mid=1+ (8-0)/(11-0)*(12-1) =9• 因此通过 1 次比较就能找到最终的结果。

折半查找• 第 1 次: mid=(1+12)/2=6 关键字为 5• 第 2 次: mid=(7+12)/2=9 查找成功

Page 27: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

斐波那契查找问题提出

• 插值搜索的前提是数据在线性表中分布比较均匀,但在很多情况下数据的分布是不均匀的,而且其分布也是事先未知的。• 为了追求更好的平均性能,斐波那契搜索是一个很好的选择,根据斐波那契数列进行分割。

斐波那契数列的定义是:• F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2) , n>=2

优点:• 在大部分的数据分布的情况下具有比较好的性能。• 只须做加、减法运算而无须做乘除法运算

Page 28: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

长度为 n=F(u) -1 的搜索空间, 其比较的中点是• mid=low+F(u-1)-1• 如果 key=ST.elem[mid] ,查找成功;• 如果 key<ST.elem[mid] ,则 high=mid-1 , u=u-1 ;• 如果 key>ST.elem[mid] ,则 low=mid+1 , u=u-2.

low … mid … high

F(u)-1

F(u-1)-1 F(u-2)-1

Page 29: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

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

• 图书馆经常购进图书,每购进新书,需将新书记录插入图书表对这类表除了提供 1 )、 2 )两种查找外,还要提供动态查找功能:

• 3 )查找某个“特定”元素是否在表中,若不在,则将该元素插入表中;• 4 )查找某个“特定”元素是否在表中,若在,从表中删除该元素;

Page 30: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

如何组织动态查找表?• 顺序表:

顺序查找效率低• 有序表:

二分查找法须用顺序结构存储有序表,插入删除操作要移动元素;本节介绍动态查找表的一种组织形式

• 二叉排序树

Page 31: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

9.3.1 二叉排序树1. 二叉排序树的概念

• 二叉排序树( Binary Sort Tree )或者是一棵空树;或者是具有下列性质的二叉树:( 1 )若左子树不空,则左子树上所有结点的值均小于它的根结点的值;( 2 )若右子树不空,则右子树上所有结点的值均大于它的根结点的值;( 3 )左、右子树也分别为二叉排序树;

45 53

100

61 90

78

12 3 37

24

二叉排序树

其中序遍历序列 :

3,12,24,37,45,53,61,78,90,100

Page 32: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

2. 二叉排序树的查找基本思想• 若二叉排序树为空树,查找失败,返回 null 或 0 ;• 否则,将 key 与根结点的关键字比较:

若 key = 根结点的关键字 , 查找成功,返回该记录在二叉排序树中的位置;若 key 根结点的关键字,继续在左子树中查找;若 key 根结点的关键字,继续在右子树中查找;

Page 33: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

45 53

100

61 90

78

12 3 37

24

2445 继续在左子树中查找 2412 继续在右子树中查找

2437 继续在左子树中查找

例:在如下二叉排序树中查找关键字为 24 的记录

查找成功!

Page 34: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

45 53

100

61 90

78

12 3 37

24

查找失败!

查找路径

左子树为空

例:在如下二叉排序树中查找关键字为 60 的记录

Page 35: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

算法BiTree SearchBST(BiTree T, KeyType key) {// 二叉排序树用二叉链表存储。// 在根指针 T 所指二叉排序树中递归地查找关键字等于 key 的记录,// 若查找成功,则返回该记录结点的指针,否则返回空指针 if ((!T)|| EQ(key, T->data. key)) return(T);

// 若 T 为空或查找成功,返回 else if LT(key, T->data. key) return(SearchBST(T->1child, key)); // 在左子树中继续查找 else

return(SearchBST(T->rchild, key)); // 在右子树中继续查找}//SearchBST 算法 9.5(a)

Page 36: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

3. 二叉排序树的插入、删除• 在一般二叉树的基本操作中只有插入、删除子树操作,没有插入、删除结点操作。

原因是除了叶子结点外,在二叉树中插入、删除结点将破坏树的结构。• 在二叉排序树中插入、删除结点的原则是:

插入、删除结点后仍是二叉排序树。

Page 37: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

1 )二叉排序树的插入• 新插入的结点一定为叶子结点,并且是查找不成功时,查找路径上最后一个结点的左孩子或右孩子。

将新结点插入二叉排序树基本步骤:• 从二叉排序树的根结点开始,• 若二叉排序树为空树,新插入结点作为根结点,• 否则,

若新结点的关键字当前结点的关键字,则将新结点作为当前结点的左孩子;若新结点的关键字 >当前结点的关键字,则作为右孩子。

Page 38: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

例:在如下二叉排序树中插入结点 40

45 53

100

61 90

78

12

3 37

24 40

为查找插入位置走过的路径

插入结点40!

Page 39: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

算法Status SearchBST(BiTree T, KeyType key, BiTree f, BiTree &p) {// 在二叉排序树中递归地查找关键字等于 key 的记录,// 若查找成功,则指针 p 该记录结点,否则 p指向最后访问的结点//f指向 T 的双亲,初值为 NULL if (!T) {p=f, return FALSE}; // 查找不成功 else if EQ(key, T->data. key){p=T; return TRUE;} // 查找成功 else if LT(key, T->data. key) return(SearchBST(T->1child, key, T, p)); // 在左子树中查找 else return(SearchBST(T->rchild, key , T, p)); // 在右子树中查找}//SearchBST

算法 9.5(b)

Page 40: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

Status InsertBST(BiTree T, ElemType e) {// 二叉排序树不存在关键字等于 e.key 时,插入 e并返回

TRUEif (! SearchBST(T, e.key, NULL, p) ) {

s=(BiTree)malloc(sizeof(BiTNode));s->data=e; s->lchild=s->rchild=NULL;if(!p)T=s; // 根结点else if LT(e.key,p->data.key)p->lchild=s; //左孩子else p->rchild=s; //右孩子return TRUE;}//if

else return FALSE;}//InsertBST

算法 9.6

Page 41: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

例如 : 对 {45,24,53,45,12,24,90}关键字序列的二叉排序树生成过程如下 :

45

24

12

53

45

24

12

53

90

45

24 53

45

24

45

Page 42: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

2 )二叉排序树的删除• 在二叉排序树中删除结点的原则是:

删除结点后仍是二叉排序树。• 对二叉排序树进行中序遍历,所得到的中序序列是一有序序列。

在二叉排序树中删除一个结点相当于在有序序列删除一个结点,只要删除结点后仍保持二叉排序树的特性。

Page 43: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

• 设: P 为 F 的右孩子被删除结点是 P (p 是指向 P 的指针)其双亲结点为 F (f 是指向 F 的指针 )

分三种情况讨论: • ( 1 ) P 为叶子结点,则直接删除,即将 f-

>rchild 赋值为 null ;

Fff

F Pp

F P

PRPL

f

p

P 为叶子结点删除前

二叉排序树删除后

Page 44: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

• ( 2 ) P 只有一棵子树(左子树 PL 或右子树 PR ) ,则令 PL 或 PR直接成为双亲结点 F 的右子树;

F P

PL

f

p FPL

f

P 只有左子树 PL

删除前 删除后

Page 45: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

• ( 3 ) P 有两棵子树(左子树 PL 和右子树 PR )设 S 是 P 的直接前驱,则 S 是 P 的左子树的最右下结点。在删除 P后 , 为保持中序序列中其它元素之间的相对位置不变,可有两种作法:

– (a)令 P 的左子树为 F 的右子树,而 P 的右子树为 S 的右子树;– (b) 用 P 的直接前趋 S代替 P ,然后从二叉排序树删除 P直接前趋 S ;

F

C P

PR

CL

SL

Q SQL

C

PR

CL

SL

Q SQL

F F

C S

PR

CL QQL SL

(a) (b)删除 P前的二叉排序树

Page 46: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

性能分析二叉排序树的查找效率与树的形态有关

• 若树的形态为“单枝”,二叉排序树的查找就“退化”为顺序查找;• 若树的形态比较“平衡”,二叉排序树的查找与二分查找类似;

61

90100

53

45 78 12 3

37 24 45

53

100

61

90 78

12 3

37 24

为获得较高的查找效率,需要构造“平衡”的二叉排序树。

Page 47: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

4. 平衡二叉树 (Balanced Binary Tree)

平衡二叉树 , 也称 AVL 树 (Adelson-Velsky-Landis)

• 或者是空树• 或者它的左子树和右子树也都是平衡二叉树

平衡因子 BF(Balance Factor)• 左子树的深度减去右子树的深度• 只可能是 -1, 0, 1

左子树和右子树的深度之差的绝对值不超过 1

平衡二叉树的深度为 O(log N) ,平均查找长度也是 O(log N)

Page 48: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

结点的平衡因子平衡二叉树

不平衡二叉树

-1

1

0 0

-1

1

0

1

1

0

0

-1

0

0 0

-2

1

0

2-1

0 1

0

0

Page 49: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

平衡化旋转如果在一棵平衡的二叉搜索树中插入一个新结点,造成了不平衡。此时必须调整树的结构,使之平衡化。平衡化旋转有两类:

• 单旋转 (左旋和右旋 )• 双旋转 (左平衡和右平衡 )

Page 50: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

具体做法• 从插入位置向根回溯,检查各结点的平衡因子。• 从发生不平衡的结点起,沿刚才回溯的路径取直接下两层的结点。

如果这三个结点处于一条直线上• 采用单旋转进行平衡化(左单旋转和右单旋转)

如果这三个结点处于一条折线上• 采用双旋转进行平衡化(先左后右和先右后左)

右单旋转 左单旋转 左右双旋转 右左双旋转

Page 51: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

平衡化旋转LL 型 (左左型 )

• 若在 C 的左孩子 B上插入一个左孩子结点 A• C 的平衡因子由 1变成了 2

平衡处理:右单旋转• 将 C 顺时针旋转,成为 B 的右子树,而原来 B 的右子树则变成 C 的左子树,新插入结点 A 作为 B的左子树

C

B

A

2

1

0C

B

A0

0

0

NewTree = Tree->lchild;Tree->lchild = NewTree->rchild ;NewTree->rchild= Tree;

NewTree

Tree

Page 52: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

平衡化旋转LR 型 (左右型 )

• 在 C 的左孩子 A上插入一个右孩子 B• 使的 C 的平衡因子由 1变成了 2

平衡处理:先左后右旋转• 将 B变到 A 与 C 之间,使之成为 LL 型,然后按

LL 型处理。C

B

A

2

1

0 C

B

A0

0

0

C

B

A

2

-1

0

Page 53: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

平衡化旋转RR 型 (右右型 )

• 在 A 的右孩子 B上扦入一个右孩子 C• 使 A 的平衡因子由 -1变成 -2

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

C

B

A

-2

-1

0 A

B

C0

0

0

NewTree = Tree->rchild;Tree->rchild = NewTree->lchild; NewTree->lchild = Tree;

NewTree

Tree

Page 54: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

平衡化旋转RL 型的处理 (右左型 )

• 在 A 的右孩子 C上插入一个左孩子 B• 使 A 的平衡因子由 -1变成 -2

平衡处理:先右后左• 将 B变到 A 与 C 之间,使之成为 RR 型,然后按

RR 型处理。A

B

C

-2

-1

0 C

B

A0

0

0

A

C

B

-2

1

0

Page 55: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

例:给定一个关键字序列 4,5,7,2 ,1,3,6 ,试生成一棵平衡二叉树。

40

a) 插入 4

4-1

b) 插入 5

50

c) 插入 7

4-2

5-1

70 4050

7 0RR

40

51

7 0

d) 插入 2

2

1 41

52

7 02

2

e) 插入 110 4

0

50

7 020

1 0

LL

Page 56: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

关键字序列 4,5,7,2 ,1,3,6

40

52

702

-1

1 1

f) 插入 3

30

LR

30

40

5-120

10

70

30

4-1

5-2

20

10

71

f) 插入 6

06

RL

30

40

60

20

10

70

50

Page 57: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

9.3.2 B 树和 B+ 树二叉查找树( Binary Search Tree )

• 查找的时间复杂度 O(log2N) ,与树的深度相关• 降低树的深度自然会提高查找效率

实际问题• 大规模数据存储中,由于二叉查找树的深度过大而造成磁盘 I/O读写过于频繁,导致查询效率低下• 减少树的深度的基本想法:采用多叉树结构

B 树 (Balanced Tree) • 为了磁盘或其它存储设备而设计的一种多叉平衡查找树。

Page 58: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

一棵m阶的 B- 树,或为空树,或满足下列条件:• ⑴ 树中每个结点至多有 m 个孩子( m>=2 );• ⑵ 除根结点和叶子结点外,其它每个结点至少有m/2 个孩子;• ⑶ 若根结点不是叶子结点,则至少有 2 个孩子;• (4)拥有 k 个孩子的非终端结点包含有 k-1 个关键字;• (5) 所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息 。

Page 59: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

B 树的结点结构• 一个包含 j 个关键字, j+1 个指针的结点的一般形式:

• 其中, Ki 是关键字值, K1<K2<…<Kj ,• Pi 是指向子树的根结点,该子树结点的关键字都在

Ki 到 Ki+1 之间。

P0, K1, P1, K2, P2, …, Pj-1, Kj, Pj

Page 60: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

孩子结点个数应满足 [ m/2 , m ]• m=3 ,孩子个数可为 2 和 3 ,关键字个数可为 1 和

2

18 33

12 23 30 48

24 20 21 31 10 15 45 47 50 52

一棵 3阶 B 树(2-3 树 )

Page 61: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

B- 树结构的 C语言描述如下 :#define m 3 // B 树的阶,暂设为 3typedef struct BTNode {

int keynum; // 结点中关键字个数struct BTNode *parent; // 指向双亲结点的指针KeyType key[m+1]; // 关键字( 0 号单元不用)struct BTNode *ptr[m+1]; // 子树指针向量Record *recptr[m+1]; // 记录指针向量

} BTNode, *BTree; // B 树结点和 B 树的类型

Page 62: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

(18,a1) (33,a2)

(10,a7) (15,a8) (20,a9) (21,a10) (24,a11) (31,a12) (45,a13)(47,a14) (50,a5) (52,a16)

(12,a3) (23,a4) (30,a5) (48,a6)

关键字 文件页内地址

主文件

Page 63: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

B 树的查找交替的两步过程• 1. 在 B 树中找结点 ——外存中• 2. 在结点中找关键字 ——内存中• 如果 pi指向外部空结点,表示检索失败。

B- 树的查找时间主要花费在搜索结点上(访问外存) ,即主要取决于 B- 树的深度• 最坏情况:含 N 个关键字的 m 阶 B 树最大深度为 log m / 2 ( (N +1) / 2 )+1

Page 64: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

深度 h 与关键码个数 N 之间的关系设在 m 阶 B 树中每层结点个数达到最少 , 则

B 树的深度可能达到最大。• 1层 1 个结点• 2层 至少 2 个结点• 2层 至少 2 m / 2 个结点• • h+1层 至少有 2 m / 2 h-1 个结点(失败结点)

若树中关键码有 N 个 , 则失败结点数为 N+1• N +1 2 m / 2 h-1

h log m / 2 ( (N +1) / 2 ) +1

Page 65: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

例:若 B 树的阶数 m = 199, 关键码总数 N = 1999999 ,则 B 树的高度 h 不超过

log100 1000000 +1= 4 m 值的选择 :

提高阶数 m, 可以减少树的高度。从而减少读入结点的次数 , 因而可减少读磁盘的次数。 反之,当 m 很大,超出内存工作区容量时 , 结点不能一次读入到内存。增加了读盘次数 , 也增加了结点内搜索的难度。

Page 66: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

B 树的插入和删除注意保持性质,特别是等高和阶的限制

• 在 B 树,每个结点的关键码个数都应满足 [ m/2 -1, m-1]B 树的插入

• 1) 找到最底层,插入• 2) 若溢出,则结点分裂,中间关键字连同新指针插入父结点• 3) 若父结点也溢出,则继续分裂

分裂过程可能传达到根结点 ( 则树升高一层 )

Page 67: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

m=3 ,插入 14

插入 143阶 B 树

18 33

12 23 30 48

10 20 21 24 31 45 47 50 5215

14

关键字个数不大于 2

Page 68: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

m=3 ,插入 55

18 33

12 23 30 48

10 15 20 21 24 31 45 47 50 52

插入 55

50 52

55

关键字个数不大于 2

Page 69: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

m=3 ,叶结点分裂,把 52 提升到父结点

结点分裂18 33

12 23 30 48

10 15 20 21 24 31 45 47 50 52 555250 55

Page 70: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

插入引起 3阶 B 树根结点分裂的例子插入

19 18 33

12 23 30 48

10 15 20 21 24 31 45 47 50 52

19

19 20 21

Page 71: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

叶结点分裂18 33

12 23 30 48

10 15 24 31 45 47 50 5219 20 21 19 21

23 30

20

Page 72: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

第二层结点分裂

19 21

18 33

12 48

10 15 24 31 45 47 50 52

20 23 30 30 20

18 33

23

Page 73: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

根结点分裂

30

19 21

12 48

10 15 24 31 45 47 50 52

20

23 18 33

Page 74: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

B 树的删除删除的关键字不在叶结点层

• 先把此关键字与它在 B 树里的后继对换位置删除的关键字在叶结点层

• 删除后关键字个数不小于直接删除

• 关键字个数小于如果兄弟结点关键字个数不等于

– 从兄弟结点移若干个关键字到该结点中来如果兄弟结点关键字个数等于

– 合并至兄弟结点:连同对应的双亲结点

/ 2 1m

/ 2 1m

/ 2 1m

/ 2 1m

Page 75: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

删除 120 ,先与后继交换,删后下溢出,向左邻借关键码

150 25 50

103 a

c

ed f g h

b

i11 15 35 43 81 95 100 108 110 115 146 156 177

120

134

118 146 146

134

m=5 ,删除 120 关键字个数不小于 2

Page 76: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

118 25 50

103

c

ed f g h

b

i

11 15 35 43 81 95 100 108 110 115 134 146 177 156

150

继续删除150与后继交换删除 150, i溢出向左邻借关键码借不到, h, i 合并

177 134 146

a

m=5 ,删除 150

Page 77: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

118 25 50

103

c

ed f g h’

b

11 15 35 43 81 95 100 108 110 115 134 146 156 177

h, i 合并成为 h’

c 溢出,向左邻借关键码 借不到, b,c 结点合并

118 25 50

a

25 50 103 118

a’

m=5 ,删除引起合并

Page 78: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

3 阶 B 树删除 3745

24 90

3 37 61 70 100

45

24 90

3 61 70 100

45

90

3 24 61 70 100

45 90

3 24 61 70 100

关键字个数不小于 1

删除 37后, d 的关键字个数不够合并至兄弟结点

d

b

合并后, b 的关键字个数不够继续合并至兄弟结点

Page 79: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

9.3.3 B+ 树 B+ 是 B 树的一种变形,是在叶结点上存储信息的树

• 有 k 个子树的结点含有 k 个关键码• 所有的关键码均出现在叶结点上 • 非终端结点中的关键码是子树最大关键码(或最小)

Page 80: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

m阶 B+ 树的结构定义如下:• (1)每个结点至多有 m 个子结点;• (2)每个结点 ( 除根外 )至少有 个子结点;• (3) 根至少有两个子结点;• (4) 所有的叶结点在同一层;• (5) 有 k 个子树的结点必有 k 个关键码。

/ 2m

Page 81: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

2 阶 B+ 树的例子 70 95

10 20 35 40 44 51 65 70 85 91 93 95

20 40 51 70 91 95

40 70 95

Page 82: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

B+ 树的查找查找应该到叶结点层

• 在上层已找到待查的关键码,并不停止• 而是继续沿指针向下一直查到叶结点层的这个关键码

B+ 树的叶结点一般链接起来,形成一个双链表 • 适合顺序检索(范围检索)• 实际应用更广

Page 83: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

B+ 树应用得更为广泛B+ 树的存储效率更高

• 检索层次更少(树较矮)操作更方便

• 插入删除操作更方便• 树型结构随机存取• 叶层的拉链顺序访问

因此, B+ 树应用得更为广泛

Page 84: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

9.4 哈希表上两节介绍的查找表的查找方法共同特点:

• 通过比较查找。查找算法的时间效率取决于查找过程中所进行的比较次数。

理想的方法是:• 不需要比较,根据给定值能直接定位记录的存储位置。• 为此,需要在记录的存储位置与该记录的关键字之间建立一种确定的对应关系,使每个记录的关键字与一个存储位置相对应。

Page 85: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

1. 什么是哈希表: • 哈希函数:用来定义记录的关键字与记录存储位置的对应关系的函数

addr(ai)= H(keyi)H( ) 为哈希函数自变量 keyi 是记录 ai 关键字 ,函数值 addr(ai) 是存储地址

• 哈希地址:由哈希函数求出的记录存储位置• 哈希表:也叫散列表,是将记录按哈希函数确定的位置存放而构成的表。

Page 86: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

哈希表年份人数 1 2 3 51 52 1949 1950 1951 …… 1999 2000 2000 2100 2200 …… 4400 4420

例: 1949-2000 年某地区人口统计表• 关键字: 年份• 哈希函数: H ( KEY ) =KEY-1948

Page 87: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

构造哈希表要解决两方面的问题:• 1 ) 构造哈希函数

为获得较高的查找效率,哈希函数应是一些便于计算的简单函数。• 2 ) 处理冲突

可能有多个不同的关键字,对应的哈希函数值是相同的,这意味着不同记录由哈希函数确定的存储位置是相同的。

Page 88: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

例:某年全国各城市人口统计表• 关键字: 城市名• 哈希函数: H ( key ) =key 的首字母在字母表中的序号

key 北京 天津 石家庄 保定 吉林 哈尔滨 长春 H(key) 2 20 19 2 10 8 3

具有相同哈希函数值的关键字称为同义词

Page 89: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

2. 哈希函数的构造“好”的哈希函数的条件 :

• 简单:易于计算• 均匀:减少冲突

若对于关键字集合中的任一个关键字,经哈希函数映象到地址集合中,任何一个地址的概率是相等的,则称此类哈希函数为均匀的。

Page 90: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

常用的构造哈希函数的方法• 1 )直接定址法• 2 ) 数字分析法• 3 ) 平方取中法• 4 ) 折叠法• 5 ) 除留余数法

Page 91: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

1 )直接定址法• 哈希地址:关键字的某个线性函数值• 哈希函数: H ( key)= a·key+b

例 : 哈希函数 H ( KEY ) =KEY-1948特性

• 仅适合于地址集合的大小与关键字集合的大小相等的情况• 在实际应用中能使用这种哈希函数的情况很少

Page 92: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

2 ) 数字分析法• 哈希地址:取关键字的若干数位组成

例:有 80 个记录,关键字为 8 位十进制数,哈希地址为 2 位十进制数只取 8 ,只取 1只取 3 、 4只取 2 、 7 、 5数字分布近乎随机• 取任意两位或两位与另两位的叠加作哈希地址

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

Page 93: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

特性• 数字分析法仅适用于事先明确知道表中所有关键字每一位数值的分布情况• 完全依赖于关键字集合。• 如果换一个关键字集合,选择哪几位要重新决定。

Page 94: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

3 ) 平方取中法• 哈希地址:取关键字平方后的中间几位

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

• 此方法在词典处理中使用十分广泛。例:标识符的八进制内码表示及其平方值

标识符 内码 内码的平方 哈希地址( 9位)

A 0100 0 010000 010I 1100 1 210000 210

I0 1160 1 370400 370

Page 95: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

特性• 平方取中法是较常用的构造哈希函数的方法• 适合于关键字中的每一位都有某些数字重复出现且频度很高的情况• 中间所取的位数,由哈希表长决定

Page 96: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

4 ) 折叠法• 哈希地址:将关键字分割成位数相同的几部分 ( 最后一部分的位数可以不同 ) ,取这几部分的叠加和

例:关键字为 0442205864 ,哈希地址位数为 4

特性 :折叠法适合于关键字的数字位数特别多,而且每一位上数字分布大致均匀的情况

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 97: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

5 ) 除留余数法• 哈希地址:取关键字被某个数 p 除后所得的余数• 哈希函数: H ( key)= key MOD p (p≤m)

设 m 为哈希表表长, p 为小于等于 m 的某个数p 为不大于 m 的质数或不包含小于 20 的质因子。

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

Page 98: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

选择哈希函数的考虑因素• 计算时间• 关键字的长度• 哈希表的大小• 关键字的分布• 记录的查找频率

Page 99: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

3. 解决冲突的方法:• 当不同记录由哈希函数确定的存储位置相同,发生冲突。这时需用某种方法解决冲突。

常用的解决冲突的方法:• 1 )开放地址法• 2 )再哈希法• 3 )链地址法• 4 )建立一个公共溢出区

Page 100: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

1)开放地址法• 用函数 Hi(key)=(H(key)+di)mod m(i=1,2,3… ) 为发生冲突的记录再求一存储位置。

Hi(key) ( i=1,2,3…) 是一系列函数– 若 H1 (key) 计算出的地址仍冲突,用 H2 (key) 求“下一地址”… ,

H(key) 为哈希函数;m 为哈希表表长;di 为增量序列,有三种取法:

– a) di=1,2,3… ,称为线性探测再散列– b) di=12 , -12 , 22 , -22,…,+k2,(k<= m/2) ,称为二次探测再散列– c) di=伪随机数序列,称为伪随机数探测再散列

Page 101: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

例:试对下列关键字序列( 19 , 13 , 33 , 02 , 16 , 29 , 24 )构造哈希表 HT 。• 哈希表 HT 表长为 11 ,• 哈希函数 H(key)=key mod 11,• 试用开放地址法中线性探测再散列解决冲突

Hi(key)=(H(KEY)+di)mod 11 (d1=1, d2=2, d3=3,… ),

Page 102: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

关键字序列( 19 , 13 , 33 , 02 , 16 , 29 , 24 )解:

0 1 2 3 4 5 6 7 8 9 10

191333 02 16 2924

H(19)=19 mod 11=8H(13)=13 mod 11=2H(33)=33 mod 11=0

H(02)=02 mod 11=2

冲突 H1 (02)=(H(02)+ d1)mod 11= ( 2+1 ) mod 11=3 H(16)=16 mod 11=5

H(29)=29 mod 11=7 H(24)=24 mod 11=2 冲突 H1 (24)=(H(24)+ d1)mod 11= ( 2+1 ) mod 11=3 冲突 H2 (24)=(H(24)+ d2)mod 11= ( 2+2 ) mod 11=4

哈希表建好了!

Page 103: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

2) 再哈希法• 产生地址冲突时,用另一个哈希函数计算哈希地址• Hi=RHi (key) i=1,2,…,k

其中, RHi 是不同的哈希函数• 特点:不易产生聚集,但增加计算时间

3)链地址法• 将所有关键字为同义词的记录存储在同一线性链表中。

4)建立公共溢出区• 同义词的记录填入溢出表

Page 104: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

关键字序列( 19 , 13 , 33 , 02 , 16 , 29 , 24 )哈希函数 H(key)=key mod 11

• H(19)=8• H(13)=2• H(33)=0• H(02)=2• H(16)=5• H(29)=7• H(24)=2

0

1 ^

2

3 ^

4 ^

5

6 ^

7

8

9 ^

10 ^

33 ^

1302

5 ^

19 ^

24 ^

29 ^

Page 105: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

0 1 2 3 4 5 6 7 8 9 10 191333 02 16 2924

查找关键字 19 用哈希函数求 19 对应的哈希地址:H(19)=19 mod 11=8

将 HT[8] 与 19 比较相等查找成功

4. 哈希表的查找• 对于给定值,由哈希函数和解决冲突的方法定位记录的存储位置。

例:在哈希表 HT ,试查找关键字 19 、 02 。

Page 106: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

0 1 2 3 4 5 6 7 8 9 10 191333 02 16 2924

用哈希函数求 02 对应的哈希地址:H(02)=02 mod 11=2

将 HT[2] 与02 比较不相等

用解决冲突方法为 02 求下一个“地址” H1 (02)=(H(02)+ d1)mod 11=3

将 HT[3] 与 02 比较相等查找成功

查找关键字 02

ASL=(1*5+2+3)/7=10/7≈1.4

Page 107: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

哈希查找的性能分析• 按理论分析,它的时间复杂度应为 O(1) ,它的平均查找长度应为 ASL=1• 实际上,由于冲突,平均查找长度将会比 1大。

影响关键字比较次数的因素• 哈希函数:假定是均匀的,则不考虑其影响• 处理冲突的方法

线性探测再散列:易产生记录的二次聚集链地址法:不会产生新的冲突

• 哈希表的装填因子: α= 表中的记录数 / 哈希表的长度表示哈希表的装满程度

Page 108: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

一般情况下,处理冲突相同的哈希表,平均查找长度依赖于装填因子 α• 线性探测再散列: ASL ≈ (½)(1 + 1/(1-α))• 二次探测再散列: ASL ≈ -(1/α)ln(1-α)• 链地址法: ASL ≈ (1 + α/2)

Page 109: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

查找

静态查找表

动态查找表二叉排序树平衡二叉树B 树B+ 树

顺序表—顺序查找有序表—折半查找

哈希表哈希函数

处理冲突

查找插入删除直接定址法数字分析法平方取中法折叠法除留余数法开放地址法再哈希法链地址法公共溢出区

Page 110: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

学习要点• 1. 掌握顺序表和有序表的查找方法;了解二分查找过程的描述方法——判定树;• 2. 掌握二叉排序树的查找方法;• 3. 掌握哈希表的构造方法和查找方法,理解哈希表与其他结构的表的实质性的差别,了解哈希表解决冲突的方法:开放地址法,链地址法

Page 111: 第九章和第十章介绍数据处理中常用的两种操作:查找和排序。 许多软件都为用户提供了查找和排序功能。 例如:文本编辑软件 Word ,

习题9.9

• (1) 、 (2)9.19