第 3 章 查找和排序

23
1/23 第3第 第第第第第 3.1 什什什什什 3.2 什什什什什 3.3 什什什什 3.4 什什什什

Upload: odette-black

Post on 31-Dec-2015

84 views

Category:

Documents


0 download

DESCRIPTION

第 3 章 查找和排序. 3.1 什么是查找 3.2 顺序表查找 3.3 树表查找 3.4 哈希查找. 3.1 查找的概念. 查找 在给定的 DS 中找出满足某种条件的结点;若存在这样的结点,查找成功;否则查找失败。 查找表 一组待查数据元素的集合。 查找的方法与数据的组织形式有关。 平均查找长度 ASL 在查找过程中 , 用来评价查找算法的时间复杂度。. 3.2 顺序表的查找. --. 顺序查找 1) 从第 1 个元素开始查找; - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 3 章  查找和排序

1/23

第 3 章 查找和排序

3.1 什么是查找 3.2 顺序表查找3.3 树表查找3.4 哈希查找

Page 2: 第 3 章  查找和排序

2/23

3.1 查找的概念

查找 在给定的 DS 中找出满足某种条件的结点;若存在这样的结点,查找成功;否则查找失败。

查找表 一组待查数据元素的集合。查找的方法与数据的组织形式有关。平均查找长度 ASL 在查找过程中 ,用来评价查找算法的时间复杂度。

Page 3: 第 3 章  查找和排序

3/23

3.2 顺序表的查找--. 顺序查找 1) 从第 1个元素开始查找; 2) 用给定值与各结点的关键字值逐个比较;若找到相等的结点,则查找成功 ; 否则,继续查找 , 直到第 n 个记录都不相等 ,查找失败。

Page 4: 第 3 章  查找和排序

4/23

3.2 顺序表的查找 --折半查找二 . 折半查找 ( 二分查找 ) 查找效率高

前提 : 查找表中的数据元素必须有序。算法 :1) 确定区间的中间位置

mid =(left + right)/2 2) 用给定值与中间位置的关键字值比较;若相等,则查找成功; 若给定值大 ,新查找区为后半区; 若给定值小 ,新查找区为前半区。

3) 对缩小的区域重复上述步骤;

Page 5: 第 3 章  查找和排序

5/23

折半算法举例有序数列 {3,5,11,17,21,23,28,30,32,50},按折半查找法,查找关键字值为 30的元素 第 1次 : {3,5,11,17,21,23,28,30,32,50} mid1= ( 1+10 ) /2 = 5 第 2次: { 23 , 28 , 30 , 32 , 50 } mid2 = ( 6+10 ) /2 = 8 查找成功优点 : 比较次数少 ,查找速度快缺点:要求事先排序

left

Page 6: 第 3 章  查找和排序

6/23

3.2 顺序表的查找 --分块查找三 .分块查找 顺序查找的改进1. 分块 1) n 个数据元素分为 m 块 (mn)

2) 块内可以无序 3) 块间必须有序 4) 选各块中的最大关键字构成一个索引表

Page 7: 第 3 章  查找和排序

7/23

分块查找算法描述

2. 查找–1) 对索引表用二分或顺序查找,确定待查记录在哪一块中;

–2) 在已确定的块中用顺序法进行查找。

3. 优点: 块中插入、删除方便 缺点: 索引表增加了存储空间。

Page 8: 第 3 章  查找和排序

8/23

分块查找举例数列 {22,12,13,9,8,33,42,44,38,24,48,60,58,75,47}1) 按“块有序”分三块 :见下图 2) 每块中最大关键字组成索引表 [22,44,74],3) 查找关键字值为 60的元素。

• 用二分法, 60 在 44~74 之间,取第 3 块 ;• 在第 3 块中用顺序法查找

44

22

74

22

12

13

9

8

33

42

44

38

24

48

60

58

74

47

List[1]

List[2]

List[3]

Page 9: 第 3 章  查找和排序

9/23

3.3 二叉排序树查找

将数据元素组织成二叉树形式,达到与二分法相同的查找效率,又具有链表的插入、删除操作的灵活性。

Page 10: 第 3 章  查找和排序

10/23

二叉排序树查找算法

1) 建立二叉排序树。 2) 将待查关键字值与根结点进行比较,若相等,查找成功;

3) 否则根据比较结果确定查找路径:–若小于根结点的关键字值,则与左子树的根结点的关键字值进行比较;

–若大于根结点的关键字值,则与右子树的根结点的关键字值进行比较。

4) 重复上述步骤,直到要么找到,查找成功;要么找不到,查找失败。

Page 11: 第 3 章  查找和排序

11/23

举例 : 对数列 {10 ,18 , 3, 4, 9, 13 ,25} ,生成二叉排序树如下 :

1) 查找关键字值为 25: 25 与根结点值 10比较,走右路,再与 18比较,走右路,最后与 25比较,查找成功 ,比较 3次。

2) 若查找 35 与 10 、 18 、 25 分别比较后仍没找到相等元素,查找失败,比较了三次。

1010

33

99

44

1818

1313 2525

Page 12: 第 3 章  查找和排序

12/23

