第08章 查找(java版)

36
数数数数 Java 数 )( 3数第8第 第第 8.1 第第第第第第第 8.2 第第第第第第第第 8.3 第第 8.4 第第第第第第第第第第第

Upload: yan-li

Post on 27-Jul-2015

279 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

第 8 章 查找 8.1 查找的基本概念 8.2 基于线性表的查找

8.3 散列

8.4 二叉排序树和平衡二叉树

Page 2: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

目的和要求 目的:查找算法设计。• 内容:顺序查找、折半查找、分块查找;散

列表;二叉排序树。• 要求:掌握查找的概念和多种查找算法设

计,学习根据不同情况选择合适的查 找算法,掌握提高查找效率采取的各 种方法。

• 重点:顺序查找、折半查找、分块查找;散 列表;二叉排序树。

• 难点:散列表;二叉排序树。• 实验:查找算法及其效率分析。

Page 3: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.1 查找的基本概念

1. 查找操作和查找结果关键字( key ) 、主关键字( primary key )

2. 查找算法及其提高查找效率的措施 顺序查找 数据排序、建立索引、散列存储、建立二叉排

序树 3. 查找算法性能评价 )(

1i

n

ii cpASL

Page 4: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.2 基于线性表的查找

8.2.1 顺序查找

8.2.2 基于有序顺序表的折半查找

8.2.3 基于索引顺序表的分块查找

Page 5: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.2.1 顺序查找1.顺序表的顺序查找public int indexOf(T key)// 顺序查找关键字为key 元素,返回首次出现的元素,若查找不成功返回 -1 。 key 可只包含关键字数据项,由 T 类的equals() 提供比较对象相等的依据

public T search(T key) // 查找public boolean contain(T key) // 判断是否包

含关键字为 key 元素public void remove(T key) // 删除首次出现元

Page 6: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

2. 单链表的顺序查找public T search(T key) // 顺序查找关键

字为 key 元素,返回首次出现的元素,若查找不成功返回 null

public boolean contain(T key) // 判断线性表是否包含关键字为key 元素

public void remove(T x) // 删除首次出现的值为 x 的结点,若没找到指定结点则不删除

Page 7: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

3. 顺序查找算法分析

)(2

1

2

)1(11)(

11

nOnnn

ni

ncpASL

n

ii

n

ii

成功

)()1

