当前位置:文档之家› 使用分治策略递归和非递归和递推算法解决循环赛日程表课程设计报告

使用分治策略递归和非递归和递推算法解决循环赛日程表课程设计报告

《算法设计与分析》课程设计报告题目:循环赛日程表院(系):信息科学与工程学院专业班级:软工学生姓名:学号:指导教师:2018 年 1 月 8 日至 2018 年 1 月 19 日算法设计与分析课程设计任务书目录1 常用算法 (1)1.1分治算法 (1)基本概念: (1)1.2递推算法 (2)2 问题分析及算法设计 (5)2.1分治策略递归算法的设计 (5)2.2 分治策略非递归算法的设计 (7)2.3 递推策略算法的设计 (8)3 算法实现 (9)3.1分治策略递归算法的实现 (9)3.2 分治策略非递归算法的实现 (10)3.3 递推策略算法的实现 (12)4 测试和分析 (15)4.1分治策略递归算法测试 (15)4.2分治策略递归算法时间复杂度的分析 (16)4.3 分治策略非递归算法测试 (16)4.4分治策略非递归算法时间复杂度的分析 (17)时间复杂度为:O(5^(n-1)) (17)4.5 递推策略算法测试 (17)4.6 递推策略算法时间复杂度的分析 (18)时间复杂度为:O(5^(n-1)) (18)4.7 三种算法的比较 (18)5 总结 (19)参考文献 (20)1 常用算法1.1分治算法基本概念:在计算机科学中,分治法是一种很重要的算法。

字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。

问题的规模越小,越容易直接求解,解题所需的计算时间也越少。

例如,对于n个元素的排序问题,当n=1时,不需任何计算。

n=2时,只要作一次比较即可排好序。

n=3时只要作3次比较即可,…。

而当n较大时,问题就不那么容易处理了。

要想直接解决一个规模较大的问题,有时是相当困难的。

基本思想及策略:分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

这种算法设计策略叫做分治法。

如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。

由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。

在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。

这自然导致递归过程的产生。

分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。

分治法适用的情况:分治法所能解决的问题一般具有以下几个特征:1) 该问题的规模缩小到一定的程度就可以容易地解决2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。

3) 利用该问题分解出的子问题的解可以合并为该问题的解;4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

1.2递推算法递推算法是一种根据递推关系进行问题求解的方法。

递推关系可以抽象为一个简单的数学模型,即给定一个数的序列a0,a1...,an若存在整数n0,使当n>n0时可以用等号将an与其前面的某些项ai联系起来,这样的式子成为递推公式。

递推算法是一种简单的算法,通过已知条件利用特点的递推关系可以得出中间推论,直至得到问题的最终结果,递推算法分为顺推法和逆推法两种,顺推法则是在不知道初始条件的情况下,从问题的结果除非经递推关系逐步推算出问题的解,这个问题的解也是问题的初始条件。

递归法是从已知条件出发,一步步地递推出未知项,直到问题的解。

递归也是递推的一种,只不过它是对待解问题的递推,知道把一个负责的问题递推为简单的易解问题,然后再一步步返回,从而得到原问题的解。

严格来讲,递归不仅仅是一种问题求解方法,更是一种编程技术,许多算法可以通过递归技术来编程实现。

在计算机科学中,人们把程序直接或间接调用自身的过程称为递归。

过程或函数直接调用自身的递归成为直接递归,间接调用自身的递归称为间接递归。

在问题求解中,采用递归算法有两个重要的好处:一是容易证明算法有两个重要的好处,其次是代码实现简洁,代码编程量少。

不足是程序运行效率较低。

递推算法的基本思想是把一个复杂庞大的计算过程转化为简单过程的多次重复。

该算法利用了计算机速度快和自动化的特点。

而递归法的思想是从已知条件出发,一步步地递推出未知项,直到问题的解。

五种典型的递推关系:1.Fibonacci数列在所有的递推关系中,Fibonacci数列应该是最为大家所熟悉的。

在最基础的程序设计语言Logo语言中,就有很多这类的题目。

而在较为复杂的Basic、Pascal、C语言中,Fibonacci数列类的题目因为解法相对容易一些,逐渐退出了竞赛的舞台。

可是这不等于说Fibonacci数列没有研究价值,恰恰相反,一些此类的题目还是能给我们一定的启发的。

Fibonacci数列的代表问题是由意大利著名数学家Fibonacci于1202年提出的“兔子繁殖问题”(又称“Fibonacci问题”)。

问题的提出:有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。

问过n个月后共有多少对兔子?解:设满x个月共有兔子Fx对,其中当月新生的兔子数目为Nx对。

第x-1个月留下的兔子数目设为Fx-1对。

则:Fx=Nx+ Fx-1Nx=Fx-2 (即第x-2个月的所有兔子到第x个月都有繁殖能力)∴ Fx=Fx-1+Fx-2 边界条件:F0=0,F1=1由上面的递推关系可依次得到:F2=F1+F0=1,F3=F2+F1=2,F4=F3+F2=3,F5=F4+F3=5,……。

