算法合集之《伸展树的基本操作与应用》

合集下载

数据结构及应用算法教程修订版

数据结构及应用算法教程修订版
(49,38,65,7766,4499,1133,2277,52) 构造二叉排序树
20
假如中序遍历二叉排序树,所得序列将是有 序旳,即实现了对原始数据旳排序,二叉排序 树即由此得名。
原始序列数据 (49,38,65,76,49,13,27,52)
构造旳二叉排序树 49
38
65
13
49
7627Leabharlann 52中序遍历二叉排序树
for ( i=H.length; i>1; --i ) { // 调整堆来实现排序 H.r[1]←→H.r[i]; // 将堆顶统计和目前未经排序子序列 // H.r[1..i]中最终一种统计相互互换 HeapAdjust(H.r, 1, i-1); // 对 H.r[1] 进行筛选
} 13
} // HeapSort
13
s->data = T ->data;
s->next = head->next;
38
head->next = s; degression(T ->rchild ); } }
s 插入结点
旳指针操作
40
降序排列旳动态模型演示
49
38
76
13
40
134738069
1343890
143308
3138
13
32
字母集: s, t, a, e, i
出现频度: 5, 6, 2, 9, 7
编码: 101, 00, 100, 11, 01
29
0
1
电文: eat
13 01
16 01
6 00
7 01
7 0
1
9 11

浙教版五年级上册信息技术第15课算法的应用(共19张PPT)

浙教版五年级上册信息技术第15课算法的应用(共19张PPT)
信息技术
五年级上
第十五课 算法的应用
01 学习目标 02 本课内容 03 课堂总结 04 练习一下
2
01
学习目标
3
学习目标
你将学习
1.最短距离算法的应用。 2.算法思维在生活中的应用。
4
02
本课内容
5
本课学习
课堂引入
6
小组讨论
学习了最短距离算法后,生活 中哪些问题可以应用这种算法来解 决?
9
二、灵活运用 算法指导生活
10
11
三、 应用算法思维 优化生活
12
13
14
03
课堂总结
15
课堂总结 使用算法结果解决问题 灵活运用算法指导生活 应用算法思维优化生活
16
04
练习一下
17
Thank you for wat是解决问题的方法及其步骤。经过验证后,使用正确的算法可以解 决特定的生活问题。同一种算法也可以用于解决其他类似问题,还可以采用在 设计算法过程中的思维方法来进一步优化生活。
使用算法结果 解决问题
灵活运用算法 指导生活
应用算法思维 优化生活
……
一、使用算法结 果解决问题

伸展树代码(pascal)