()(11

nOnnn

cpASLn

ii

n

ii

不成功

Page 8: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.2.2 基于有序顺序表的折半查找1. 折半查找算法

0

8

1

17

2

26

3

32

4

40

5

72关键字序列value

mid

6

87

7

99

begin end

(a)x=40,x>value[mid],继续查找子序列范围为mid+1~end

8 17 26 32 40 72

mid

87 99

begin end

(b)x<value[mid],继续查找的子序列范围为begin~mid-1

8 17 26 32 40 72

mid

87 99

begin end

(c)x==value[mid],查找成功,比较3次;若x=39,则查找不成功

Page 9: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

100~∞

查找87

查找25

171

(a)顺序查找,n=8,h=8 (b)折半查找,n=8,h=4

0

1

2

32

17

8

-∞~7 9~16

26

18~25 27~31

72

40 87

73~86 99

3

5

6

=< > =< >

=< >4

33~39 41~71

=< >7

89~98 100~∞

=< >

=< >

=< >

查找87查找25

=< >

有序顺序表 {8,17,26,32,40,72,87,99}8

-∞~7

0

=< >

88~98

=< >

262

9~16

=< >

323

18~25

=< >

404

27~31

=< >

725

33~39

=< >

876

41~71

=< >

997

73~86

=< >

2. 折半查找算法分析

625.28

21)43333221(

8

1成功ASL

Page 10: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.2.3 基于索引顺序表的分块查找

1. 索引2. 分块查找

① 字典的分块查找

Page 11: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

例 8.1 判断一个字符串是否为 Java 关键字。

Page 12: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

例 8.2 采用扩充索引表查询 Java 关键字。

a

b

c

d

e

f

i

n

p

r

s

t

v

w

l

0

2

5

10

13

15

25

29

33

34

39

45

47

48

26

0

1

2

3

4

5

6

7

8 16

10

11

12

14

15

o -1

9

u -1

13

g -1

m -1

18

17

h -1

j -1

k -1

q -1

20

21

22

19

块末下标end

-1

-1

-1

-1

-1

-1

20

27

30

34

35

40

46

48

26

1

4

9

12

14

19

-1

-1

endfirst start endfirst start首字母

first

块起始下标 start

Page 13: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

( 2 )支持插入和删除操作的索引结构及其分块查找

Page 14: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

Page 15: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.3 散列

8.3.1 散列表

8.3.2 散列函数

8.3.3 处理冲突

8.3.4 构造链地址法的散列表

Page 16: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.3.1 散列表

1. 散列函数 i=hash(key)

2. 冲突

21 kk

)()( 21 khashkhash

Page 17: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.3.2 散列函数1. 除留余数法

hash(k)=k % p

2. 平方取中法 3. 折叠法

散列表长度 8 16 32 64 128

256

最大素数 7 13 31 61 127

251

Page 18: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.4.3 处理冲突

1. 开放定址法

Page 19: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

2. 链地址法

6.110

232216

成功ASL

Page 20: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

图 8-12 链地址法散列表的插入和删除操作

3

4

3

74 74

14 ∧

3

4

3

4

74

14 ∧

(a)插入关键字为74元素,冲突时将结点在插入在同义词单链表最前

(b)删除关键字为4元素,将单链表第一个结点元素移动到数组中,再删除该结点

Page 21: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.4.4 构造链地址法的散列表

Page 22: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

采用链地址法的散列表类public class HashSet<T>{ private SinglyLinkedList<T>[] table; // 散列表,同义词单链表对象数组 public HashSet(int length) public HashSet() private int hash(T x) // 散列函数 public void insert(T x) // 插入 x 元素 public void remove(T x) // 删除 x 元素 public T search(T key) // 查找}

Page 23: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

例 8.3 统计文本中各字符的出现次数,为建立 Huffman 树做准备。

字符character

u 1

出现次数count

1p

l 2

1b

c 2

1i

a 1

1

2s

(a)顺序表存储,顺序查找 (b)散列表,散列函数为character%10

0

6

3

1

2

5

4

9

8

7

字符character

出现次数count

data

0

6

3

1

2

5

4

9

8

7

next

l 2

∧a 1

∧b 1

∧c 2

∧p 1

∧s 2

∧ 1

i 1 ∧u 1

Page 24: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.4 二叉排序树和平衡二叉树

8.4.1 二叉排序树

8.4.2 平衡二叉树

Page 25: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.4.1 二叉排序树

1. 定义2. 查找

Page 26: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

3. 插入

Page 27: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

二叉排序树类 public class BinarySortTree<T

extends Comparable<T>> extends BinaryTree<T>BinaryTTree

二叉树接口

BinaryTree二叉链表存储的二叉树类

实现

BinarySortTree二叉排序树类

继承

Page 28: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

【例8.4 】二叉排序树的插入和查找操作。

Page 29: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

4. 二叉排序树的删除

(a)删除叶子结点p,设置父母结点parent的左孩子链或右孩子链为空

leftroot

54

data right

18

∧ 3612 ∧

∧ 6 ∧p

parent

(b)删除1度结点p,用p的孩子填补作为parent结点的孩子

root54

18

∧ 36∧ 12 ∧

p

parent

∧ 40 ∧ ∧ 40 ∧

18

12 57

66

87

54

99

40

76

81

(c)删除2度结点p,用p在中根次序下的后继结点insucc值代替p结点值,再删除insucc结点,insucc结点无左孩子

p

parent

18

12 57

76

87

54

99

40

81insucc

删除p结点

76

替换值

Page 30: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

5. 二叉排序树的查找性能分析

625.28

21)14432211(

8

1)(

1

i

n

ii cpASL成功

5.42

18

2

11

1

ni

nASL

n

i成功

Page 31: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

8.4.2 平衡二叉树

1. 平衡二叉树定义

Page 32: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

2.平衡二叉树的插入

Page 33: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

3. 调整平衡的模式 ( 1 ) LL 型调整

Page 34: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

( 2 ) RR 型调整

Page 35: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

( 3 ) LR 型调整 A

-2

(a)LR型调整,A的左孩子B的右子树较高时,以B的右孩子C为根

LR调整

AR hB

C

1

BL

CL h

h

CR h-1

C0

AB

CRBL h h-1CL h AR h

(b)插入71,LR型调整后,71作为66的右孩子

810

87

9966

-2

01

57 7610

990

76

81

66

0

0

-1

57

870

0

LR

调整

710

87

9966

-2

01

57 76-10

990

76

71

66

0

0

0

57

871

0

LR

调整

(c)插入81,LR型调整后,81作为87的左孩子

Page 36: 第08章  查找(java版)

《数据结构( Java版)(第 3版)》

( 4 ) RL 型调整 A

2

RL调整

AL hB

C

-1

BR

CL h

h

CR h-1

C0

BA

CRAL h h-1CL h BR h

(b)插入41,RL型调整后,41作为36的右孩子 (c)插入66,RL型调整后,66作为87的左孩子

36

54

87

956612

0

0

0

-1

0 099

0

36

8712-10

2

541

660

RL

调整36

54

87

954112

0

1

0

0

0 099

0

36

8712-10

2

54-1

410

RL

调整

(a)RL型调整,A的右孩子B的左子树较高时,以B的左孩子C为根