算法合集之《左偏树的特点及其应用》-讲义

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8个节点的左偏树的最大 距离:log(8+1) -1 = 2
最右路径长度即 为左偏树的距离
Winter Camp 2005 演示稿
左偏树的操作
左偏树支持下面这些操作:
– MakeNull —— 初始化一棵空的左偏树 – Merge —— 合并两棵左偏树 – Insert —— 插入一个新节点 – Min —— 取得最小节点 – DeleteMin —— 删除最小节点 – Delete —— 删除任意已知节点 – Decrease —— 减小一个节点的键值
合并操作都是一直沿着两棵左偏树的最 右路径进行的。
一棵N个节点的左偏树,最右路径上最 多有 log(N+1) 个节点。
因此,合并操作的时间复杂度为: O(log N1 + log N2) = O(log N)
18
Winter Camp 2005 演示稿
左偏树的操作 —— 插入
插入一个新节点
End Function
9
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
下面是一个合并的例子:
Merge (3, 6)
31
62
10 1
80
源自文库
12 1
71
17 0
18 0 24 0
37 0 18 0
26 0
10
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
下面是一个合并的例子:
Merge (3, 6)
16
0 10
3? 62
12
7
18
24
8
37
17
18
26
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
下面是一个合并的例子:
Merge (3, 6)
26
31
10 0
12
7
18
24
8
37
17
18
26
17
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
2
Winter Camp 2005 演示稿
左偏树的定义 —— 左偏性质
定义一棵左偏树中的外节点(External Node) 为 左子树或右子树为空的节点。
定义节点 i 的距离(dist(i)) 为节点 i 到它的后代 中,最近的外节点所经过的边数。
任意节点的左子节点的距离不小于右子节点的 距离(左偏性质)。
14
7?
0 37
81
17
18
26
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
下面是一个合并的例子:
Merge (8, 6) Merge (3, 6)
15
62
12 1
71
18
24
8
37
17
18
26
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
下面是一个合并的例子:
例题:数字序列
给定一个整数序列 a1 , a2 , … , an,求一 个不下降序列 b1≤b2≤…≤bn,使得数列 {ai} 和 {bi} 的各项之差的绝对值之和 |a1 b1| + |a2 - b2| + … + |an - bn| 最小。
算法合集之《左偏 树的特点及其应用》
精品
Winter Camp 2005 演示稿
左偏树的定义
左偏树(Leftist Tree)是一种可并堆(Mergeable Heap) ,它除了支持优先队列的三个基本操作 (插入,删除,取最小节点),还支持一个很 特殊的操作——合并操作。
左偏树是一棵堆有序(Heap Ordered)二叉树。 左偏树满足左偏性质(Leftist Property)。
– 把待插入节点作为一棵单节点左偏树 – 合并两棵左偏树 – 时间复杂度:O(log N)
Merge
19
Winter Camp 2005 演示稿
左偏树的操作 —— 删除
删除最小节点
– 删除根节点 – 合并左右子树 – 时间复杂度:O(log N)
Merge
20
Winter Camp 2005 演示稿
a merge
L1
R’
R1
先将T1的右子
b
树与T2合并
L2
R2
7
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
合并操作是递归进行的
a
dist(R’) > dist(L1)
L1
R’
a
R’
L1
合并后的右子 树距离可能大 于左子树距离
交换左右子树 并更新根节点
距离
8
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
下面是一个合并的例子:
Merge (8,18) Merge (8, 7) Merge (8, 6) Merge (3, 6)
8
17
NULL
18
26
13
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
下面是一个合并的例子:
Merge (8, 7) Merge (8, 6) Merge (3, 6)
5
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
合并操作是递归进行的
merge T1 a
L1
R1
T2 b
a
a<b L1
先将T1的右子 树与T2合并
L2
R2
6
合并T1和T2两 棵左偏树
merge
R1 b
L2
R2
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
合并操作是递归进行的
Merge (8, 6) Merge (3, 6)
11
8 17 26
6
12
18
24
7
37
18
Winter Camp 2005 演示稿
左偏树的操作 —— 合并
下面是一个合并的例子:
Merge (8, 7) Merge (8, 6) Merge (3, 6)
8 17 26
12
7
37
18
Winter Camp 2005 演示稿
由左偏性质可知,一个节点的距离等于以该节 点为根的子树最右路径的长度。
3
Winter Camp 2005 演示稿
左偏树的性质
定理:若一棵左偏树有N个节点,则该左偏树 的距离不超过 log(N+1) -1。
A2
B1
C1
D0 E 0 H0
F0 G0
4
最右路径: A-C-G 最右路径节点数 = 3 距离 = 2
左偏树的操作 —— 合并
合并操作的代码如下:
Function Merge(A, B) If A = NULL Then return B If B = NULL Then return A If key(B) < key(A) Then swap(A, B) right(A) ← Merge(right(A), B) If dist(right(A)) > dist(left(A)) Then swap(left(A), right(A)) If right(A) = NULL Then dist(A) ← 0 Else dist(A) ← dist(right(A)) + 1 return A
相关文档
最新文档