伸展树代码(pascal)
先旋转当前结点的父亲结点,再旋转当前结点。
3.如果当前结点,当前结点的父亲结点,当前结点的父亲结点的父亲结点三点成一折线,
则连续旋转当前结点两次(按不同方向)。
旋转的方向一定要画图确定,只需记住最终要把x移到这一堆的根上即可
如x,y都是它们父亲的左孩子,则先左旋y,再左旋x,
又如y是父亲z的右孩子,x是父亲y的左孩子,则先右旋x,再左旋x.
end;
if father[x]=0 then root:=x;
end;
{//插入一个数w的过程,第一种实现
procedure insert(w:longint);
var x:longint;
begin
if total=0 then //如果为空树,则初始化此树
2.更改各子树指针
1)x的子树先移动
x的右孩子变成了y的左儿子,如果此孩子不为空则它的父亲为y
2)关于x的修改
x代替了y,成为了原先y的父亲的儿子
如果y不是y的指针
A B C D
根据sgybi大牛的总结,其实什么zig-zag,zig-zig都是浮云
只要牢记以下几条规律即可保证清晰明了:
1.如果当前结点是根节点的孩子,直接旋转一次即可。
2.如果当前结点,当前结点的父亲结点,当前结点的父亲结点的父亲结点三点成一直线,
{伸展操作图解如下:
z x
/ \ / \
y D A y
/ \ / \
x C ---> B z
/ \ zig-zig / \
end;
//w=1求以x为根的子树中最小值,w=2求x的子树中最大值
具体地,(单)旋转分为以下几个步骤:

伸展树(SplayTree)的实现

伸展树(SplayTree)的实现

伸展树(SplayTree)的实现优点:伸展树(splay tree)是⼀种能⾃我调整的⼆叉搜索树(BST)。

虽然某⼀次的访问操作所花费的时间⽐较长,但是平摊(amortized)之后的访问操作(例如旋转)时间能达到O(logn)的复杂度。

对于某⼀个被访问的节点,在接下来的⼀段时间内再次频繁访问它(90%的情况下是这样的,即符合90-10规则,类似于CPU内或磁盘的cache设计原理)的应⽤模式来说,伸展树是⼀种很理想的数据结构。

另外⼀点与其他平衡⼆叉树的区别是,伸展树不需要存储任何像AVL树中平衡因⼦(balance factor)那样的平衡信息,可以节省空间的开销。

缺点:不像其他平衡⼆叉树那样即使最坏情况下也能达到O(logn)访问时间,它的最坏情况下只有O(n),跟单向链表⼀样。

另外,伸展树的查找操作会修改树的结构,这与普通意义上的查找为只读操作习惯不太⼀样。

实现⽅式:伸展树的实现有两种⽅式,⼀是⾃底向上(bottom-up),另外⼀种是⾃顶向下(top-down)。

考虑到实现的难易程度,⾃顶向下的实现⽅式⽐较简单,因为⾃底向上需要保存已经被访问的节点,⽽⾃顶向下可以在搜索的过程中同时完成splay操作。

虽然两者得出的树结构不太⼀样,但是它们的平摊时间复杂度都是O(logn)。

两种实现的基本操作就是splay,splay将最后被访问到的节点提升为根节点。

在⾃顶向下(top-down)的实现中,需要将输⼊的树拆成三颗树,分别为左树L,中树M和右树R。

其中M树维护当前还未被访问到的节点,L树中所有节点的值都⼩于M树中的任何节点值,R树中所有节点的值都⼤于M树中的任何节点值。

L树中只需要知道当前的最⼤节点(leftTreeMax),⽽R树中只需要知道当前的最⼩节点(rightTreeMin)。

左右两棵树的根节点分别可以通过nullNode节点(它是leftTreeMax和rightTreeMin的初始值,⽽且splay过程中变量nullNode本⾝未变化,只改变它的左右孩⼦节点)的右和左孩⼦节点得到,因为leftTreeMax中加⼊⼀个新的节点或⼦树时都是将新的节点作为leftTreeMax的右孩⼦,⽽不是左孩⼦(注意这⾥的顺序),rightTreeMin跟leftTreeMax相反。

第3章 伸展树与跳表

第3章 伸展树与跳表
1. zigzig旋转
• p的右子树做g的左子 树,然后g做p的右子树; • 第1步:将p右旋转(zig) 到g,即pg两节点换位; • q的右子树做p的左子 树,然后p做q的右子树; • 第2步:接着将q右旋转 到p
1 2
双重旋转
2. zigzag旋转
• q的左子树做p的右子 树,然后p做q的右子树; • 第1步:将q左旋转(zag) 到p,即pq两节点换位; • 第2步: q的右子树做g 的左子树,然后g做q的 右子树;
– – – –
根节点右孩子为空 等于根节点的右孩子 小于根节点的右孩子 大于根节点的右孩子
3.1.6 插入运算的实现
• 插入30
一 空树 二 30 三 43 30 四 43 五 43 六 43
50
32
50
3
50
四 23
五 23

23
3
30

50
3
25
问题:要插入节点30
1. 2. 3. 树为空--新建节点,值为30,作为根 树的根节点就等于30,直接返回 duplicate 30小于根节点时:
类中成员函数的实现
#include "Stack.h" Stack::Stack(int s) { data=new int[s]; size=s; memNum=0; } Stack::~Stack() { delete[] data; } int Stack::pop(int &num) { if(memNum==0) return 0; num=data[--memNum]; return 1; } int Stack::push(int mem) { if(memNum==size) return 0; data[memNum++]=mem; return 1; }

伸展树的原理

伸展树的原理

伸展树的原理伸展树(Splay Tree)是一种自平衡的二叉搜索树,它在执行插入、查找、删除等操作时,会通过伸展操作将最近访问的节点调整到根节点位置,以提高访问效率。

伸展树的原理主要包括以下几个方面:二叉搜索树、伸展操作和如何维持平衡。

一、二叉搜索树伸展树是一种二叉搜索树,每个节点都有一个关键字和两个子节点(左子节点和右子节点)。

对于每个节点,它的左子节点的关键字小于等于它的关键字,而右子节点的关键字大于它的关键字。

这样的特性使得通过比较节点的关键字可以高效地进行查找和插入操作。

二、伸展操作伸展操作是伸展树的关键操作,它通过一系列的旋转操作将最近访问的节点调整到根节点位置。

当执行查找、插入或删除操作时,伸展树会将要操作的节点旋转到根节点位置,这样可以将频繁访问的节点保持在近乎根节点的位置,提高了整体的访问效率。

伸展操作主要包括两种旋转:zig和zig-zig。

1. Zig旋转:当要旋转的节点是根节点的直接子节点时,执行zig旋转。

假设要旋转的节点为X,其父节点为P,X是P的左子节点。

在zig旋转后,X会被旋转至根节点的位置,P成为X的右子节点,X的左子节点成为P的右子节点。

示意图如下:P X/ / \X ===> L P/ \ \L R R2. Zig-zig旋转:当要旋转的节点的父节点和祖父节点都是根节点的直接子节点时,执行zig-zig旋转。

假设要旋转的节点为X,其父节点为P,祖父节点为G,X是P的左子节点,P是G的左子节点。

在zig-zig旋转后,X会被旋转至根节点的位置,P成为X的右子节点,G成为P的右子节点,X的左子节点成为P 的左子节点,P的左子节点成为G的右子节点。

示意图如下:G X/ / \P ==> P G/ \ / \X C L R/ \L R通过不断地执行zig和zig-zig旋转,伸展操作可以将最近访问的节点调整至根节点位置。

这样可以使得频繁访问的节点保持在近乎根节点的位置,提高查找的效率。

算法与数据结构公开课一等奖课件省赛课获奖课件

算法与数据结构公开课一等奖课件省赛课获奖课件

章 内 容
4.3 数据构造及表达
2学

4.4 惯用数据构造及表达(表、树、图) 6学时
4.5 查找与排序
4学

4.6 文献与文献操作
2学

4.7 应用举例
2学

软件
技术
算法历史小知识
基础
算法的中文名称出自周髀算经;而英文名称Algorithm 来自于9 世纪波斯数学家比阿勒.霍瓦里松的名字al-Khwarizmi,由于比 阿勒.霍瓦里松在数学上提出了算法这个概念。他写的书《aljabr w’al muqabalah》(代数学)演变成为现在中学的代数教科 书。Ad-Khwarizmi强调求解问题是有条理的环节。如果他能活 到今天的话,他一定会被以他的名字而得名的办法的进展所感 动。
Towers(1, Source, Target, Interm); Towers(n-1, Interm, Target, Source); } }
软件
技术
基础
贪心法 基本思想
先根据题目的部分条件拟定答案的范畴, 在此范畴内对全部可能的状况逐个验证,直到 全部状况验证完毕,若每个状况使验证题目符 合条件,则为本题的一种答案,若全部状况验 证完毕后均不符合题目的条件,则题目无解。
算 法
•2程)序可不读性含(语R法ead错ab误ilit;y)
的 评
••3程 程)算序序强法对对健的性几精第(组心一ro输 选b目u入 择s的tn数 的e是s据 、s)为典了型阅的读、和交流;能 生产 满
价 原 则
苛数•应算的4解间程)刻据含 法 输可可决 是序高有 应 出的;速 矛读读对效容 对 成度 盾、性性率一错 其 果快 的带有有与切解 作 。; 、有助助低决出合存实刁存于 于功反储际法储难对 对效映容问的量性。,算 算量题输当而的小的法 法入输不。求几的 的数入是时解组理 调据非产间往输解试法生和往入;和数 莫空 是修据 名时 其改, 妙。足 格 求 结规 要 的 果

