算法设计与分析(详细解析(含源代码)).docx
《算法设计与分析(详细解析(含源代码)).docx》由会员分享,可在线阅读,更多相关《算法设计与分析(详细解析(含源代码)).docx(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、算法设计与分析(详细解析(含源代码) 常用算法设计方法 要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。算法数据结构是程序的两个重要方面。 算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。指令正确地描述了要完成的任务和它们被执行的顺序。计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解。 通常求解一
2、个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。其次是算法所需要的存储空间少和执行更快等。 算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。另外,为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用递归描述算法。 一、迭代法 迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行: (1)选一个方程的近似根,赋给变量x0; (2)将x0的值保存于变量x1,然后计算g(x1),并将
3、结果存于变量x0; (3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。 若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。上述算法用C程序的形式表示为: 迭代法求方程的根 x0=初始近似根; do x1=x0; x0=g(x1);/*按特定的方程计算新的近似根*/ while ( fabs(x0-x1)Epsilon); printf(“方程的近似根是%fn”,x0); 迭代算法也常用于求方程组的根,令 X=(x0,x1,x n-1) 设方程组为: x i=g i(X) (I=0,1,n-1) 则求方程组根的迭代算法可描述如下
4、: 迭代法求方程组的根 for (i=0;idelta) delta=fabs(yi-xi); while (deltaEpsilon); for (i=0;i0;j-) if (*ptj*ptj-1) break; if (j=0) break; for (i=V ARIABLES-1;i=j;i-) if (*pti*pti-1) break; t=*ptj-1;* ptj-1 =* pti; *pti=t; for (i=V ARIABLES-1;ij;i-,j+) t=*ptj; *ptj =* pti; *pti=t; 从上述问题解决的方法中,最重要的因素就是确定某种方法来确定所有的
5、候选解。下面再用一个示例来加以说明。 背包问题 问题描述:有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。 设n个物品的重量和价值分别存储于数组w 和v 中,限制重量为tw。考虑一个n元组(x0,x1,x n-1),其中x i=0 表示第i个物品没有选取,而x i=1则表示第i个物品被选取。显然这个n元组等价于一个选择方案。用枚举法解决背包问题,需要枚举所有的选取方案,而根据上述方法,我们只要枚举所有的n元组,就可以得到问题的解。 显然,每个分量取值为0或1的n元组的个数共为2n个。而每个n元组其实对应
6、了一个长度为n的二进制数,且这些二进制数的取值范围为02n-1。因此,如果把02n-1分别转化为相应的二进制数,则可以得到我们所需要的2n个n元组。 maxv=0; for (i=0;i0;i-) printf(“%d”,ai); printf(“nn”); void main() int aMAXN,n,k; printf(“Enter the number n: “); scanf(“%d”,&n); a0=1; a1=1; write(a,1); for (k=2;k1时)。 写成递归函数有: int fib(int n) if (n=0) return 0; if (n=1) retu
7、rn 1; if (n1) return fib(n-1)+fib(n-2); 递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中, 当n为1和0的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 详细 解析 源代码
限制150内