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

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

左偏树的特点及其应用

广东省中山市第一中学黄源河

【摘要】

本文较详细地介绍了左偏树的特点以及它的各种操作。

第一部分提出可并堆的概念,指出二叉堆的不足,并引出左偏树。第二部分主要介绍了左偏树的定义和性质。第三部分详细地介绍了左偏树的各种操作,并给出时间复杂度分析。第四部分通过一道例题,说明左偏树在当今信息学竞赛中的应用。第五部分对各种可并堆作了一番比较。最后总结出左偏树的特点以及应用前景。

【关键字】左偏树可并堆优先队列

【目录】

一、引言 (2)

二、左偏树的定义和性质 (2)

2.1 优先队列,可并堆 (2)

2.1.1 优先队列的定义 (2)

2.1.2 可并堆的定义 (2)

2.2 左偏树的定义 (3)

2.3 左偏树的性质 (4)

三、左偏树的操作 (6)

3.1 左偏树的合并 (6)

3.2 插入新节点 (8)

3.3 删除最小节点 (9)

3.4 左偏树的构建 (9)

3.5 删除任意已知节点 (10)

3.6 小结 (13)

四、左偏树的应用 (15)

4.1 例——数字序列(Baltic 2004) (15)

五、左偏树与各种可并堆的比较 (18)

5.1 左偏树的变种——斜堆 (18)

5.2 左偏树与二叉堆的比较 (19)

5.3 左偏树与其他可并堆的比较 (19)

六、总结 (22)

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

【正文】

一、引言

优先队列在信息学竞赛中十分常见,在统计问题、最值问题、模拟问题和贪心问题等等类型的题目中,优先队列都有着广泛的应用。二叉堆是一种常用的优先队列,它编程简单,效率高,但如果问题需要对两个优先队列进行合并,二叉堆的效率就无法令人满意了。本文介绍的左偏树,可以很好地解决这类问题。

二、左偏树的定义和性质

在介绍左偏树之前,我们先来明确一下优先队列和可并堆的概念。

2.1优先队列,可并堆

2.1.1优先队列的定义

优先队列(Priority Queue)是一种抽象数据类型(ADT),它是一种容器,里面有一些元素,这些元素也称为队列中的节点(node)。优先队列的节点至少要包含一种性质:有序性,也就是说任意两个节点可以比较大小。为了具体起见我们假设这些节点中都包含一个键值(key),节点的大小通过比较它们的键值而定。优先队列有三个基本的操作:插入节点(Insert),取得最小节点(Minimum) 和删除最小节点(Delete-Min)。

2.1.2可并堆的定义

可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),还支持一个额外的操作——合并操作:

H ← Merge(H1,H2)

Merge( ) 构造并返回一个包含H1和H2所有元素的新堆H。

前面已经说过,如果我们不需要合并操作,则二叉堆是理想的选择。可惜合并二叉堆的时间复杂度为O(n),用它来实现可并堆,则合并操作必然成为算法的瓶颈。左偏树(Leftist Tree)、二项堆(Binomial Heap) 和Fibonacci堆(Fibonacci Heap) 都是十分优秀的可并堆。本文讨论的是左偏树,在后面我们将看到各种可并堆的比较。

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

2.2左偏树的定义

左偏树(Leftist Tree)是一种可并堆的实现。左偏树是一棵二叉树,它的节点除了和二叉树的节点一样具有左右子树指针( left, right )外,还有两个属性:键值和距离(dist)。键值上面已经说过,是用于比较节点的大小。距离则是如下定义的:

节点i称为外节点(external node),当且仅当节点i的左子树或右子树为空( left(i) = NULL或right(i) = NULL );节点i的距离(dist(i))是节点i到它的后代中,最近的外节点所经过的边数。特别的,如果节点i本身是外节点,则它的距离为0;而空节点的距离规定为-1 (dist(NULL) = -1)。在本文中,有时也提到一棵左偏树的距离,这指的是该树根节点的距离。

左偏树满足下面两条基本性质:

[性质1] 节点的键值小于或等于它的左右子节点的键值。

即key(i)≤key(parent(i)) 这条性质又叫堆性质。符合该性质的树是堆有序的(Heap-Ordered)。有了性质1,我们可以知道左偏树的根节点是整棵树的最小节点,于是我们可以在O(1) 的时间内完成取最小节点操作。

[性质2] 节点的左子节点的距离不小于右子节点的距离。

即dist(left(i))≥dist(right(i)) 这条性质称为左偏性质。性质2是为了使我们可以以更小的代价在优先队列的其它两个基本操作(插入节点、删除最小节点)进行后维持堆性质。在后面我们就会看到它的作用。

这两条性质是对每一个节点而言的,因此可以简单地从中得出,左偏树的左右子树都是左偏树。

由这两条性质,我们可以得出左偏树的定义:左偏树是具有左偏性质的堆有序二叉树。

下图是一棵左偏树:

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

2.3 左偏树的性质

在前面一节中,本文已经介绍了左偏树的两个基本性质,下面本文将介绍左偏树的另外两个性质。

我们知道,一个节点必须经由它的子节点才能到达外节点。由于性质2,一个节点的距离实际上就是这个节点一直沿它的右边到达一个外节点所经过的边数,也就是说,我们有

[性质3] 节点的距离等于它的右子节点的距离加1。

即 dist( i ) = dist( right( i ) ) + 1 外节点的距离为0,由于性质2,它的右子节点必为空节点。为了满足性质3,故前面规定空节点的距离为-1。

我们的印象中,平衡树是具有非常小的深度的,这也意味着到达任何一个节点所经过的边数很少。左偏树并不是为了快速访问所有的节点而设计的,它的目的是快速访问最小节点以及在对树修改后快速的恢复堆性质。从图中我们可以看到它并不平衡,由于性质2的缘故,它的结构偏向左侧,不过距离的概念和树的深度并不同,左偏树并不意味着左子树的节点数或是深度一定大于右子树。

下面我们来讨论左偏树的距离和节点数的关系。

[引理1] 若左偏树的距离为一定值,则节点数最少的左偏树是完全二叉树。 证明:由性质2可知,当且仅当对于一棵左偏树中的每个节点i ,都有 dist(left(i)) = dist(right(i)) 时,该左偏树的节点数最少。显然具有这样性质的二叉树是完全二叉树。

[定理1] 若一棵左偏树的距离为k ,则这棵左偏树至少有2k+1-1个节点。 证明:由引理1可知,当这样的左偏树节点数最少的时候,是一棵完全二叉树。距离为k 的完全二叉树高度也为k ,节点数为2k+1-1,所以距离为k 的左偏0 1

2 18

3 1 12 1 18 0 2

4 0 18 0 37 0 33 0

6 1 14 0 21 0 1

7 0 6 2

23 0 26

0 10 1

key dist

Node:

key

dist

L R

树至少有2k+1-1个节点。

作为定理1的推论,我们有:

[性质4] 一棵N个节点的左偏树距离最多为?log(N+1)? -1。

证明:设一棵N个节点的左偏树距离为k,由定理1可知,N ≥2k+1-1,因此k ≤?log(N+1)? -1。

有了上面的4个性质,我们可以开始讨论左偏树的操作了。

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

三、左偏树的操作

本章将讨论左偏树的各种操作,包括插入新节点、删除最小节点、合并左偏树、构建左偏树和删除任意节点。由于各种操作都离不开合并操作,因此我们先讨论合并操作。

3.1左偏树的合并

C ← Merge(A,B)

Merge( ) 把A,B两棵左偏树合并,返回一棵新的左偏树C,包含A和B中的所有元素。在本文中,一棵左偏树用它的根节点的指针表示。

在合并操作中,最简单的情况是其中一棵树为空(也就是,该树根节点指针为NULL)。这时我们只须要返回另一棵树。

若A和B都非空,我们假设A的根节点小于等于B的根节点(否则交换A,B),把A的根节点作为新树C的根节点,剩下的事就是合并A的右子树right(A) 和B

了。

合并了right(A) 和B之后,right(A) 的距离可能会变大,当right(A) 的距离大于left(A) 的距离时,左偏树的性质2会被破坏。在这种情况下,我们只须要交换left(A) 和right(A)

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

最后,由于right(A) 的距离可能发生改变,我们必须更新A的距离:

dist(A) ← dist(right(A)) + 1

不难验证,经这样合并后的树C符合性质1和性质2,因此是一棵左偏树。至此左偏树的合并就完成了。

下图是一个合并过程的示例:

合并流程

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

我们可以用下面的代码描述左偏树的合并过程:

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

End Function

下面我们来分析合并操作的时间复杂度。从上面的过程可以看出,每一次递归合并的开始,都需要分解其中一棵树,总是把分解出的右子树参加下一步的合并。根据性质3,一棵树的距离决定于其右子树的距离,而右子树的距离在每次分解中递减,因此每棵树A或B被分解的次数分别不会超过它们各自的距离。根据性质4,分解的次数不会超过?log(N1+1)? + ?log(N2+1)? -2,其中N1和N2分别为左偏树A和B的节点个数。因此合并操作最坏情况下的时间复杂度为O( ?log(N1+1)? + ?log(N2+1)? -2) = O(log N1 + log N2)。