伸展树(Splaytree)的基本操作与应用

伸展树(Splaytree)的基本操作与应用

伸展树(Splaytree)的基本操作与应⽤伸展树的基本操作与应⽤【伸展树的基本操作】 伸展树是⼆叉查找树的⼀种改进,与⼆叉查找树⼀样,伸展树也具有有序性。

即伸展树中的每⼀个节点 x 都满⾜:该节点左⼦树中的每⼀个元素都⼩于 x,⽽其右⼦树中的每⼀个元素都⼤于 x。

与普通⼆叉查找树不同的是,伸展树可以⾃我调整,这就要依靠伸展操作 Splay(x,S)。

伸展操作 Splay(x,S)  伸展操作 Splay(x,S)是在保持伸展树有序性的前提下,通过⼀系列旋转将伸展树 S 中的元素 x 调整⾄树的根部。

在调整的过程中,要分以下三种情况分别处理: 情况⼀:节点 x 的⽗节点 y 是根节点。

这时,如果 x 是 y 的左孩⼦,我们进⾏⼀次 Zig(右旋)操作;如果 x 是 y 的右孩⼦,则我们进⾏⼀次 Zag(左旋)操作。

经过旋转,x 成为⼆叉查找树 S 的根节点,调整结束。

如图 1 所⽰: 情况⼆:节点 x 的⽗节点 y 不是根节点,y 的⽗节点为 z,且 x 与 y 同时是各⾃⽗节点的左孩⼦或者同时是各⾃⽗节点的右孩⼦。

