数据结构与算法分析第六章 优先队列(堆)讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下滤
见图6-9到6-11。
10
2.二叉堆
DecreaseKey
减少关键字的值提高优先级 上滤 任务管理器中的进程管理
DecreaseKey
增大关键字的值降低优先级 下滤
Delete
首先decreasekey,然后deletemin 进程被终止
11
2.二叉堆
Buildheap(构建堆) 1.自上而下构建
01 23 45 6 789
1 87
2 17
3 65
2 78
3 53
4 23 5 45 6 78 7 87
4 45 5 65 6 09 7 31
8 53 9 31 堆顶元素值最小
8 17 9 23 堆顶元素值最大
6
2.二叉堆
高为h的完全二叉树有2h到2h+1-1个节点, 完全二叉树的高为O(logN)
23
2.二叉堆
2.自下而上构建
[0] 数组 h
[ 1 ] 50
root
[ 2 ] 16
50
[ 3 ] 62
1
[ 4 ] 24 [5] 7 [ 6 ] 88
root
[ 2 ] 50 [ 3 ] 62 [ 4 ] 24 [5] 7
16 1 50 2
[ 6 ] 88
[ 7 ] 77
62 3
15
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
[ 2 ] 50
[ 3 ] 62 [ 4 ] 24 [5] 7
50 2
24
[ 6 ] 88
4
[ 7 ] 77
50 1 16 2
[ 6 ] 88
[ 7 ] 77
13
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
root
[ 2 ] 50 [ 3 ] 62 [ 4 ] 24 [5] 7
16 1 50 2
[ 6 ] 88
[ 7 ] 77
14
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
完全二叉树的数组存储
最小堆
09 17 65 23 45 78 87 53 31
01 23 45 6 789
1 09
2 17
3 65
4 23 5 45 6 78 7 87
8 53 9 31 堆顶元素值最小
7
2.二叉堆
ADT
假设关键字越小,优先级越高
初始化
8
2.二叉堆
插入(insert)(上滤)
件,则该集合称为最小堆(或最大堆)。
ki≤k2i和ki≤k2i+1 或 ki≥k2i和ki≥k2i+1 ( 其中,i = 1,2, …(n – 1) / 2 )
最小堆
最大堆
09 17 65 23 45 78 87 53 31
01 23 45 6 789
1 09
87 78 53 45 65 09 31 17 23
第六章 优先队列(堆)
本章纲要
1.优先队列模型 2.二叉堆 3.优先队列的应用 4.d-堆 5.左式堆 6.斜堆 7.二项队列
2
1.优先队列模型
队列
FIFO 排队等候买票
优先级
例如,救护车过红灯 对队列而言,队首元素先出队,暗含了队首
优先级最高。
3
1.优先队列模型
优先队列
队列中元素具有不同的优先级,优先级高的 元素先出队(deque)
遵守队列队首先出队的规则 因此,在优先队列中,优先级最高的元素应
在队首。 入队(enque)插入(insert) 出队(deque)(deletemin)
4
1.优先队列模型
实现
链表 数组 二叉查找树
5
2.二叉堆
若有n个关键字的集合K={k1,k2, …,kn}将其所有元素按完全二 叉树的顺序存贮方式存于一个一维数组中,并且满足以下条
[ 3 ] 62
[ 4 ] 50
[5] 7
50
[ 6 ] 88
4
[ 7 ] 77
root
16 1 24 2 7 5
62 3
18
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
[2] 7
[ 3 ] 62
[ 4 ] 50
[ 5 ] 24
50
[ 6 ] 88
4
[ 7 ] 77Biblioteka Baidu
root
16 1 7 2 24 5
62 3
19
2.二叉堆
自上而下构建堆
[0] 数组 h
[1] 7
[ 2 ] 16
[ 3 ] 62
[ 4 ] 50
[ 5 ] 24
50
[ 6 ] 88
4
[ 7 ] 77
root
7 1 16 2 24 5
62 3
20
2.二叉堆
自上而下构建堆
[0] 数组 h
[1] 7
[ 2 ] 16
[ 3 ] 62
新元素插到堆的后面,这样可能破坏了堆序性。 为恢复堆序性,从插入元素双亲开始逐层向上筛选。
1 09
09
2 17
3 65
4 23
6
5 45 78
7 87
11
65
23
17 78
87
8
9
53
31 11 10
53
31 45
(a)筛选示意图
(b)筛选后
9
2.二叉堆
Deletemin
即删除堆顶元素,数组中1号位置元素 删除操作破坏了完全二叉树结构
[ 4 ] 50
[ 5 ] 24
50
[ 6 ] 88
4
[ 7 ] 77
root
16 2 24 5
7 1
62 3 88 6
21
2.二叉堆
自上而下构建堆
[0] 数组 h
[1] 7
[ 2 ] 16
[ 3 ] 62
16
[ 4 ] 50
2
[ 5 ] 24
50
[ 6 ] 88
4
[ 7 ] 77
root 7 1
24 5
62
3
88
77
6
7
22
2.二叉堆
自上而下构建堆时间复杂度
最大比较次数:log2+log3+……log(n-1)+logn
Y轴
y=logn
求 y=logx 的积分的示意图
2
1 1 234
n
log(n!) = Σ logj
j=2
n+1
≤
logx dx
2
n n+1 X轴
上述积分值为:(n+1)log(n+1)-(n+1)loge + 2loge - 2 ; 它是O ( n logn ) 的。
依次插入每个元素,总保证堆序性
2.自下而上构建
N个元素不考虑堆序性,直接存储到一个完全 二叉树中;
从第N/2个元素到第一个元素依次使用下滤, 就得到一个堆。
12
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 50
root
[ 2 ] 16 [ 3 ] 62 [ 4 ] 24 [5] 7
root 16 1
62 3
16
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
[ 2 ] 24
[ 3 ] 62 [ 4 ] 50 [5] 7
24 2
50
[ 6 ] 88
4
[ 7 ] 77
root 16 1
62 3
17
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
[ 2 ] 24
见图6-9到6-11。
10
2.二叉堆
DecreaseKey
减少关键字的值提高优先级 上滤 任务管理器中的进程管理
DecreaseKey
增大关键字的值降低优先级 下滤
Delete
首先decreasekey,然后deletemin 进程被终止
11
2.二叉堆
Buildheap(构建堆) 1.自上而下构建
01 23 45 6 789
1 87
2 17
3 65
2 78
3 53
4 23 5 45 6 78 7 87
4 45 5 65 6 09 7 31
8 53 9 31 堆顶元素值最小
8 17 9 23 堆顶元素值最大
6
2.二叉堆
高为h的完全二叉树有2h到2h+1-1个节点, 完全二叉树的高为O(logN)
23
2.二叉堆
2.自下而上构建
[0] 数组 h
[ 1 ] 50
root
[ 2 ] 16
50
[ 3 ] 62
1
[ 4 ] 24 [5] 7 [ 6 ] 88
root
[ 2 ] 50 [ 3 ] 62 [ 4 ] 24 [5] 7
16 1 50 2
[ 6 ] 88
[ 7 ] 77
62 3
15
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
[ 2 ] 50
[ 3 ] 62 [ 4 ] 24 [5] 7
50 2
24
[ 6 ] 88
4
[ 7 ] 77
50 1 16 2
[ 6 ] 88
[ 7 ] 77
13
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
root
[ 2 ] 50 [ 3 ] 62 [ 4 ] 24 [5] 7
16 1 50 2
[ 6 ] 88
[ 7 ] 77
14
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
完全二叉树的数组存储
最小堆
09 17 65 23 45 78 87 53 31
01 23 45 6 789
1 09
2 17
3 65
4 23 5 45 6 78 7 87
8 53 9 31 堆顶元素值最小
7
2.二叉堆
ADT
假设关键字越小,优先级越高
初始化
8
2.二叉堆
插入(insert)(上滤)
件,则该集合称为最小堆(或最大堆)。
ki≤k2i和ki≤k2i+1 或 ki≥k2i和ki≥k2i+1 ( 其中,i = 1,2, …(n – 1) / 2 )
最小堆
最大堆
09 17 65 23 45 78 87 53 31
01 23 45 6 789
1 09
87 78 53 45 65 09 31 17 23
第六章 优先队列(堆)
本章纲要
1.优先队列模型 2.二叉堆 3.优先队列的应用 4.d-堆 5.左式堆 6.斜堆 7.二项队列
2
1.优先队列模型
队列
FIFO 排队等候买票
优先级
例如,救护车过红灯 对队列而言,队首元素先出队,暗含了队首
优先级最高。
3
1.优先队列模型
优先队列
队列中元素具有不同的优先级,优先级高的 元素先出队(deque)
遵守队列队首先出队的规则 因此,在优先队列中,优先级最高的元素应
在队首。 入队(enque)插入(insert) 出队(deque)(deletemin)
4
1.优先队列模型
实现
链表 数组 二叉查找树
5
2.二叉堆
若有n个关键字的集合K={k1,k2, …,kn}将其所有元素按完全二 叉树的顺序存贮方式存于一个一维数组中,并且满足以下条
[ 3 ] 62
[ 4 ] 50
[5] 7
50
[ 6 ] 88
4
[ 7 ] 77
root
16 1 24 2 7 5
62 3
18
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
[2] 7
[ 3 ] 62
[ 4 ] 50
[ 5 ] 24
50
[ 6 ] 88
4
[ 7 ] 77Biblioteka Baidu
root
16 1 7 2 24 5
62 3
19
2.二叉堆
自上而下构建堆
[0] 数组 h
[1] 7
[ 2 ] 16
[ 3 ] 62
[ 4 ] 50
[ 5 ] 24
50
[ 6 ] 88
4
[ 7 ] 77
root
7 1 16 2 24 5
62 3
20
2.二叉堆
自上而下构建堆
[0] 数组 h
[1] 7
[ 2 ] 16
[ 3 ] 62
新元素插到堆的后面,这样可能破坏了堆序性。 为恢复堆序性,从插入元素双亲开始逐层向上筛选。
1 09
09
2 17
3 65
4 23
6
5 45 78
7 87
11
65
23
17 78
87
8
9
53
31 11 10
53
31 45
(a)筛选示意图
(b)筛选后
9
2.二叉堆
Deletemin
即删除堆顶元素,数组中1号位置元素 删除操作破坏了完全二叉树结构
[ 4 ] 50
[ 5 ] 24
50
[ 6 ] 88
4
[ 7 ] 77
root
16 2 24 5
7 1
62 3 88 6
21
2.二叉堆
自上而下构建堆
[0] 数组 h
[1] 7
[ 2 ] 16
[ 3 ] 62
16
[ 4 ] 50
2
[ 5 ] 24
50
[ 6 ] 88
4
[ 7 ] 77
root 7 1
24 5
62
3
88
77
6
7
22
2.二叉堆
自上而下构建堆时间复杂度
最大比较次数:log2+log3+……log(n-1)+logn
Y轴
y=logn
求 y=logx 的积分的示意图
2
1 1 234
n
log(n!) = Σ logj
j=2
n+1
≤
logx dx
2
n n+1 X轴
上述积分值为:(n+1)log(n+1)-(n+1)loge + 2loge - 2 ; 它是O ( n logn ) 的。
依次插入每个元素,总保证堆序性
2.自下而上构建
N个元素不考虑堆序性,直接存储到一个完全 二叉树中;
从第N/2个元素到第一个元素依次使用下滤, 就得到一个堆。
12
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 50
root
[ 2 ] 16 [ 3 ] 62 [ 4 ] 24 [5] 7
root 16 1
62 3
16
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
[ 2 ] 24
[ 3 ] 62 [ 4 ] 50 [5] 7
24 2
50
[ 6 ] 88
4
[ 7 ] 77
root 16 1
62 3
17
2.二叉堆
自上而下构建堆
[0] 数组 h
[ 1 ] 16
[ 2 ] 24