3.2插入新节点

单节点的树一定是左偏树,因此向左偏树插入一个节点可以看作是对两棵左偏树的合并。下面是插入新节点的代码:

Procedure Insert(x, A)

B ← MakeIntoTree(x)

A ← Merge(A, B)

End Procedure

由于合并的其中一棵树只有一个节点,因此插入新节点操作的时间复杂度是O(logn)。

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html, 3.3 删除最小节点

由性质1,我们知道,左偏树的根节点是最小节点。在删除根节点后,剩下的两棵子树都是左偏树,需要把他们合并。删除最小节点操作的代码也非常简单:

由于删除最小节点后只需进行一次合并,因此删除最小节点的时间复杂度也为O(log n)。

3.4 左偏树的构建

将n 个节点构建成一棵左偏树,这也是一个常用的操作。

算法一 暴力算法——逐个节点插入,时间复杂度为O(n log n)。

算法二 仿照二叉堆的构建算法,我们可以得到下面这种算法:

将n 个节点(每个节点作为一棵左偏树)放入先进先出队列。

不断地从队首取出两棵左偏树,将它们合并之后加入队尾。

当队列中只剩下一棵左偏树时,算法结束。

Function DeleteMin(A)

t ← key(root(A))

A ← Merge(left(A), right(A))

return t

End Function

5 6 4 3 2 1

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

构建流程

下面分析算法二的时间复杂度。假设n=2k ,则:

2

n 次和并的是两棵只有1个节点的左偏树。 接下来的4

n 次合并的是两棵有2个节点的左偏树。 接下来的8

n 次合并的是两棵有4个节点的左偏树。 ……

接下来的i n 2次合并的是两棵有2i-1个节点的左偏树。

合并两棵2i 个节点的左偏树时间复杂度为O(i ),因此算法二的总时间复杂