这时,我们进⾏⼀次Zig-Zig 操作或者 Zag-Zag 操作。

如图 2 所⽰: 情况三:节点 x 的⽗节点 y 不是根节点,y 的⽗节点为 z,x 与 y 中⼀个是其⽗节点的左孩⼦⽽另⼀个是其⽗节点的右孩⼦。

这时,我们进⾏⼀次 Zig-Zag 操作或者 Zag-Zig 操作。

如图 3 所⽰: 如图 4 所⽰,执⾏ Splay(1,S),我们将元素 1 调整到了伸展树 S 的根部。

再执⾏ Splay(2,S),如图 5 所⽰,我们从直观上可以看出在经过调整后,伸展树⽐原来“平衡”了许多。

⽽伸展操作的过程并不复杂,只需要根据情况进⾏旋转就可以了,⽽三种旋转都是由基本得左旋和右旋组成的,实现较为简单。

伸展树的基本操作 利⽤ Splay 操作,我们可以在伸展树 S 上进⾏如下运算: (1)Find(x,S):判断元素 x 是否在伸展树 S 表⽰的有序集中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

伸展树的基本操作与应用安徽省芜湖一中杨思雨目录【关键字】 (2)【摘要】 (2)【引言】 (2)【伸展树的基本操作】 (2)伸展操作Splay(x,S) (3)伸展树的基本操作 (4)时间复杂度分析 (5)【伸展树的应用】 (7)【总结】 (8)【参考书目】 (9)【附录】 (9)【关键字】伸展树基本操作应用【摘要】本文主要介绍了伸展树的基本操作以及其在解题中的应用。

全文可以分为以下四个部分。

第一部分引言,主要说明了二叉查找树在信息学竞赛中的重要地位,并且指出二叉查找树在某些情况下时间复杂度较高,进而引出了在时间复杂度上更为优秀的伸展树。

第二部分介绍了伸展树的基本操作。

并给出了对伸展树时间复杂度的分析和证明,指出伸展树的各种基本操作的平摊复杂度均为O(log n),说明伸展树是一种较平衡的二叉查找树。

第三部分通过一个例子介绍了伸展树在解题中的应用,并将它与其它树状数据结构进行了对比。

第四部分指出了伸展树的优点,总结全文。

【引言】二叉查找树(Binary Search Tree)能够支持多种动态集合操作。

因此,在信息学竞赛中,二叉排序树起着非常重要的作用,它可以被用来表示有序集合、建立索引或优先队列等。

作用于二叉查找树上的基本操作的时间是与树的高度成正比的。

对一个含n 各节点的完全二叉树,这些操作的最坏情况运行时间为O(log n)。

但如果树是含n个节点的线性链,则这些操作的最坏情况运行时间为O(n)。

而有些二叉查找树的变形,其基本操作在最坏情况下性能依然很好,比如红黑树、A VL树等等。

本文将要介绍的伸展树(Splay Tree),也是对二叉查找树的一种改进,虽然它并不能保证树一直是“平衡”的,但对于伸展树的一系列操作,我们可以证明其每一步操作的平摊复杂度都是O(log n)。

所以从某种意义上说,伸展树也是一种平衡的二叉查找树。

而在各种树状数据结构中,伸展树的空间要求与编程复杂度也都是很优秀的。

【伸展树的基本操作】伸展树是二叉查找树的一种改进,与二叉查找树一样,伸展树也具有有序性。