3.4 哈希查找一 . 概念哈希函数 将元素的关键字 K作自变量,通过一定的函数关系 (哈希函数 ), 计算出该元素的存储地址 : Addr=H( K)

哈希表 由哈希函数的值组成的表。建立哈希函数的原则 : 使地址值均匀分布在哈希表中

哈希查找 :通过运算确定存储位置 ,实现快速检索

对比其它查找方法 :通过比较确定元素位置

Page 13: 第 3 章  查找和排序

13/23

二 . 建立哈希表

构造哈希函数常用的方法–数字分析法–平方取中法–折叠法–除留余数法(求模取余法)–直接定址法

Page 14: 第 3 章  查找和排序

14/23

三 .冲突及冲突处理

1. 冲突 : 在哈希元素(地址)求解过程中,不同关键字值对应到同一个存储地址的现象 , 即 K1K2 , 但 H( K1) = H( K2)

2. 均匀的哈希函数可以减少冲突,不能避免冲突。

3. 处理冲突•开放地址法•链地址法•再哈希法•公共溢出区法

Page 15: 第 3 章  查找和排序

15/23

处理冲突 —— 开放地址法

发生冲突后,求解下一个地址 Hi =(H(key)+di)MOD m i=1,2,…,k(k m-1) m: 哈希表长度 ,di: 增量序列增量序列的不同取法,构成不同的开放地址法。 1)线性探测再散列 di=1,2,…,m-1 2) 二次探测再散列 di=12 ,-12,22,-22, …,+k2,-k2 (k m/2)

Page 16: 第 3 章  查找和排序

16/23

处理冲突 —— 链地址法发生冲突后 , 将所有函数值相同的记录连成单链表:

H(41)=H(1)=1

H(67)=3

H(530=H(13)=5

H(22)=H(46)=H(30)=6

1

2

3

4

5

6

7

41 1 NULL 1 NULL

46 46

13 NULL13 NULL

30 NULL 30 NULL22

NULL

53

NULL

NULL

NULL

67

Page 17: 第 3 章  查找和排序

17/23

四 . 建立哈希表举例

数列 {22,41,53,46,30,13,1,67}, 表长 9哈希函数 : H(key) = key MOD 8 ,用线性探测解决冲突 Hi=(H(key)+di) MOD m

1) 计算 H(22 ) =6 ,该地址空,可用;

2) 计算 H(41 ) =1 ,该地址空,可用;

0 1 2 3 4 5 6 7 8

22

22

0 1 2 3 4 5 6 7 8

41

比较次数: 1 1

Page 18: 第 3 章  查找和排序

18/23

举例(续一)

3) H(53 ) = 5 ,该地址空,可用;

4) H(46 ) = 6 ,该地址冲突 下一个可用地址 Hi=(6+1 ) MOD 8 = 7 ,该地址空,可用;

2241

0 1 2 3 4 5 6 7 8

53

2241 53 46

0 1 2 3 4 5 6 7 8

比较次数: 1 1 1

比较次数: 1 1 1 2

Page 19: 第 3 章  查找和排序

19/23

举例(续二) 5) H(30 ) = 6 ,冲突 下一个地址 Hi=(6+1)MOD 8=7 ,冲突 再下一个可用地址; Hi=0 ,可用;

6) H(13 ) = 5 ,依法解决冲突,得出:

2241

0 1 2 3 4 5 6 7 8

53

2241 53 46

0 1 2 3 4 5 6 7 8

比较次数: 3 1 1 1 2

比较次数: 3 1 6 1 1 2

4630

30 13

Page 20: 第 3 章  查找和排序

20/23

举例(续三)

7) H(1 ) = 1 ,该地址冲突,解决冲突可得;

8) H(67 ) = 3 ,冲突,解决冲突,得出:

2241

0 1 2 3 4 5 6 7 8

53

2241 53 46

4630

30

13

比较次数: 3 1 6 3 1 1 2

1

13 1 67

比较次数: 3 1 6 3 2 1 1 2

0 1 2 3 4 5 6 7 8

Page 21: 第 3 章  查找和排序

21/23

五 . 哈希查找

设哈希表为 HST[M] ,解决冲突的方法为 R( x)

哈希查找步骤 (对给定 k值 ):– 1. 计算哈希地址 Di=H( k);

•若 HST[i] 为空,则查找失败;•若 HST[i]=k,则查找成功;•否则,执行下一步处理冲突。

– 2 重复计算下一个存储地址 Dk=R(Dk-1) ,直到 HST[Dk] 为空,或 HST[Dk}=k为止。

Page 22: 第 3 章  查找和排序

22/23

查找举例

设有数列 {22,41,53,46,30,13,1,67}, 哈希函数为 H(key)=key MOD 8, 用线性探测法解决冲突 , 建立的哈希的表为 :

平均查找长度 ASL= (3+1+6+3+2+1+1+2)/8=19/8 查找 key = 67 比较两次找到 ,查找成功 ; 查找 key = 21 比较 8次找不到 ,查找失败

0 1 2 3 4 5 6 7 8

比较次数: 3 1 6 3 2 1 1 2

2241 53 4630 13 1 67

Page 23: 第 3 章  查找和排序

23/23

作业、思考题

1 、第 3章思考 : 第 2、 3、 5~7、 11题作业: 第 13题