Fabonacci数列常出现在比较简单的组合计数问题中,例如以前的竞赛中出现的“骨牌覆盖”问题。

在优选法中,Fibonacci数列的用处也得到了较好的体现。

2.Hanoi塔问题问题的提出:Hanoi塔由n个大小不同的圆盘和三根木柱a,b,c组成。

开始时,这n个圆盘由大到小依次套在a柱上,如图3-11所示。

要求把a柱上n个圆盘按下述规则移到c柱上:(1)一次只能移一个圆盘;(2)圆盘只能在三个柱上存放;(3)在移动过程中,不允许大盘压小盘。

问将这n个盘子从a柱移动到c柱上,总计需要移动多少个盘次?解:设hn为n个盘子从a柱移到c柱所需移动的盘次。

显然,当n=1时,只需把a 柱上的盘子直接移动到c柱就可以了,故h1=1。

当n=2时,先将a柱上面的小盘子移动到b柱上去;然后将大盘子从a柱移到c 柱;最后,将b柱上的小盘子移到c柱上,共记3个盘次,故h2=3。

以此类推,当a柱上有n(n2)个盘子时,总是先借助c柱把上面的n-1个盘子移动到b柱上,然后把a柱最下面的盘子移动到c柱上;再借助a柱把b柱上的n-1个盘子移动到c柱上;总共移动hn-1+1+hn-1个盘次。

∴hn=2hn-1+1 边界条件:h1=13.平面分割问题问题的提出:设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。

解:设an为n条封闭曲线把平面分割成的区域个数。

由图3-13可以看出:a2-a1=2;a3-a2=4;a4-a3=6。

从这些式子中可以看出an-an-1=2(n-1)。

当然,上面的式子只是我们通过观察4幅图后得出的结论,它的正确性尚不能保证。

下面不妨让我们来试着证明一下。

当平面上已有n-1条曲线将平面分割成an-1个区域后,第n-1条曲线每与曲线相交一次,就会增加一个区域,因为平面上已有了n-1条封闭曲线,且第n条曲线与已有的每一条闭曲线恰好相交于两点,且不会与任两条曲线交于同一点,故平面上一共增加2(n-1)个区域,加上已有的an-1个区域,一共有an-1+2(n-1)个区域。

所以本题的递推关系是an=an-1+2(n-1),边界条件是a1=1。

4.Catalan数Catalan数首先是由Euler在精确计算对凸n边形的不同的对角三角形剖分的个数问题时得到的,它经常出现在组合计数问题中。

问题的提出:在一个凸n边形中,通过不相交于n边形内部的对角线,把n边形拆分成若干三角形,不同的拆分数目用hn表示,hn即为Catalan数。

例如五边形有如下五种拆分方案(图3-14),故h5=5。

求对于一个任意的凸n边形相应的hn。

5.第二类Stirling数n个有区别的球放到m个相同的盒子中,要求无一空盒,其不同的方案数用S(n,m)表示,称为第二类Stirling数。

根据定义来推导带两个参数的递推关系——第二类Stirling数。

解:设有n个不同的球,分别用b1,b2,……bn表示。

从中取出一个球bn,bn的放法有以下两种:①bn独自占一个盒子;那么剩下的球只能放在m-1个盒子中,方案数为S2(n-1,m-1);②bn与别的球共占一个盒子;那么可以事先将b1,b2,……bn-1这n-1个球放入m个盒子中,然后再将球bn可以放入其中一个盒子中,方案数为mS2(n-1,m)。

综合以上两种情况,可以得出第二类Stirling数定理:【定理】S2(n,m)=mS2(n-1,m)+S2(n-1,m-1) (n>1,m1)边界条件可以由定义2推导出:S2(n,0)=0;S2(n,1)=1;S2(n,n)=1;S2(n,k)=0(k>n)。

2 问题分析及算法设计2.1分治策略递归算法的设计从本问题的具体情况出发,根据分治算法思想,设计出本问题的分治递归算法按分治策略,可将所有选手分成两组。

n个选手的比赛日程表,可以通过n/2个选手的比赛日程表,可以通过n/4个选手设计日程表来决定;……;直到为2个选手的比赛日程表。

这样比赛日程表的设计就变得很简单,这时只要让两个选手互相比赛即可,这样可以形成n/2组2个选手的比赛日程表(如表1、表2)。

然后再反过来在两个选手的日程表上为4个选手设计比赛日程表(如表3)。

然后再类推到8个、16个、……、2k个选手。

对所有运动员的赛程进行安排,并将其存入数组内:由初始化的第一行填充第二行:(填充原则是对角线填充)最后是第三部分的填充1 2 3 4 5 6 7 82 1 43 6 5 8 73 4 1 2 7 8 5 64 3 2 1 8 7 6 55 6 7 8 1 2 3 46 5 87 2 1 4 37 8 5 6 3 4 1 28 7 6 5 4 3 2 1 这样循环,直到填充完毕递归算法解:2.2 分治策略非递归算法的设计分治策略同上。

相关主题