度为:∑==+-==?+++k i k i n O k n O i n O O n O n O n 1)())222(*()2

*()3(*8)2(*4)1(*2。

3.5 删除任意已知节点

接下来是关于删除任意已知节点的操作。之所以强调“已知”,是因为这里2 1 4 3 5 6 5 6

4

3 2 1 5 6

4 3 2 1

5

6 4

3

2 1 2

1 4 3 5 6

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html, 所说的任意节点并不是根据它的键值找出来的,左偏树本身除了可以迅速找到最小节点外,不能有效的搜索指定键值的节点。故此,我们不能要求:请删除所有键值为100的节点。

前面说过,优先队列是一种容器。对于通常的容器来说,一旦节点被放进去以后,容器就完全拥有了这个节点,每个容器中的节点具有唯一的对象掌握它的拥有权(ownership )。对于这种容器的应用,优先队列只能删除最小节点,因为你根本无从知道它的其它节点是什么。

但是优先队列除了作为一种容器外还有另一个作用,就是可以找到最小节点。很多应用是针对这个功能的,它们并没有将拥有权完全转移给优先队列,而是把优先队列作为一个最小节点的选择器,从一堆节点中依次将它们选出来。这样一来节点的拥有权就可能同时被其它对象掌握。也就是说某个节点虽不是最小节点,不能从优先队列那里“已知”,但却可以从其它的拥有者那里“已知”。

这种优先队列的应用也是很常见的。设想我们有一个闹钟,它可以记录很多个响铃时间,不过由于时间是线性的,铃只能一个个按先后次序响,优先队列就很适合用来作这样的挑选。另一方面使用者应该可以随时取消一个“已知”的响铃时间,这就需要进行任意已知节点的删除操作了。

我们的这种删除操作需要指定被删除的节点,这和原来的删除根节点的操作是兼容的,因为根节点肯定是已知的。上面已经提过,在删除一个节点以后,将会剩下它的两棵子树,它们都是左偏树,我们先把它们合并成一棵新的左偏树。

p ← Merge(left(x), right(x))

现在p 指向了这颗新的左偏树,如果我们删除的是根节点,此时任务已经完成了。不过,如果被删除节点x 不是根节点就有点麻烦了。这时p 指向的新树的距离有可能比原来x 的距离要大或小,这势必有可能影响原来x 的父节点q 的距离,因为q 现在成为新树p 的父节点了。于是就要仿照合并操作里面的做法,对q 的左右子树作出调整,并更新q 的距离。这一过程引起了连锁反应,我们要顺着q 的父节点链一直往上进行调整。

新树p 的距离为dist(p),如果dist(p)+1等于q 的原有距离dist(q),那么不管p 是q 的左子树还是右子树,我们都不需要对q 进行任何调整,此时删除操作也就完成了。

q

p x q

如果dist(p)+1小于q的原有距离dist(q),那么q的距离必须调整为dist(p)+1,而且如果p是左子树的话,说明q的左子树距离比右子树小,必须交换子树。由于q的距离减少了,所以q的父节点也要做出同样的处理。

剩下就是另外一种情况了,那就是p的距离增大了,使得dist(p)+1大于q 的原有距离dist(q)。在这种情况下,如果p是左子树,那么q的距离不会改变,此时删除操作也可以结束了。如果p是右子树,这时有两种可能:一种是p的距离仍小于等于q的左子树距离,这时我们直接调整q的距离就行了;另一种是p 的距离大于q的左子树距离,这时我们需要交换q的左右子树并调整q的距离,交换完了以后q的右子树是原来的左子树,它的距离加1只能等于或大于q的原有距离,如果等于成立,删除操作可以结束了,否则q的距离将增大,我们还要对q的父节点做出相同的处理。

删除任意已知节点操作的代码如下:

Procedure Delete(x)

q ← parent(x)

p ← Merge(left(x), right(x))

parent(p) ← q

If q ≠ NULL and left(q) = x Then

left(q) ← p

If q ≠ NULL and right(q) = x Then

right(q) ← p

While q ≠ NULL Do

If dist(left(q)) < dist(right(q))Then

swap(left(q), right(q))

If dist(right(q))+1 = dist(q)Then

Exit Procedure

dist(q) ← dist(right(q))+1

p ← q

q ← parent(q)

End While

End Procedure

下面分两种情况讨论删除操作的时间复杂度。

情况1:p的距离减小了。在这种情况下,由于q的距离只能缩小,当循环结束时,要么根节点处理完了,q为空;要么p是q的右子树并且dist(p)+1=dist(q);如果dist(p)+1>dist(q),那么p一定是q的左子树,否则会出现q的右子树距离缩小了,但是加1以后却大于q的距离的情况,不符合左偏树的性质3。不论哪种情况,删除操作都可以结束了。注意到,每一次循环,p的距离都会加1,而在循环体内,dist(p)+1最终将成为某个节点的距离。根据性质4,任何的距离都不

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

会超过logn,所以循环体的执行次数不会超过log n。

情况2:p的距离增大了。在这种情况下,我们将必然一直从右子树向上调整,直至q为空或p是q的左子树时停止。一直从右子树升上来这个事实说明了循环的次数不会超过log n(性质4)。

最后我们看到这样一个事实,就是这两种情况只会发生其中一个。如果某种情况的调整结束后,我们已经知道要么q为空,要么dist(p)+1 = dist(q),要么p 是q的左子树。这三种情况都不会导致另一情况发生。直观上来讲,如果合并后的新子树导致了父节点的一系列距离调整的话,要么就一直是往小调整,要么是一直往大调整,不会出现交替的情况。

我们已经知道合并出新子树p的复杂度是O(logn),向上调整距离的复杂度也是O(logn),故删除操作的最坏情况的时间复杂度是O(log n)。如果左偏树非常倾斜,实际应用情况下要比这个快得多。

3.6小结

本章介绍了左偏树的各种操作,我们可以看到,左偏树作为可并堆的实现,它的各种操作性能都十分优秀,且编程复杂度比较低,可以说是一个“性价比”十分高的数据结构。左偏树之所以是很好的可并堆实现,是因为它能够捕捉到具有堆性质的二叉树里面的一些其它有用信息,没有将这些信息浪费掉。根据堆性质,我们知道,从根节点向下到任何一个外节点的路径都是有序的。存在越长的路径,说明树的整体有序性越强,与平衡树不同(平衡树根本不允许有很长的路径),左偏树尽大约一半的可能保留了这个长度,并将它甩向左侧,利用它来缩短节点的距离以提高性能。这里我们不进行严格的讨论,左偏树作为一个例子大致告诉我们:放弃已有的信息意味着算法性能上的牺牲。下面是最好的左偏树:有序表(插入操作是按逆序发生的,自然的有序性被保留了)和最坏的左偏树:平衡树(插入操作是按正序发生的,自然的有序性完全被放弃了)。

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

1

2

3 4 5

6

7 有序表 平衡树 1 2

3

4

5 6

7

四、左偏树的应用

4.1例——数字序列(Baltic 2004)

[问题描述]*

给定一个整数序列a1, a2, … , a n,求一个不下降序列b1≤ b2≤…≤ b n,使得数列{a i}和{b i}的各项之差的绝对值之和|a1 - b1| + |a2 - b2| + … + |a n - b n| 最小。

[数据规模] 1 ≤ n ≤ 106, 0 ≤ a i≤ 2*109

[初步分析]

我们先来看看两个最特殊的情况:

1.a[1]≤a[2]≤…≤a[n],在这种情况下,显然最优解为b[i]=a[i];

2.a[1]≥a[2]≥…≥a[n],这时,最优解为b[i]=x,其中x是数列a的中位数?。

于是我们可以初步建立起这样一个思路:

把1…n划分成m个区间:[q[1],q[2]-1],[q[2],q[3]-1],……,[q[m],q[m+1]-1]?。每个区间对应一个解,b[q[i]] = b[q[i]+1] = … = b[q[i+1]-1] = w[i],其中w[i] 为a[q[i]], a[q[i]+1], ... , a[q[i+1]-1] 的中位数。

显然,在上面第一种情况下m=n,q[i]=i;在第二种情况下m=1,q[1]=1。

这样的想法究竟对不对呢?应该怎样实现?

若某序列前半部分a[1], a[2], …, a[n] 的最优解为(u,u,…,u),后半部分a[n+1], a[n+2], ... , a[m] 的最优解为(v,v,…,v),那么整个序列的最优解是什么呢?若u≤v,显然整个序列的最优解为(u,u,…,u,v,v,…,v)。否则,设整个序列的最优解为(b[1],b[2],…,b[m]),则显然b[n]≤u(否则我们把前半部分的解(b[1],b[2],…,b[n]) 改为(u,u,…,u),由题设知整个序列的解不会变坏),同理b[n+1]≥v。接下来,我们将看到下面这个事实:

对于任意一个序列a[1],a[2],…,a[n],如果最优解为(u,u,…,u),那么在满足u≤u′≤b[1] 或b[n]≤u′≤u的情况下,(b[1],b[2],…,b[n]) 不会比(u′,u′,…,u′) 更优。

我们用归纳法证明u≤u′≤b[1] 的情况,b[n]≤u′≤u的情况可以类似证明。

当n=1时,u=a[1],命题显然成立。

当n>1时,假设对于任意长度小于n的序列命题都成立,现在证明对于长度为n的序列命题也成立。首先把(b[1], b[2], … b[n]) 改为(b[1], b[1], … b[1]),这一改动将不会导致解变坏,因为如果解变坏了,由归纳假设可知a[2],a[3],…,a[n]的中位数w>u,这样的话,最优解就应该为(u,u,…,u,w,w,…,w),矛盾。然后我们再把(b[1],b[1],…,b[1])改为(u′,u′,…,u′),由于| a[1]- x | + | a[2]- x |

*题目来源:Baltic OI 2004 Day 1, Sequence 本文对原题略微做了改动

?为了方便讨论和程序实现,本文中提到的中位数,都是指数列中第?n/2?大的数

?这里我们认为q[m+1] = n+1

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

+ … + | a[n]- x | 的几何意义为数轴上点x到点a[1], a[2], … a[n]的距离之和,且u≤u′≤b[1],显然点u′到各点的距离之和不会比点b[1]到各点的距离之和大,也就是说,(b[1],b[1],…,b[n]) 不会比(v,v,…,v) 更优。(证毕)

再回到之前的论述,由于b[n]≤u,作为上述事实的结论,我们可以得知,将(b[1],b[2],…,b[n])改为(b[n],b[n],…,b[n]),再将(b[n+1],b[n+2],…,b[m])改为(b[n+1],b[n+1],…,b[n+1]),并不会使解变坏。也就是说,整个序列的最优解为(b[n],b[n],…,b[n],b[n+1],b[n+1],…,b[n+1])。再考虑一下该解的几何意义,设整个序列的中位数为w,则显然令b[n]=b[n+1]=w将得到整个序列的最优解,即最优解为(w,w,…,w)。

分析到这里,我们一开始的想法已经有了理论依据,算法也不难构思了。

[算法描述]

延续我们一开始的思路,假设我们已经找到前k个数a[1], a[2], … , a[k] (kw[m+1],我们需要将最后两个区间合并,并找出新区间的最优解(也就是序列a中,下标在这个新区间内的各项的中位数)。重复这个合并过程,直至w[1]≤w[2]≤…≤w[m]时结束,然后继续处理下一个数。

这个算法的正确性前面已经论证过了,现在我们需要考虑一下数据结构的选取。算法中涉及到以下两种操作:合并两个有序集以及查询某个有序集内的中位数。能较高效地支持这两种操作的数据结构有不少,一个比较明显的例子是二叉检索树(BST),它的询问操作复杂度是O(logn),但合并操作不甚理想,采用启发式合并,总时间复杂度为O(n log2n)。

有没有更好的选择呢?通过进一步分析,我们发现,只有当某一区间内的中位数比后一区间内的中位数大时,合并操作才会发生,也就是说,任一区间与后面的区间合并后,该区间内的中位数不会变大。于是我们可以用最大堆来维护每个区间内的中位数,当堆中的元素大于该区间内元素的一半时,删除堆顶元素,这样堆中的元素始终为区间内较小的一半元素,堆顶元素即为该区间内的中位数。考虑到我们必须高效地完成合并操作,左偏树是一个理想的选择*。左偏树的询问操作时间复杂度为O(1),删除和合并操作时间复杂度都是O(logn),而询问操作和合并操作少于n次,删除操作不超过n/2次(因为删除操作只会在合并两个元素个数为奇数的堆时发生),因此用左偏树实现,可以把算法的时间复杂度降为O(n log n)。

[小结]

这道题的解题过程对我们颇有启示。在应用左偏树解题时,我们往往会觉得题目无从下手,甚至与左偏树毫无关系,但只要我们对题目深入分析,加以适当的转化,问题终究会迎刃而解。这需要我们具有敏捷的思维以及良好的题感。

用左偏树解本题,相比较于前面BST的解法,时间复杂度和编程复杂度更低,这使我们不得不感叹于左偏树的神奇威力。这不是说左偏树就一定是最好的

*前面介绍的左偏树是最小堆,但在本题中,显然只需把左偏树的性质稍做修改,就可以实现最大堆了

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

解法,就本题来说,解法有很多种,光是可并堆的解法,就可以用多种数据结构来实现,但左偏树相对于它们,还是有一定的优势的,这将在下一章详细讨论。

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

五、左偏树与各种可并堆的比较

我们知道,左偏树是一种可并堆的实现。但是为什么我们要用左偏树实现可并堆呢?左偏树相对于其他可并堆有什么优点?本章将就这个问题展开讨论,介绍各种可并堆的特点,并对它们做出比较。

5.1左偏树的变种——斜堆

这里我们要介绍左偏树的一个变种——斜堆(Skew Heap)。斜堆是一棵堆有序的二叉树,但是它不满足左偏性质,或者说,斜堆根本就没有“距离”这个概念——它不需要记录任何一个节点的距离。从结构上来说,所有的左偏树都是斜堆,但反之不然。

类似于左偏树,斜堆的各种操作也是在合并操作的基础上完成的,因此这里只介绍斜堆的合并操作,其他操作读者都可以仿照左偏树完成。

斜堆合并操作的递归合并过程和左偏树完全一样。假设我们要合并A和B 两个斜堆,且A的根节点比B的根节点小,我们只需要把A的根节点作为合并后新堆的根节点,并将A的右子树与B合并。由于合并都是沿着最右路径进行的,经过合并之后,新堆的最右路径长度必然增加,这会影响下一次合并的效率。为了解决这一问题,左偏树在进行合并的同时,检查最右路径节点的距离,并通过交换左右子树,使整棵树的最右路径长度非常小。然而斜堆不记录节点的距离,那么应该怎样维护最右路径呢?我们采取的办法是,从下往上,沿着合并的路径,在每个节点处都交换左右子树。

下面是斜堆合并操作的代码:

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)

swap(left(A), right(A))

return A

End Function

斜堆的这种维护方法也是行之有效的。通过不断交换左右子树,斜堆把最右路径甩向左边了。可以证明,斜堆合并操作的平摊时间复杂度为O(log n)。这里略去详细的复杂度分析,感兴趣的读者可以自行参考相关的资料。

前面说过,斜堆的其他各种操作都和左偏树类似,因此斜堆各项操作的平摊时间复杂度都与左偏树相同。在空间上,由于斜堆不用记录节点的距离,因此它比左偏树的空间需求小一点。至于编程复杂度,两者都十分的低,不过斜堆的代

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

码还是要比左偏树稍微简洁一些。至于斜堆的不足,大概可以算是它单次合并操作的时间复杂度可能退化为O(n),不过通常这并不影响算法的总时间复杂度。

总的来说,斜堆作为左偏树的变种,与左偏树并无优劣之分。在斜堆能派上用场的地方,左偏树同样能出色地实现算法。斜堆与左偏树之间的关系,可以类比于伸展树与A VL树之间的关系,只不过前两者的编程复杂度,并没有多大的差别。

5.2左偏树与二叉堆的比较

二叉堆大概是我们最常用的一种优先队列了,它具有简洁,高效的特点,应用十分广泛。二叉堆和左偏树相比,除了合并操作外的各种操作,时间复杂度都一样,但在实际测试中,二叉堆往往比左偏树快一些。在空间上,由于二叉堆是完全二叉树,用数组表示法,可以剩下左右子树指针的空间,在这点上左偏树又吃了一亏。

介绍了二叉堆的优点,下面的这两个缺点也是不容忽视的:

1.在进行插入、删除等操作后,二叉堆中元素的物理位置会发生改变。

2.二叉堆的合并操作太慢,时间复杂度高达O(n)。

当元素本身所占空间比较大时,频繁地移动元素物理位置将会影响时间效率。而有些时候,我们需要随时掌握某些元素的物理位置,以便对它进行访问或修改(比如实现删除任意已知节点操作),这时,二叉堆的第一个缺点将给我们造成一定的麻烦,我们不得不通过增加元素指针等手段来解决这个问题。而二叉堆合并效率的低下则是由其本身性质所造成的,采用启发式合并可以作为大多数情况下的一个优化,但效果仍不能令人满意。

至于二叉堆空间上的优势,也不是绝对的。数组表示法并不是在任何场合都适用的,比如当我们需要动态维护多个优先队列的时候,二叉堆不得不使用传统的指针表示法,这时二叉堆和左偏树在空间上就相差无几了。

二叉堆的上述特点,决定了它不适合作为可并堆的实现。客观的说,需要实现可并堆的题目在竞赛中并不多见,不过当我们遇到这类题目或者某些特殊的情况时,左偏树将会是比二叉堆更好的选择。

5.3 左偏树与其他可并堆的比较

前面已经提到过,可并堆可以用多种数据结构实现,左偏树并非唯一的选择。二项堆,Fibonacci堆都是时间效率十分优秀的可并堆。

二项堆是由若干棵深度不同的二项树组成的森林。深度为k的二项树B k由两棵二项树B k-1连接根节点而成,有2k个节点,并且满足堆性质。二项树组成二项堆的形式可以看作总节点数n的二进制表示形式,两个二项堆的合并可以看

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

作二进制数的加法,这点很有启发意义。与左偏树类似,二项堆的各种操作也是在合并操作的基础上完成的。二项堆的结构和性质决定了它可以很高效地完成合并操作,与左偏树相比,虽然复杂度相同,但一般实际情况下二项堆比较快。但二项树实现取最小节点操作需要检查所有二项树的根节点,因此这项操作时间复杂度比左偏树高*。

Fibonacci堆是一个很复杂的数据结构,与二项堆一样,它也是由一组堆有序的树构成的。所不同的是,Fibonacci堆的树不一定是二项树,而且这些树是无序的,且树中兄弟节点的联系用双向循环链表来表示。Fibonacci堆实现插入操作和合并操作只是简单地将两个Fibonacci堆的根表连在一起,因此这两个操作比其他可并堆都快。但在删除操作时,我们需要对Fibonacci堆进行维护,合并所有度数相同的树,这一步异常复杂,并且是最慢的。

有关二项堆和Fibonacci堆的详细介绍,有兴趣的读者可以参考相关资料,本文不再赘述。下表列出了各种可并堆的各项操作的时间复杂度?,已及它们的空间需求和编程复杂度。

项目二叉堆左偏树二项堆Fibonacci堆构建O(n) O(n) O(n) O(n)

插入O(log n) O(logn) O(logn) O(1)

取最小节点O(1) O(1) O(logn) O(1)

删除最小节点O(log n) O(logn) O(logn) O(logn)

删除任意节点O(log n) O(logn) O(logn) O(logn) 合并O(n) O(logn) O(logn) O(1) 空间需求最小较小一般较大

编程复杂度最低较低较高很高

从表中我们可以看出,Fibonacci堆的时间复杂度非常低,如果我们不需要进行频繁的删除操作,用Fibonacci堆实现可并堆将会降低算法的时间复杂度。但实际上,删除操作往往是很重要的操作,而Fibonacci堆的删除操作比表中其它可并堆都慢,至于它的空间需求,也大得使人望而却步。更槽糕的是Fibonacci 堆的编程复杂度太高了,在竞赛中使用实在是不理智的行为。

至于二项堆,虽然各项操作的时间效率都十分优秀,但空间需求和编程复杂度仍然比不上左偏树。和左偏树相比,二项堆在时间效率上的优势微乎其微,用左偏树代替二项堆,的确会牺牲一些算法性能,但换来的却是简洁的代码,便于实现和调试的程序。在时间有限的竞赛中,左偏树无疑是更好的选择。

最后,我们应该认识到,虽然二项堆和Fibonacci堆某些操作的时间复杂度比左偏树低,但是在实际应用中,那些时间复杂度较高的操作往往会成为算法的瓶颈。比如前面的例题《数字序列》,改用二项堆或Fibonacci堆实现,总时间复

*这里其实有一个办法可以解决这个问题,就是随时记录最小节点,并只在插入、删除以及合并等操作进行的时候更新该记录,这样二项堆的取最小节点操作时间复杂度可以降为O(1)

?表中Fibonacci堆的“删除最小节点”和“删除任意节点”两个操作的时间复杂度均为平摊时间复杂度,而二项堆“插入”操作的平均时间复杂度为O(1),表中给出的是最坏时间复杂度

在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

最新设计方案范文合集6篇

1 建设物流实训室的必要性 在社会需求的推动下,20xx年起,全国部分学校开始试办“物流管理”等相关专业,为企业培养和输送物流专业人才。这在一定程度上对物流知识和思想的传播起到了很好的作用,也的确培养了一些物流人才。他们在相关的物流岗位上发挥了作用,有效地促进了企业物流运作的变革和进步。 但是,其中反映出的问题也不少,主要体现在以下几个方面: 1.1 偏重理论培训,缺少实践环节 目前在各种认证体系中,基本上以知识性学习为主,只有少量的实际操作环节。 现代物流业很注重实际操作经验,仅有理论知识难以解决企业的实际业务问题,物流培训也必须以此为重要原则,加强实训功能,注重对实际业务的理解和对实际操作技能的掌握,才能培养出符合企业需求的人才。 1.2 教学手段单一,感性认识与理性认识不能有机结合 目前无论是高校的物流学历教育还是职业培训,普遍存在一个问题,就是教学主要以教师分散授课为主,辅以少量甚至没有参观。学员们无法全面系统地了解物流运作的整个过程,除少量悟性较高的学员外,大多数学员的物流知识结构比较凌乱。 1.3 传统实训方式已不能满足学生和企业的需要 学生实训要求在类似企业实际的环境下,并且实训的设备、软件必须是企业实际应用的,或在企业实际应用基础上改造过来。 随着国内教育教学改革的深入,实训方式创新层出不穷,旧有的实训方式尤其是模拟仿真远远不能满足现有教学的需要。 2 物流实训室设计理念 通过实训室对各节点模拟,从而展现货物的入库、仓储、流通加工、配送、出库等第三方物流企业的供应链流程。在此模拟的供应链上,配备一系列模块化的现代物流设施,如:全自动立体仓库、电子标签辅助拣货系统、电子看板,RF手持设备等,它们各自独立,又互为联系,充分体现了传统的物流运行过程通过信息化实现其战略决策系统化,管理现代化和作业自动化这一现代物流的时代特征,从而在学校实训室内营造了一个类似真实的集物资流和信息流于一体的实训教学环境。 3 实训室方案规划设计 物流实训室平面布局 主要组成部分: 全自动立体仓库及自动分拣:立体货架、全自动堆垛机及输送装置等; 普通仓储货架:重型及轻型货架; 电子标签拣货系统:重力式货架、电子标签分拣系统及拣货台等; 打包封装:多种款式的打包设备; 条码及射频系统:RF手持终端、条码打印机及多种条码阅读设备; 管理岗位:物流软件、PC及桌椅。 4 实训系统功能 之所以要在学校实训室条件下,构建一个类似真实的以第三方物流服务单元为核心的供应链仿真系统,其真实目的是想以此为学校进行现代供应链物流运作管理等相关课程的课堂理论教学提供一个有效的辅助教学手段,并为学生掌握各种现代化,自动化的物流设施设备的操作技能,提供一个实实在在的实训平台。 所以从这个意义上说,我们这套实训系统应具有以下教学实训功能: 4.1 了解和学习物流管理的内容和技术 1、仓储管理系统的操作训练

算法分析与设计试卷

《算法分析与设计》试卷(A) (时间90分钟满分100分) 一、填空题(30分,每题2分)。 1.最长公共子序列算法利用的算法是( B )。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法2.在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( B ). A.回溯法 B.分支限界法 C.回溯法和分支限界法 D.回溯法求解子集树问题 3.实现最大子段和利用的算法是( B )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法4..广度优先是( A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法5.衡量一个算法好坏的标准是( C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 6.Strassen矩阵乘法是利用( A)实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 7. 使用分治法求解不需要满足的条件是( A )。 A 子问题必须是一样的 B 子问题不能够重复 C 子问题的解可以合并 D 原问题和子问题使用相同的方法解 8.用动态规划算法解决最大字段和问题,其时间复杂性为( B ). A.logn B.n C.n2 D.nlogn 9.解决活动安排问题,最好用( B )算法 A.分治 B.贪心 C.动态规划 D.穷举 10.下面哪种函数是回溯法中为避免无效搜索采取的策略( B ) A.递归函数 B.剪枝函数C。随机数函数 D.搜索函数11. 从活结点表中选择下一个扩展结点的不同方式将导致不同的分支限界法,以下除( C )之外都是最常见的方式. A.队列式分支限界法 B.优先队列式分支限界法 C.栈式分支限界法 D.FIFO分支限界法 12. .回溯算法和分支限界法的问题的解空间树不会是( D ). A.有序树 B.子集树 C.排列树 D.无序树 13.优先队列式分支限界法选取扩展结点的原则是( C )。 A、先进先出 B、后进先出 C、结点的优先级 D、随机14.下面是贪心算法的基本要素的是( C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解15.回溯法在解空间树T上的搜索方式是( A ). A.深度优先 B.广度优先 C.最小耗费优先 D.活结点优先 二、填空题(20分,每空1分)。 1.算法由若干条指令组成的又穷序列,且满足输入、输出、 确定性和有限性四个特性。 2.分支限界法的两种搜索方式有队列式(FIFO)分支限界法、优先队列式分支限界法,用一个队列来存储结点的表叫活节点表。

遗传算法合集

遗传算法合集 遗传算法简介 遗传算法是一类模拟生物进化的智能优化算法,它是由J.H.Holland于六十年代提出的。目前,遗传算法已成为进化计算研究的一个重要分支。 与传统优化方法相比,遗传算法的优点是: ·群体搜索 ·不需要目标函数的导数 ·概率转移准则 遗传算法研究热点 ·收敛性证明 ·新型高效的遗传算子设计 ·遗传算法与局部优化算法的结合 ·遗传算法在各领域的应用研究 ·软计算与计算智能中的遗传算法 遗传算法著作 1.陈国良等,遗传算法及其应用,国防出版社 2.J.H.Holland,Adaptation in Natural and Artificial Systems, Ann Arbor: Univ. of Michigan Press, 1975 3.D.E.Goldberg,Genetic Algorithms in Search, Optimization and Machine Learning. Reading, MA: Addison-Wesley, 1989 4.L.D.Davis, Handbook of Genetic Algorithms, Van Nostrand Reinhold 5.Z.Michalewicz, Genetic Algorithms + Data Structures=Evolution Programs, Spinger

Press,1996 6.M.Gen,R.Cheng,Genetic Algorithms & Engineering Design, 1997 7.Wiely,Genetic Algorithms in Engineering and Computer Science,1995 8.M.Mitchell,An Introducion to Genetic Algorithms,1996 9.Davis,Genetic Algorithms and Simulated Annealing,1987 10.Davidor,Genetic Algorithms and Robotics,1991 11.Koza,Genetic Programming,1992 12.Bauer,Genetic Algorithms and Investiment Strategies,1994 遗传算法站点 1.The Genetic Algorithms Archive https://www.360docs.net/doc/063224222.html,/galist/ 2.Genetic Adaptive Systems LAB (GASLAB) GASLAB is hosted by the Computer Science Department of the University of Nevada-Reno. https://www.360docs.net/doc/063224222.html,/~sushil/papers/conference/conf.html https://www.360docs.net/doc/063224222.html,/ 3.http://www.mat.sbg.ac.at/~uhl/GA.html 4.https://www.360docs.net/doc/063224222.html,/research/gag/ email:kdejong@https://www.360docs.net/doc/063224222.html, publications: (downloading website) https://www.360docs.net/doc/063224222.html,/research/gas/pubs.html 5.Illinois Genetic Algorithms Laboratory Prof. David E. Goldberg, Director https://www.360docs.net/doc/063224222.html,./illigal.home.html 6.Michigan State University Genetic Algorithms Research and Applications Group (GARAGE) Bill Punch (punch@https://www.360docs.net/doc/063224222.html,,517-353-3541) Erik Goodman (goodman@https://www.360docs.net/doc/063224222.html,,517-355-6453) https://www.360docs.net/doc/063224222.html,/

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

左偏树的特点及其应用 广东省中山市第一中学黄源河 【摘要】 本文较详细地介绍了左偏树的特点以及它的各种操作。 第一部分提出可并堆的概念,指出二叉堆的不足,并引出左偏树。第二部分主要介绍了左偏树的定义和性质。第三部分详细地介绍了左偏树的各种操作,并给出时间复杂度分析。第四部分通过一道例题,说明左偏树在当今信息学竞赛中的应用。第五部分对各种可并堆作了一番比较。最后总结出左偏树的特点以及应用前景。 【关键字】左偏树可并堆优先队列 【目录】 一、引言 (2) 二、左偏树的定义和性质 (2) 2.1 优先队列,可并堆 (2) 2.1.1 优先队列的定义 (2) 2.1.2 可并堆的定义 (2) 2.2 左偏树的定义 (3) 2.3 左偏树的性质 (4) 三、左偏树的操作 (6) 3.1 左偏树的合并 (6) 3.2 插入新节点 (8) 3.3 删除最小节点 (9) 3.4 左偏树的构建 (9) 3.5 删除任意已知节点 (10) 3.6 小结 (13) 四、左偏树的应用 (15) 4.1 例——数字序列(Baltic 2004) (15) 五、左偏树与各种可并堆的比较 (18) 5.1 左偏树的变种——斜堆 (18) 5.2 左偏树与二叉堆的比较 (19) 5.3 左偏树与其他可并堆的比较 (19) 六、总结 (22) 在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

【正文】 一、引言 优先队列在信息学竞赛中十分常见,在统计问题、最值问题、模拟问题和贪心问题等等类型的题目中,优先队列都有着广泛的应用。二叉堆是一种常用的优先队列,它编程简单,效率高,但如果问题需要对两个优先队列进行合并,二叉堆的效率就无法令人满意了。本文介绍的左偏树,可以很好地解决这类问题。 二、左偏树的定义和性质 在介绍左偏树之前,我们先来明确一下优先队列和可并堆的概念。 2.1优先队列,可并堆 2.1.1优先队列的定义 优先队列(Priority Queue)是一种抽象数据类型(ADT),它是一种容器,里面有一些元素,这些元素也称为队列中的节点(node)。优先队列的节点至少要包含一种性质:有序性,也就是说任意两个节点可以比较大小。为了具体起见我们假设这些节点中都包含一个键值(key),节点的大小通过比较它们的键值而定。优先队列有三个基本的操作:插入节点(Insert),取得最小节点(Minimum) 和删除最小节点(Delete-Min)。 2.1.2可并堆的定义 可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),还支持一个额外的操作——合并操作: H ← Merge(H1,H2) Merge( ) 构造并返回一个包含H1和H2所有元素的新堆H。 前面已经说过,如果我们不需要合并操作,则二叉堆是理想的选择。可惜合并二叉堆的时间复杂度为O(n),用它来实现可并堆,则合并操作必然成为算法的瓶颈。左偏树(Leftist Tree)、二项堆(Binomial Heap) 和Fibonacci堆(Fibonacci Heap) 都是十分优秀的可并堆。本文讨论的是左偏树,在后面我们将看到各种可并堆的比较。 在线代理|网页代理|代理网页|https://www.360docs.net/doc/063224222.html,

算法设计与分析考试题及答案

算法设计与分析考试题 及答案 Company number:【WTUT-WT88Y-W8BBGB-BWYTT-19998】

一、填空题(20分) 1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:确定性 有穷性 可行性 0个或多个输入 一个或多个输出 2.算法的复杂性有时间复杂性 空间复杂性之分,衡量一个算法好坏的标准是 时间复杂度高低 3.某一问题可用动态规划算法求解的显着特征是 该问题具有最优子结构性质 4.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X 和Y 的一个最长公共子序列{BABCD}或{CABCD}或{CADCD } 5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含一个(最优)解 6.动态规划算法的基本思想是将待求解问题分解成若干_子问题 ,先求解_子问题 ,然后从这些子问题 的解得到原问题的解。 7.以深度优先方式系统搜索问题解的算法称为回溯法 背包问题的回溯算法所需的计算时间为o(n*2n ) ,用动态规划算法所需的计算时间为o(min{nc,2n }) 9.动态规划算法的两个基本要素是最优子结构 _和重叠子问题 10.二分搜索算法是利用动态规划法实现的算法。 二、综合题(50分) 1.写出设计动态规划算法的主要步骤。 ①问题具有最优子结构性质;②构造最优值的递归关系表达式; ③最优值的算法描述;④构造最优解; 2. 流水作业调度问题的johnson 算法的思想。 ①令N 1={i|a i =b i };②将N 1中作业按a i 的非减序排序得到N 1’,将N 2中作业按b i 的非增序排序得到N 2’;③N 1’中作业接N 2’中作业就构成了满足Johnson 法则的最优调度。 3. 若n=4,在机器M1和M2上加工作业i 所需的时间分别为a i 和b i ,且 (a 1,a 2,a 3,a 4)=(4,5,12,10),(b 1,b 2,b 3,b 4)=(8,2,15,9)求4个作业的最优调度方案,并计算最优值。 步骤为:N1={1,3},N2={2,4}; N 1’={1,3}, N 2’={4,2}; 最优值为:38 4. 使用回溯法解0/1背包问题:n=3,C=9,V={6,10,3},W={3,4,4},其解空间有长度为3的0-1向量组成,要求用一棵完全二叉树表示其解空间(从根出发,左1右0),并画出其解空间树,计算其最优值及最优解。 解空间为{(0,0,0),(0,1,0),(0,0,1),(1,0,0),(0,1,1),(1,0,1), (1,1,0),(1,1,1)}。 解空间树为: 该问题的最优值为:16 最优解为:(1,1,0) 5. 设S={X 1,X 2,···,X n }是严格递增的有序集,利用二叉树的结点来存储S 中的元素,在表示S 的二叉搜索树中搜索一个元素X ,返回的结果有两种情形,(1)在二叉搜索树的内结点中找到X=X i ,其概率为b i 。(2)在二叉搜索树的叶结点中确定X ∈(X i ,X i+1),其概率为a i 。在表示S 的二叉搜索树T 中,设存储元素X i 的结点深度为C i ;叶结点(X i ,X i+1)的结点深度为d i ,则二叉搜索树T 的平均路长p 为多少假设二叉搜索树T[i][j]={X i ,X i+1,···,X j }最优值为m[i][j],W[i][j]= a i-1+b i +···+b j +a j ,则m[i][j](1<=i<=j<=n)递归关系表达式为什么 .二叉树T 的平均路长P=∑=+n i 1 Ci)(1*bi +∑=n j 0 dj *aj

设计方案范文合集八篇

设计方案范文合集八篇 设计方案范文合集八篇 为了确保事情或工作有序有力开展,常常需要预先准备方案,方案属于计划类文书的一种。方案应该怎么制定呢?以下是收集整理的设计方案8篇,仅供参考,希望能够帮助到大家。 设计方案篇1 一、活动目的 1、培养学生合作探究的精神与分析问题、解决问题的能力。 2、培养和增强学生的地理学习兴趣,关注身边的地理知识。 3、懂得多渠道收集课外资料。 二、活动时间及地点 三、活动方式 根据课室座位安排情况,以小组为单位,每两排组成一组,共分为四大组。以“野外考察员的困难”为主要内容,展开几个阶段的小组间的地理知识竞赛。 四、参与人员 全体同学 五、活动流程 活动刚开始,教师以一名“地理野外考察员”的身份登场,讲述他一天所遇到的困难。困难一:迷失了方向 1、活动准备

在活动前的地理课,向学生提出“当你迷失野外,你该如何来辨别方向”这一问题,让学生课后根据自己的生活经验或向有经验的长辈请教等各类方式收集有关方法,并以作业形式上交。 2、活动过程 学生以小组为单位,全组成员上交一份解决方法,教师当场逐一宣读,答对1个得1分,答错不得分。 3、活动小结 教师讲解野外辨别方向常用的几种方法。 附: 1)平时参考地图和指南针,同时积极观察周围的地形以及身边的植物来判断正确位置。 2)利用太阳 ①冬季日出位置是东偏南,日落位置是西偏南;夏季日出位置是东偏北,日落位置是西偏北;春分、秋分前后,日出正东,日落正西。 ②只要有太阳,就可以使用手表来辨别方向。按24小时制读出当时的时刻,将小时数除以二,将得到一个小时数。把手表水平放在手上或者地上,让手表的这个时刻对准太阳所在的方位,这时手表表面12点所指的方向是北方,6点所指的方向是南方。 设计方案篇2 1、幼儿园的功能组成 包括幼儿生活用房、服务用房、和供应用房三部分。 2、幼儿园的功能分析

算法设计与分析试卷A及答案

考试课程: 班级: 姓名: 学号: ------------------------------------------------- 密 ---------------------------------- 封 ----------------------------- 线 ---------------------------------------------------------

考试课程: 班级: 姓名: 学号: ------------------------------------------------- 密 ---------------------------------- 封 ----------------------------- 线 ---------------------------------------------------------

参考答案 一、填空 1、空间复杂度 时间复杂度 2、回溯法 3、递归算法 4、渐进确界或紧致界 5、原问题的较小模式 递归技术 6、问题的计算复杂性分析有一个共同的客观尺度 7、②③④① 8、问题的最优解包含其子问题的最优解 9、局部最优 10、正确的 三、简答题 1、高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作; 高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高; 高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可植性好、重用率高; 把繁杂琐碎的事务交给编译程序,所以自动化程度高,开发周期短,程序员可以集中时间和精力从事更重要的创造性劳动,提高程序质量。 2、 ①不能保证最后求得的解是最佳的;即多半是近似解。(少数问题除外) ②策略容易发现(关键:提取清楚问题中的维度), 而且运用简单,被广泛运用。 ③策略多样,结果也多样。 ④算法实现过程中,通常用到辅助算法:排序 3、解:① 因为:;01 -10n n )1-10n n (lim 22 2=+-+→∞n n 由渐近表达式的定义易知: 1-10n n 2 2+是n ;的渐近表达式。 ② 因为:;0n 1/ 5/n 1414)n 1/ 5/n 14(lim 22=++-++∞→n 由渐近表达式的定义易知: 14是14+5/n+1/ n 2的渐近表达式。 4、 找出最优解的性质,并刻划其结构特征。 递归地定义最优值。 以自底向上的方式计算出最优值。 根据计算最优值时得到的信息,构造最优解。 四、算法设计题 1、按照单位效益从大到小依次排列这7个物品为:FBGDECA 。将它们的序号分别记为1~7。则可生产如下的状态空间搜索树。其中各个节点处的限界函数值通过如下方式求得:【排序1分】 5x =6x =7x =

算法设计与分析考试题及答案

1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:_________,________,________,__________,__________。 2.算法的复杂性有_____________和___________之分,衡量一个算法 好坏的标准是______________________。 3.某一问题可用动态规划算法求解的显著特征是 ____________________________________。 4.若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X 和Y的一个最长公共子序列_____________________________。 5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含___________。 6.动态规划算法的基本思想是将待求解问题分解成若干____________,先求解___________,然后从这些____________的解得到原问题的解。 7.以深度优先方式系统搜索问题解的算法称为_____________。 8.0-1背包问题的回溯算法所需的计算时间为_____________,用动态规划算法所需的计算时间为____________。 9.动态规划算法的两个基本要素是___________和___________。 10.二分搜索算法是利用_______________实现的算法。 二、综合题(50分) 1.写出设计动态规划算法的主要步骤。 2.流水作业调度问题的johnson算法的思想。

计划方案合集10篇

计划方案合集10篇 计划方案合集10篇 为了确保我们的努力取得实效,通常会被要求事先制定方案,方案是在案前得出的方法计划。那么什么样的方案才是好的呢?下面是小编帮大家整理的计划方案10篇,仅供参考,大家一起来看看吧。计划方案篇1 各林场(所):为进一步深入贯彻《甘肃省自然保护区条例》及《XX市人民政府关于进一步加强封山禁牧工作的通知》和《XX林业总场封山禁牧管理暂行办法》精神,巩固XX林区近年来的封山禁牧成果,加快生态环境建设步伐,现就我场XX年封山禁牧工作安排如下:一、明确指导思想我场的封山禁牧工作,坚持统筹规划,以封为主,禁牧与圈养、恢复生态和保护林农利益相结合的指导思想,按照《森林法》、《森林法实施条例》及市局、总场关于封山禁牧工作的总体部署和要求,坚持把加强封山禁牧工作作为恢复植被、改善生态、提高林木尽快成林的重要措施,作为改善人居环境,促进人与自然和谐相处,构建和谐林区的重要保障。各林场(所)要从促进林区经济社会可持续发展的大局出发,切实增强责任感和紧迫感,采取切实有效的措施,加大工作力度,真正把封山禁牧工作抓紧抓好,确保取得实效。二、细化工作任务一要提高认识,统筹安排,强化责任,分解任务。各林场(所)主要领导要切实提高认识,将封禁工作放在同林业生产同等重要的位置上,同安排同部署,并根据市局、总场封禁工作会议精神,延伸签订封禁工作目标管理责任书,确保封禁工作责任分解到站,细化到人。二要广泛宣传动员,营造良好舆论氛围。各林场(所)要采取召开干部会、群众大会、养殖户专题会、管护人员工作会、发放宣传资料、刷写宣传标语、悬挂横幅、制做固定宣传碑等多种形式,广泛宣传《森林法》、《森林法实施条例》、《XX 市人民政府关于进一步加强封山禁牧工作的通知》《XX、林业总场封山禁牧管理暂行办法》等有关政策法规文件,教育林区群众充分认识封山禁牧的重大意义,明确封山禁牧的范围、措施和责任,引导群众正确处理长远利益与当前利益、整体利益与局部利益、封山禁牧与畜牧养殖的关系,真正把封山禁牧工作变为广大群众的自觉行动,为封山禁牧创造良好的舆论氛围。三要详细调查摸底,掌握

5.《算法设计与分析》试题库

《算法分析与设计》试题库 (一) 一、 选择题 1.应用Johnson 法则的流水作业调度采用的算法是(D ) A. 贪心算法 B.分支限界法 C.分治法 B. void hanoi(int n, int A, int B, int C) { if (n > 0) { hanoi(n-1, A, C, B); move( n, a,b); hanoi(n-1, C, B, A); 2.Hanoi 塔问题如下图所示。现要求将塔座A 上的的所有圆盘移到塔座 B 上,并 D.动态规划算法

3. 动态规划算法的基本要素为(C) A. 最优子结构性质与贪心选择性质 B ?重叠子问题性质与贪心选择性质 C.最优子结构性质与重叠子问题性质

D.预排序与递归调用 4. 算法分析中,记号0表示(B),记号0表示(A),记号。表示(D) A. 渐进下界 B. 渐进上界 C. 非紧上界 D. 紧渐进界 E. 非紧下界 5. 以下关于渐进记号的性质是正确的有:(A) A. f(n) - P(g(n)),g(n) - 心(h(n))二f(n) - P(h(n)) B. f(n) =0(g(n)),g(n) =0(h(n))二h(n) =0(f(n)) C. O(f(n ))+0(g( n)) = O(mi n{f(n ),g( n)}) D. f(n) =0(g(n)) = g(n) -0(f (n)) 6?能采用贪心算法求最优解的问题,一般具有的重要性质为:(A) A. 最优子结构性质与贪心选择性质 B ?重叠子问题性质与贪心选择性质 C. 最优子结构性质与重叠子问题性质 D. 预排序与递归调用 7.回溯法在问题的解空间树中,按(D)策略,从根结点出发搜索解空间树。 A. 广度优先 B.活结点优先 C.扩展结点优先 D.深度优先

算法分析期末试题集答案

1.应用Johnson 法则的流水作业调度采用的算法是(D ) A. 贪心算法 B. 分支限界法 C.分治法 D. 动态规划算法 2.Hanoi 塔问题如下图所示。现要求将塔座A 上的的所有圆盘移到塔座B 上,并仍按同样顺序叠置。移动圆盘时遵守Hanoi 塔问题的移动规则。由此设计出解Hanoi 塔问题的递归算确的为:(B ) 3. 动态规划算法的基本要素为(C ) A. 最优子结构性质与贪心选择性质 B .重叠子问题性质与贪心选择性质 C .最优子结构性质与重叠子问题性质 D. 预排序与递归调用 4. 算法分析中,记号O 表示(B ), 记号Ω表示(A ), 记号Θ表示(D )。 A.渐进下界 B.渐进上界 C.非紧上界 D.紧渐进界 E.非紧下界 5. 以下关于渐进记号的性质是正确的有:(A ) A.f (n)(g(n)),g(n)(h(n))f (n)(h(n))=Θ=Θ?=Θ B. f (n)O(g(n)),g(n)O(h(n))h(n)O(f (n))==?= C. O(f(n))+O(g(n)) = O(min{f(n),g(n)}) D. f (n)O(g(n))g(n)O(f (n))=?= 6. 能采用贪心算法求最优解的问题,一般具有的重要性质为:(A ) A. 最优子结构性质与贪心选择性质B .重叠子问题性质与贪心选择性质 C .最优子结构性质与重叠子问题性质D. 预排序与递归调用 7. 回溯法在问题的解空间树中,按(D )策略,从根结点出发搜索解空间树。 A . 广度优先 B. 活结点优先 C.扩展结点优先 D. 深度优先 Hanoi 塔 B. void hanoi(int n, int A, int B, int C) { if (n > 0) { hanoi(n-1, A, C, B); move(n,a,b); hanoi(n-1, C, B, A); }

计算智能习题合集

计算智能 习题总集 习题一: 空缺 习题二: 1、在反馈型神经网络中,有些神经元的输出被反馈至神经元的( ) A .同层 B .同层或前层 C .前层 D .输出层 2、在神经网络的一个节点中,由激励函数计算得到的数值是该节点的( ) A .实际输出 B .实际输入 C .期望输出 D .期望值 3、在神经网络的一个节点中,由激励函数计算得到的数值,是与该节点相连的下一个节点的( ) A .实际输出 B .实际输入 C .期望输出 D .期望值 4、下面的学习算法属于有监督学习规则的是( ) A .Hebb 学习规则 B .Delta 学习规则 C .概率式学习规则 D .竞争式学习规则 E .梯度下降学习规则 F .Kohonen 学习规则 5、BP 算法适用于( ) A .前馈型网络 B .前馈内层互联网络 C .反馈型网络 D .全互联网络 6、BP 神经网络采用的学习规则是( ) A .联想式Hebb 学习规则 B .误差传播式Delta 学习规则 C .概率式学习规则 D .竞争式学习规则 习题三: 1、设论域U ={u 1, u 2, u 3, u 4, u 5}, 5 432118.06.04.02.0u u u u u A ++++=,

5 43214.06.016.04.0u u u u u B ++++=, 求 B A B A , , , 。 2、设X ={1, 5, 9, 13, 20}, Y ={1, 5, 9, 13, 20}, ~ R 是模糊关系“x 比y 大得多”。 隶属度函数: 求模糊关系矩阵~ R 3、 4、Zadeh 教授提出了著名的不相容原理,是指复杂系统的那两种矛盾( ) A .精确性和有效性 B .精确性和模糊性 C .模糊性和有效性 D .复杂性和模糊性 5、在模糊推理得到的模糊集合中取一个最能代表这个集合的单值的过程称为( ) A .去模糊 B .模糊化 C .模糊推理 D .模糊集运算 6、判断 1.一个模糊集合可以被其隶属度函数唯一定义( ) 2.隶属度越大表示真的程度越高;隶属度越小表示真的程度越低( ) 3.当隶属度函数有若干点取值为1,其余点取值为0时,该隶属度函数对应的模糊集 合可以看作一个经典集合( ) 7、简答题:试述模糊计算的主要模块及其操作内容。 ???????≥-<-<-≤-=101100100 0),(~y x y x y x y x y x R ,,,

算法分析期末试题集规范标准答案(6套)

《算法分析与设计》期末复习题(一) 一、 选择题 1.应用Johnson 法则的流水作业调度采用的算法是(D ) A. 贪心算法 B. 分支限界法 C.分治法 D. 动态规划算法 2.Hanoi 塔问题如下图所示。现要求将塔座A 上的的所有圆盘移到塔座B 上,并仍按同样顺序叠置。移动圆盘时遵守Hanoi 塔问题的移动规则。由此设计出解Hanoi 塔问题的递归算法正确的为:(B ) Hanoi 塔 A. void hanoi(int n, int A, int C, int B) { if (n > 0) { hanoi(n-1,A,C, B); move(n,a,b); hanoi(n-1, C, B, A); } B. void hanoi(int n, int A, int B, int C) { if (n > 0) { hanoi(n-1, A, C, B); move(n,a,b); hanoi(n-1, C, B, A); }

C. void hanoi(int n, int C, int B, int A) { if (n > 0) { hanoi(n-1, A, C, B); move(n,a,b); hanoi(n-1, C, B, A); } D. void hanoi(int n, int C, int A, int B) { if (n > 0) { hanoi(n-1, A, C, B); move(n,a,b); hanoi(n-1, C, B, A); } 3.动态规划算法的基本要素为(C) A. 最优子结构性质与贪心选择性质 B.重叠子问题性质与贪心选择性质

精选方案策划合集5篇

精选方案策划合集5篇 方案策划篇1 一、日本寿司店的总体目标 2. 产品定价及收入目标 产品定价寿司:甜鸡蛋寿司 12元加州反卷寿司12元烤鳗鱼寿司 12元樱花反卷寿司12元香辣牛肉寿司12元鱼松蟹棒寿司12元鱼松火腿寿司12元金枪鱼寿司8元球生菜寿司8元紫薯红薯寿司8元鱼松寿司 8元红心蛋黄寿司 8元飞鱼子寿司8元什锦色拉寿司 7元水果寿司 7元果冻寿司 6元火腿寿司 6元手卷:黄瓜手卷 5元/2个鱼松手卷 7元/2个金枪鱼手卷7元/2个色拉手卷 7元/2个烤鳗鱼手卷7元/2个饭团:红心蛋黄饭团 5元/2个紫薯饭团 5元/2个鱼松饭团 7元/2个金枪鱼饭团7元/2个火腿饭团 7元/2个预计每日将会有50份订单,每份订单平均10元,平均每份订单成本3元利润7元。每日将获得利润10x50=500元每日将获纯利润7x50=350元 收入目标 月收入:20190.00元年收入:240000.00元 员工工资以及支出经费:40000.00元年净收入:201900.00元 3. 发展目标 将日本寿司店发展成特色小资情调的店子。主要顾客为情侣、中

高消费水平学生、喜爱日韩的女生等。 本店以优雅的环境,日本特色的风味为主打。在提供就餐的同时能享受到不一样的优质服务。且寿司分为中高档,既能满足高消费水平学生的消费欲望,同时满足一般学生的购买能力。 立志将日本寿司店在我校附近立足,并以优质传统的特色服务收揽各新老顾客。 二、市场状况分析 1. 市场需求 自然生长的稻米和最新鲜的鱼生,用极致简单又饶有趣味的生食方式组合在一起,寿司已经迅速发展成为全世界都无法抗拒的美味新宠。寿司风潮正全面来袭。走进店堂,就可以看到一碟碟的寿司由传送带传送着,从眼前回转而过。自己伸手从传送带上取下自己爱吃的寿司,最后根据所吃的碟数来结账,这就是寿司。因其价格低廉、轻松随意,已经越来越受到普通消费者的欢迎。 作为全世界正越来越风行的日本寿司,正被越来越多追求品位和健康的人所钟爱。纽约、巴黎、伦敦、悉尼、香港,时髦都市中的寿司店,门前永远不缺时髦男女耐心排长队。寿司经营店也在中国不断增长。什么原因呢?它的魅力在于:第一、口味鲜美, 而且丰富多样的品种满足了不同口味、不同喜好的人们。寿司的制作原料可谓包罗万象, 不拘一格,从鱼类、贝类到牛肉、禽蛋甚至蔬菜、瓜果都可以制成风味各异的寿司。 第二、寿司符合人们健康饮食的标准。日本饮食在养生方面具有

算法分析与设计复习题及答案

算法分析与设计复习题及答案一、单选题 1.D 2.B 3.C 4.D 5.D 6.D 7.C 8.D 9.B 10.C 11.D 12.B 13.D 14.C 15.C 16.D 17.D 18.D 19.D 20.C 1.与算法英文单词algorithm具有相同来源的单词是()。 A logarithm B algiros C arithmos D algebra 2.根据执行算法的计算机指令体系结构,算法可以分为()。 A精确算法与近似算法B串行算法语并行算法 C稳定算法与不稳定算法D32位算法与64位算法 3.具有10个节点的完全二叉树的高度是()。 A6B5C3D 2 4.下列函数关系随着输入量增大增加最快的是()。 Alog2n B n2 C 2n D n! 5.下列程序段的S执行的次数为( )。 for i ←0 to n-1 do for j ←0 to i-1 do s //某种基本操作 A.n2 B n2/2 C n*(n+1) D n(n+1)/2 6.Fibonacci数列的第十项为( )。 A 3 B 13 C 21 D 34 7.4个盘子的汉诺塔,至少要执行移动操作的次数为( )。 A 11次 B 13次 C 15次 D 17次 8.下列序列不是堆的是()。 A 99,85,98,77,80,60,82,40,22,10,66 B 99,98,85,82,80,77,66,60,40,22,10 C 10,22,40,60,66,77,80,82,85,98,99 D 99,85,40,77,80,60,66,98,82,10,22 9.Strassen矩阵乘法的算法复杂度为()。 AΘ(n3)BΘ(n2.807) CΘ(n2) DΘ(n) 10.集合A的幂集是()。 A.A中所有元素的集合 B. A的子集合 C. A 的所有子集合的集合 D. 空集 11.与算法英文单词algorithm具有相同来源的单词是()。 A logarithm B algiros C arithmos D algebra 12.从排序过程是否完全在内存中显示,排序问题可以分为()。 A稳定排序与不稳定排序B内排序与外排序 C直接排序与间接排序D主排序与辅助排序 13.下列()不是衡量算法的标准。 A时间效率B空间效率 C问题难度D适应能力 14.对于根树,出度为零的节点为()。 A0节点B根节点C叶节点D分支节点 15.对完全二叉树自顶向下,从左向右给节点编号,节点编号为10的父节点编号为()。 A0B2C4D6 16.下列程序段的算法时间的复杂度为()。 for i ←0 to n do for j ←0 to m do

【实用】工作计划合集六篇

【实用】工作计划合集六篇 工作计划篇1 为了贯彻落实“安全第一,预防为主,综合治理”的方针,强化安全生产目标管理。结合工厂实际,特制定20xx年安全生产工作计划,将安全生产工作纳入重要议事日程,警钟长鸣,常抓不懈。 一、下半年目标 实现下半年无死亡、无重伤、无重大生产设备事故,无重大事故隐患,工伤事故发生率低于厂规定指标,综合粉尘浓度合格率达80%以上(如下表)。 二、指导思想 要以公司对20xx年安全生产目标管理责任为指导,以工厂安全工作管理制度为标准,以安全工作总方针“安全第一,预防为主。”为原则,以车间、班组安全管理为基础,以预防重点单位、重点岗位重大事故为重点,以纠正岗位违章指挥,违章操作和员工劳动保护穿戴为突破口,落实各项规章制度,开创安全工作新局面,实现安全生产根本好转。 三、牢固树立“安全第一”的思想意识 各单位部门要高度重视安全生产工作,把安全生产工作作为重要的工作来抓,认真贯彻“安全第一,预防为主”的方针,进一步增强安全生产意识,出实招、使真劲,把“安全第一”的方

针真正落到实处,通过进一步完善安全生产责任制,首先解决领导意识问题,真正把安全生产工作列入重要议事日程,摆到“第一”的位置上,只有从思想上重视安全,责任意识才能到位,才能管到位、抓到位,才能深入落实安全责任,整改事故隐患,严格执行“谁主管,谁负责”和“管生产必须管安全”的原则,力保安全生产。 四、深入开展好安全生产专项整治工作 根据工厂现状,确定出20xx年安全生产工作的重点单位、重点部位,完善各事故处理应急预案,加大重大隐患的监控和整改力度,认真开展厂级月度安全检查和专项安全检查,车间每周进行一次安全检查,班组坚持班中的三次安全检查,并要求生产科、车间领导及管理人员加强日常安全检查,对查出的事故隐患,要按照“三定四不推”原则,及时组织整改,暂不能整改的,要做好安全防范措施,尤其要突出对煤气炉、锅炉、硫酸罐、液氨罐等重要部位的安全防范,做好专项整治工作,加强对易燃易爆、有毒有害等危险化学品的管理工作,要严格按照《安全生产法》、《危险化学品安全管理条例》强化专项整治,加强对岗位现场的安全管理,及时查处违章指挥,违章操作等现象,限度降低各类事故的发生,确保工厂生产工作正常运行。 五、继续加强做好员工安全教育培训和宣传工作 工厂采取办班、班前班后会、墙报、简报等形式,对员工进行安全生产教育,提高员工的安全生产知识和操作技能,定期或

《算法分析与设计》期末试题及参考答案

《算法分析与设计》期末试题及参考答案 一、简要回答下列问题: 1.算法重要特性是什么? 1.确定性、可行性、输入、输出、有穷性 2. 2.算法分析的目的是什么? 2.分析算法占用计算机资源的情况,对算法做出比较和评价,设计出额更好的算法。 3. 3.算法的时间复杂性与问题的什么因素相关? 3. 算法的时间复杂性与问题的规模相关,是问题大小n的函数。 4.算法的渐进时间复杂性的含义? 4.当问题的规模n趋向无穷大时,影响算法效率的重要因素是T(n)的数量级,而其他因素仅是使时间复杂度相差常数倍,因此可以用T(n)的数量级(阶)评价算法。时间复杂度T(n)的数量级(阶)称为渐进时间复杂性。 5.最坏情况下的时间复杂性和平均时间复杂性有什么不同? 5. 最坏情况下的时间复杂性和平均时间复杂性考察的是n固定时,不同输入实例下的 算法所耗时间。最坏情况下的时间复杂性取的输入实例中最大的时间复杂度: W(n) = max{ T(n,I) } , I∈Dn 平均时间复杂性是所有输入实例的处理时间与各自概率的乘积和: A(n) =∑P(I)T(n,I) I∈Dn 6.简述二分检索(折半查找)算法的基本过程。 6. 设输入是一个按非降次序排列的元素表A[i:j] 和x,选取A[(i+j)/2]与x比较, 如果A[(i+j)/2]=x,则返回(i+j)/2,如果A[(i+j)/2]

相关文档
最新文档