即伸展树中的每一个节点x都满足:该节点左子树中的每一个元素都小于x,而其右子树中的每一个元素都大于x。

与普通二叉查找树不同的是,伸展树可以自我调整,这就要依靠伸展操作Splay(x,S)。

伸展操作Splay(x,S)伸展操作Splay(x,S)是在保持伸展树有序性的前提下,通过一系列旋转将伸展树S中的元素x调整至树的根部。

在调整的过程中,要分以下三种情况分别处理:情况一:节点x的父节点y是根节点。

这时,如果x是y的左孩子,我们进行一次Zig(右旋)操作;如果x是y的右孩子,则我们进行一次Zag(左旋)操作。

经过旋转,x成为二叉查找树S的根节点,调整结束。

如图1所示图1情况二:节点x的父节点y不是根节点,y的父节点为z,且x与y同时是各自父节点的左孩子或者同时是各自父节点的右孩子。

这时,我们进行一次Zig-Zig操作或者Zag-Zag操作。

如图2所示图2情况三:节点x的父节点y不是根节点,y的父节点为z,x与y中一个是其父节点的左孩子而另一个是其父节点的右孩子。

这时,我们进行一次Zig-Zag操作或者Zag-Zig操作。

如图3所示图3如图4所示,执行Splay(1,S),我们将元素1调整到了伸展树S的根部。

再执行Splay(2,S),如图5所示,我们从直观上可以看出在经过调整后,伸展树比原来“平衡”了许多。

而伸展操作的过程并不复杂,只需要根据情况进行旋转就可以了,而三种旋转都是由基本得左旋和右旋组成的,实现较为简单。

图 4 Splay(1,S)图 5 Splay(2,S)伸展树的基本操作利用Splay操作,我们可以在伸展树S上进行如下运算:(1)Find(x,S):判断元素x是否在伸展树S表示的有序集中。

首先,与在二叉查找树中的查找操作一样,在伸展树中查找元素x。

如果x 在树中,则再执行Splay(x,S)调整伸展树。

(2)Insert(x,S):将元素x插入伸展树S表示的有序集中。

首先,也与处理普通的二叉查找树一样,将x插入到伸展树S中的相应位置上,再执行Splay(x,S)。

(3)Delete(x,S):将元素x从伸展树S所表示的有序集中删除。

首先,用在二叉查找树中查找元素的方法找到x的位置。

如果x没有孩子或只有一个孩子,那么直接将x删去,并通过Splay操作,将x节点的父节点调整到伸展树的根节点处。

否则,则向下查找x的后继y,用y替代x的位置,最后执行Splay(y,S),将y调整为伸展树的根。

(4)Join(S1,S2):将两个伸展树S1与S2合并成为一个伸展树。

其中S1的所有元素都小于S2的所有元素。

首先,我们找到伸展树S1中最大的一个元素x,再通过Splay(x,S1)将x调整到伸展树S1的根。

然后再将S2作为x节点的右子树。

这样,就得到了新的伸展树S。

如图6所示图6(5)Split(x,S):以x为界,将伸展树S分离为两棵伸展树S1和S2,其中S1中所有元素都小于x,S2中的所有元素都大于x。

首先执行Find(x,S),将元素x调整为伸展树的根节点,则x的左子树就是S1,而右子树为S2。

如图7所示图7除了上面介绍的五种基本操作,伸展树还支持求最大值、求最小值、求前趋、求后继等多种操作,这些基本操作也都是建立在伸展操作的基础上的。

时间复杂度分析由以上这些操作的实现过程可以看出,它们的时间效率完全取决于Splay操作的时间复杂度。

下面,我们就用会计方法来分析Splay操作的平摊复杂度。

首先,我们定义一些符号:S(x)表示以节点x为根的子树。

|S|表示伸展树S 的节点个数。

令μ(S) = [ log|S| ],μ(x)=μ(S(x))。

如图8所示图8我们用1元钱表示单位代价(这里我们将对于某个点访问和旋转看作一个单位时间的代价)。

定义伸展树不变量:在任意时刻,伸展树中的任意节点x都至少有μ(x)元的存款。

在Splay调整过程中,费用将会用在以下两个方面:(1)为使用的时间付费。

也就是每一次单位时间的操作,我们要支付1元钱。

(2)当伸展树的形状调整时,我们需要加入一些钱或者重新分配原来树中每个节点的存款,以保持不变量继续成立。

