Download - 第08章 查找(java版)
《数据结构( Java版)(第 3版)》
第 8 章 查找 8.1 查找的基本概念 8.2 基于线性表的查找
8.3 散列
8.4 二叉排序树和平衡二叉树
《数据结构( Java版)(第 3版)》
目的和要求 目的:查找算法设计。• 内容:顺序查找、折半查找、分块查找;散
列表;二叉排序树。• 要求:掌握查找的概念和多种查找算法设
计,学习根据不同情况选择合适的查 找算法,掌握提高查找效率采取的各 种方法。
• 重点:顺序查找、折半查找、分块查找;散 列表;二叉排序树。
• 难点:散列表;二叉排序树。• 实验:查找算法及其效率分析。
《数据结构( Java版)(第 3版)》
8.1 查找的基本概念
1. 查找操作和查找结果关键字( key ) 、主关键字( primary key )
2. 查找算法及其提高查找效率的措施 顺序查找 数据排序、建立索引、散列存储、建立二叉排
序树 3. 查找算法性能评价 )(
1i
n
ii cpASL
《数据结构( Java版)(第 3版)》
8.2 基于线性表的查找
8.2.1 顺序查找
8.2.2 基于有序顺序表的折半查找
8.2.3 基于索引顺序表的分块查找
《数据结构( 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) // 删除首次出现元
素
《数据结构( Java版)(第 3版)》
2. 单链表的顺序查找public T search(T key) // 顺序查找关键
字为 key 元素,返回首次出现的元素,若查找不成功返回 null
public boolean contain(T key) // 判断线性表是否包含关键字为key 元素
public void remove(T x) // 删除首次出现的值为 x 的结点,若没找到指定结点则不删除
《数据结构( Java版)(第 3版)》
3. 顺序查找算法分析
)(2
1
2
)1(11)(
11
nOnnn
ni
ncpASL
n
ii
n
ii
成功
)()1
()(11
nOnnn
cpASLn
ii
n
ii
不成功
《数据结构( 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,则查找不成功
《数据结构( 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
《数据结构( Java版)(第 3版)》
8.2.3 基于索引顺序表的分块查找
1. 索引2. 分块查找
① 字典的分块查找
《数据结构( Java版)(第 3版)》
例 8.1 判断一个字符串是否为 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
《数据结构( Java版)(第 3版)》
( 2 )支持插入和删除操作的索引结构及其分块查找
《数据结构( Java版)(第 3版)》
《数据结构( Java版)(第 3版)》
8.3 散列
8.3.1 散列表
8.3.2 散列函数
8.3.3 处理冲突
8.3.4 构造链地址法的散列表
《数据结构( Java版)(第 3版)》
8.3.1 散列表
1. 散列函数 i=hash(key)
2. 冲突
21 kk
)()( 21 khashkhash
《数据结构( Java版)(第 3版)》
8.3.2 散列函数1. 除留余数法
hash(k)=k % p
2. 平方取中法 3. 折叠法
散列表长度 8 16 32 64 128
256
最大素数 7 13 31 61 127
251
《数据结构( Java版)(第 3版)》
8.4.3 处理冲突
1. 开放定址法
《数据结构( Java版)(第 3版)》
2. 链地址法
6.110
232216
成功ASL
《数据结构( Java版)(第 3版)》
图 8-12 链地址法散列表的插入和删除操作
3
…
4
3
74 74
∧
∧
14 ∧
3
…
4
3
4
74
∧
∧
14 ∧
(a)插入关键字为74元素,冲突时将结点在插入在同义词单链表最前
(b)删除关键字为4元素,将单链表第一个结点元素移动到数组中,再删除该结点
《数据结构( Java版)(第 3版)》
8.4.4 构造链地址法的散列表
《数据结构( 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) // 查找}
《数据结构( 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
《数据结构( Java版)(第 3版)》
8.4 二叉排序树和平衡二叉树
8.4.1 二叉排序树
8.4.2 平衡二叉树
《数据结构( Java版)(第 3版)》
8.4.1 二叉排序树
1. 定义2. 查找
《数据结构( Java版)(第 3版)》
3. 插入
《数据结构( Java版)(第 3版)》
二叉排序树类 public class BinarySortTree<T
extends Comparable<T>> extends BinaryTree<T>BinaryTTree
二叉树接口
BinaryTree二叉链表存储的二叉树类
实现
BinarySortTree二叉排序树类
继承
《数据结构( Java版)(第 3版)》
【例8.4 】二叉排序树的插入和查找操作。
《数据结构( 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
替换值
《数据结构( Java版)(第 3版)》
5. 二叉排序树的查找性能分析
625.28
21)14432211(
8
1)(
1
i
n
ii cpASL成功
5.42
18
2
11
1
ni
nASL
n
i成功
《数据结构( Java版)(第 3版)》
8.4.2 平衡二叉树
1. 平衡二叉树定义
《数据结构( Java版)(第 3版)》
2.平衡二叉树的插入
《数据结构( Java版)(第 3版)》
3. 调整平衡的模式 ( 1 ) LL 型调整
《数据结构( Java版)(第 3版)》
( 2 ) RR 型调整
《数据结构( 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的左孩子
《数据结构( 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为根