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

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

《算法设计与分析》

课程设计报告

题目:循环赛日程表

院(系):信息科学与工程学院

专业班级:软工

学生姓名:

学号:

指导教师:

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

分治法适用的情况:

分治法所能解决的问题一般具有以下几个特征:

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-1

Nx=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所示。

相关文档
最新文档