下面我们给出关于Splay操作花费的定理:定理:在每一次Splay(x,S)操作中,调整树的结构与保持伸展树不变量的总花费不超过3μ(S)+1。

证明:用μ(x)和μ’(x)分别表示在进行一次Zig、Zig-Zig或Zig-Zag操作前后节点x处的存款。

下面我们分三种情况分析旋转操作的花费:情况一:如图9所示图9我们进行Zig或者Zag操作时,为了保持伸展树不变量继续成立,我们需要花费:μ’(x) +μ’(y) -μ(x) -μ(y) = μ’(y) -μ(x)≤μ’(x) -μ(x)≤3(μ’(x) -μ(x))= 3(μ(S) -μ(x))此外我们花费另外1元钱用来支付访问、旋转的基本操作。

因此,一次Zig 或Zag操作的花费至多为3(μ(S) -μ(x))。

情况二:如图10所示图10我们进行Zig-Zig操作时,为了保持伸展树不变量,我们需要花费:μ’(x) +μ’(y) +μ’(z) -μ(x) -μ(y) -μ(z) = μ’(y) +μ’(z) -μ(x) -μ(y)= (μ’(y) -μ(x)) + (μ’(z) -μ(y))≤(μ’(x) -μ(x)) + (μ’(x) -μ(x))= 2 (μ’(x) -μ(x))与上种情况一样,我们也需要花费另外的1元钱来支付单位时间的操作。

当μ’(x) <μ(x) 时,显然 2 (μ’(x) -μ(x)) +1 ≤3 (μ’(x) -μ(x))。

也就是进行Zig-Zig操作的花费不超过3 (μ’(x) -μ(x))。

当μ’(x) =μ(x)时,我们可以证明μ’(x) +μ’(y) + μ’(z) <μ(x) +μ(y) +μ(z),也就是说我们不需要任何花费保持伸展树不变量,并且可以得到退回来的钱,用其中的1元支付访问、旋转等操作的费用。

为了证明这一点,我们假设μ’(x) +μ’(y) + μ’(z) >μ(x) +μ(y) +μ(z)。

联系图9,我们有μ(x) =μ’(x) =μ(z)。

那么,显然μ(x) =μ(y) =μ(z)。

于是,可以得出μ(x) =μ’(z) =μ(z)。

令a = 1 + |A| + |B|,b = 1 + |C| + |D|,那么就有[log a] = [log b] = [log (a+b+1)]。

①我们不妨设b≥a,则有[log (a+b+1)] ≥[log (2a)]= 1+[log a]> [log a] ②①与②矛盾,所以我们可以得到μ’(x) =μ(x) 时,Zig-Zig操作不需要任何花费,显然也不超过3 (μ’(x) -μ(x))。

情况三:与情况二类似,我们可以证明,每次Zig-Zag操作的花费也不超过3 (μ’(x) -μ(x))。

以上三种情况说明,Zig操作花费最多为3(μ(S)-μ(x))+1,Zig-Zig或Zig-Zag 操作最多花费3(μ’(x)-μ(x))。

那么将旋转操作的花费依次累加,则一次Splay(x,S)操作的费用就不会超过3μ(S)+1。

也就是说对于伸展树的各种以Splay操作为基础的基本操作的平摊复杂度,都是O(log n)。

所以说,伸展树是一种时间效率非常优秀的数据结构。

【伸展树的应用】伸展树作为一种时间效率很高、空间要求不大的数据结构,在解题中有很大的用武之地。

下面就通过一个例子说明伸展树在解题中的应用。

例:营业额统计Turnover (湖南省队2002年选拔赛)题目大意Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。

Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。

分析营业情况是一项相当复杂的工作。

由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。

经济管理学上定义了一种最小波动值来衡量这种情况:该天的最小波动值= min { | 该天以前某一天的营业额-该天的营业额| } 当最小波动值越大时,就说明营业情况越不稳定。

而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。

你的任务就是编写一个程序帮助Tiger来计算这一个值。

注:第一天的最小波动值为第一天的营业额。

数据范围:天数n≤32767,每天的营业额ai≤1,000,000。

最后结果T≤231。

初步分析题目的意思非常明确,关键是要每次读入一个数,并且在前面输入的数中找到一个与该数相差最小的一个。

相关文档
最新文档