黄金分割与经典算法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

美,无处不在——浅谈“黄金分割”和信息学的联系安徽芜湖一中杨思雨摘要本文主要介绍了“黄金分割”与信息学竞赛的联系及其在一些信息学问题中的应用,全文可以分为四个部分。第一部分引言,主要介绍了“黄金分割”的由来及其和各领域的联系,进而提出探索黄金分割与信息学竞赛的联系。第二部分中逐渐深入的分析了一个例题,最终揭示了问题本质上与黄金分割数的联系,说明了黄金分割数在一些数学性较强的题目中有着广泛的应用。第三部分通过分析另一个例题,介绍了一种优选法——“黄金分割法”。第四部分指出黄金分割与信息学竞赛联系密切,总结全文。关键字黄金分割信息学联系目录引言......................................................................................2例题一..................................................................................2例题二..................................................................................6总结......................................................................................9参考文献............................................................................10附录....................................................................................10程序描述............................................................................12美,无处不在——浅谈“黄金分割”和信息学的联系安徽芜湖一中杨思雨第2页共17页引言早在古希腊时期,人们就发现了“黄金分割”。两千多年前,数学家欧多克斯提出了这样的问题:如图1,线段AB上有一点P,将线段AB分割为两段——AP和PB,若它们长度之比恰好等于整条线段AB与较长一段AP的长度之比,那么P点应该在线段AB什么位置呢?图1我们不妨假设线段AP的长度为1,设线段PB的长度为x,那么线段AB的总长度就是1+x。由APABPBAP,得到方程111xx。解出215x,记为φ,它的近似值为0.618。而相应的,线段AB的长度就是2151x,记为Φ。在这之后,人们围绕这个比值开展了许多研究,意大利著名的艺术家、科学家达·芬奇还把ф命名为“黄金分割数(GoldenSectionNumber)”。有趣的是,人们发现黄金分割在自然界和其它各个领域中到处可见。例如,人的肚脐是人体总长的黄金分割点,人的膝盖又是肚脐到脚跟的黄金分割点;在有些植物的茎上,相邻叶柄之间的夹角是137º28′,这恰好是把圆周分为1:0.618的两条半径的夹角。此外,黄金分割也被看作是美的化身,人们认为符合黄金分割比例的事物都非常协调,富有美感。这就使得它在建筑、绘画、雕塑、摄影和音乐等艺术领域也有着很广泛的应用,例如:在古希腊帕忒农神庙的设计中就存在着许多组黄金分割比;而在荷兰画家梵高的作品《岸边的渔船》中,整幅画的宽和高分别被桅杆和地平线分成两部分,这样的分割也正好符合了黄金分割比例。其实,在信息学也蕴含着这样的奥妙,本文就将通过两个例题,介绍信息学和黄金分割的一些联系。例题一取石子游戏(STONE)有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有美,无处不在——浅谈“黄金分割”和信息学的联系安徽芜湖一中杨思雨第3页共17页两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。输入输出要求输入文件由若干行,表示若干种石子的初始情况,其中每一行中包含两个非负整数a和b,表示两堆石子的数目,a和b均不大于1,000,000,000。输出文件对应也是若干行,每行包含一个数字1或0,如果最后你是胜利者,则为1,反之,则为0。样例输入和相应输出样例一输入输出6100样例二输入输出218447010问题描述有两堆石子,游戏开始后,由两个人轮流取石子,每次有两种取法:一是在任意一堆中取走任意数目的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完的人是胜者。现在给出初始的两堆石子的数目a和b(0≤a,b≤109),假设双方都采取最好的策略,判断先手是否有必胜策略。算法一问题中,两堆石子的个数a和b决定了最后的胜负。因此,我们用(a,b)作为表示当前局面的“状态”。通过建立博弈树,判断给出的初始状态(a,b)是必胜还是必败。需要注意的是,由于规则中两个石子堆并没有差别,因此状态(a,b)和状态(b,a)实际上是等价的。来看一个例子,游戏开始时,两堆石子的数目分别是1和2,那么初始状态为(1,2),自顶向下构造出的博弈树如图2(其中,重复子状态可以只扩展一个)。(0,0)(1,2)(0,2)(1,0)(1,1)(0,1)(0,0)(0,0)(0,1)(1,0)(0,1)(0,0)(0,0)美,无处不在——浅谈“黄金分割”和信息学的联系安徽芜湖一中杨思雨第4页共17页图2接下来,就可以分三种情况,判断各个状态的胜负情况:(1)如果一个状态没有子状态,根据规则判断胜负;(2)如果一个状态至少有一个子状态先手败,那么该状态先手胜;(3)如果一个状态的所有子状态都是先手胜,那么改状态先手败。图3这样,我们就可以得出初始状态的胜负情况(如图3)。具体实现时,可以采用动态规划或记忆化搜索解决。这个算法的空最坏情况下查询的次数约为2+[log1/ф108]间复杂度为O(N2),时间复杂度为O(N3)。附程序stone_1.pas。算法二显然上面的算法并不能有效的解决本题。我们需要进一步挖掘游戏规则的特点。根据两种取石子的方法,可以发现如果状态(a,b)是先手败,就能得到下面几种状态必为先手胜:(1)状态(a,i)(其中,i≠b)或状态(i,b)(其中,i≠a);(2)状态(a+i,b+i)(其中,i≠0)。也就是说,每个正整数在所有先手败状态中将出现且只出现一次,同时任何两个必败状态中两堆石子的差值各不相同。根据这个特点,我们可以构造出所有的先手败状态。首先,最小的先手败状态是(0,0),根据上面的规律,之后的先手败状态中就不再存在某一堆为0个石子的情况,同时也不会出现两堆石子个数相等的情况。因此,第二种先手败的状态中较小的一堆石子个数将是尚未出现的最小的整数1,而这种状态中两堆石子个数的差也是尚未出现的差值中最小的一个。这样,第二种先手必败的状态就是(1,2)。由此,我们得到了构造所有先手败状态的方法:开始时只有(0,0)一个先手败状态;第i次构造时,先找出在已知的先手败状态中没有出现的最小的整数a,则新产生的先手败状态就是(a,a+i)。这个算法的时间复杂度和空复杂度均为O(N)。附程序stone_2.pas。算法三(0,0)(1,2)(0,2)(1,0)(1,1)(0,1)(0,0)(0,0)(0,1)(1,0)(0,1)(0,0)(0,0)败败败败败败胜胜胜胜胜美,无处不在——浅谈“黄金分割”和信息学的联系安徽芜湖一中杨思雨第5页共17页虽然算法二的时空复杂度相对算法一有了巨大的进步,但由于本题数据规模巨大,仍然没有办法彻底解决。而这时,我们的分析也陷入如了僵局。那么就让我们先从小规模的情况开始分析。表1中列出了一些构造出来的必败状态(表中小数保留四位精度,下同)。可以发现,后面构造出来的状态中,较小一堆的石子数a与状态序号i的比值十分接近Φ!这提示我们,也许a的值与Φ∙i有一定的关系。所以,我们反过来观察Φ∙i与a之间的关系。在表2列出的小规模情况中,第i个必败状态中较小一堆的石子数a都恰好等于Φ∙i的整数部分。于是我们提出了这样的猜想:第i个必败状态是([Φ∙i],[(Φ+1)∙i])1。可以证明,这个猜想是正确的[1]。因此,我们得出结论,对于状态(a,b)(其中,a≤b),如果aa1且baa1,则先手必败,否则先手必胜。这样算法的时空复杂度均为常数级的,问题得到了圆满的解决。附程序stone_3.pas。解题小结表3将上述三个算法进行了比较。算法一是解决博弈问题的常规方法,同时定义了状态;算法二,深入挖掘了游戏规则,找出了其中的特性;算法三则通过分析一些小规模的数据,找到了常数级的算法。通过这样不断的分析和挖掘,终于找到了问题本质上与黄金分割的联系,发现了这样一个博弈问题中蕴含的美。时间复杂度空间复杂度基本算法算法一O(N3)O(N2)根据博弈树进行动归算法二O(N)O(N)构造必败状态算法三O(1)O(1)直接判断胜负情况表31本文中[x]表示x的整数部分,{x}表示x的小数部分。序号i必败状态(a,b)a/ib/i1(1,2)1.00002.00002(3,5)1.50002.50003(4,7)1.33332.33304(6,10)1.50002.50005(8,13)1.60002.6000…………997(1613,2610)1.61792.6179998(1614,2612)1.61722.6172999(1616,2615)1.61762.61761000(1618,2618)1.61802.6180表1序号iΦ∙i状态(a,b)11.6180(1,2)23.2361(3,5)34.8541(4,7)46.4721(6,10)58.0902(8,13)………9971613.1799(1613,2610)9981614.7979(1614,2612)9991616.4160(1616,2615)10001618.0340(1618,2618)表2美,无处不在——浅谈“黄金分割”和信息学的联系安徽芜湖一中杨思雨第6页共17页例题二登山问题(EXPLORER)【问题描述】一些OIer准备去翻越OIMountain,一条雄伟的山脉。但是开始登山之前,OIers希望先知道这条山脉的最高点的位置。山脉的横截面都是相同的,而且最高点两侧,山的高度也依次递减。OIer们可以使用卫星探测系统来测量某一具体位置上山的高度。每次,他们发出指令Explorer(x),这时卫星就会返回山脉横截面中,坐标为x的位置上,山的海拔高度。但是由于和卫星通信总是很慢,OIers希望能够在40次内找出那个最高点。你能做到么?【如何调用交互库】测试库提供三个函数:Start,Ask,Answer,它们的作用和用法如下:Start()必须首先调用,用它来获得实数L的值。Ask(X)的作用是询问,用它来获得函数f(x)的值。Answer(Ans)用来告诉测试库你得到的答案。LAns,0,表示你的程序判断函数f(x)在Ans处取到最大值。你的程序不得自行终止且不得访问任何文件。【对Pascal程序员的提示】你的程序应当使用下列语句引用测试库:usestools_p;测试库提供的函数/过程原型为:functionStart:double;functionAsk(x:double):double;procedureAnswer(ans:double);【对C++程序员的提示】你程序头加上一行:#include“tools_c.h”并且在RHIDE中设置Option-Linker为tools_c.o测试库提供的函数原型为:doubleStart();doubleAsk(doublex);doubl

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功