- 2
- 0
- 约2.32万字
- 约 114页
- 2019-08-28 发布于四川
- 举报
(1)算法的定义:是对特定问题求解步骤的一种描述,是一个有穷的指令集,这些指令表示一个或多个操作。 (2)算法的特性(要素): 有穷性 算法应在执行有穷步后结束,且每一步都在有穷时间内完成。 确定性 每步定义都是确切、无歧义的。 可行性 算法中描述的操作应能通过执行有限次已经实现的基本运算而实现。 输入 有0个或多个输入。 输出 有一个或多个输出(处理结果)。 正确性:不含有语法错误;对于各种合法的输入数据能够得到满足规格说明要求的结果。 可读性:要求程序有较好的人机交互性,有助于人们对算法的理解。 健壮性:对输入的非法数据能作出适当的响应或处理。 效率与低存储需求:主要指算法的执行时间和所需的最大存储空间,这两方面主要和问题的规模有关。 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量,记作: S(n) = O(g(n)) 表示随着问题规模n的增大,算法运行所需存储量的增长率与g(n)的增长率相同。 算法的存储量包括: 输入数据所占空间; 程序本身所占空间; 辅助变量所占空间。 说明: 算法的所有性能之间都存在着或多或少的相互影响,因此,当设计一个算法,特别是大型算法时,要综合考虑算法的各项性能、算法的使用频率、算法处理的数据量的大小、算法描述语言的特性及算法运行的机器系统环境等各方面因素,才能设计出比较好的算法。 算法简单,但运行时所花费的时间量大。因此,我们在用穷举方法解决问题时,应尽可能将明显的不符合条件的情况排除在外,以尽快取得问题的解。 适合穷举策略求解的问题,首先必须满足其问题规模和可能解的规模(个数)不是特别大,且解变量的值的变化具有一定的规律性。 #includestdio.h void main() { int n,x,y,z,m=0; printf(请输入一个大于3的正整数:); scanf(%d,n); for(x=1;xn;x++) for(y=1;yn-x;y++) { z=n-x-y; if(x+yzx+zyz+yx(x!=y||z!=x||y!=z)x=yy=z) printf(%d:%d,%d,%d\n,++m,x,y,z); } } (1)逻辑推理:利用已知条件,通过分析和判断,得出正确的答案。 (2)算法的特性(要素): 假想值 算法执行过程中设计逻辑表达式的值得确定问题,用的最多就是0和1(两种选择问题),数字1,2,3……(有限多步) 表达式 根据推理描述条件转换成计算机识别的逻辑表达式。 穷举运算 优化算法,计算结果(也可以考虑递归) ●例题的隐式条件为: ◆一个新郎只能娶一位新娘,三个新郎的新娘互不相同。◆于是隐式条件表达为:((x!=y)(y!=z)(z!=x)) ●C语言参考程序代码: main() { char * xinlang[3]={“A”,“B”,“C”}; /*以新郎编号为下标的数组定义*/ int x,y,z; /*新娘对应的穷举变量定义*/ printf(%18s\n,The Result is:\n); for (x=1;x=3;x++) /*用穷举变量构造循环结构*/ for (y=1;y=3;y++) for (z=1;z=3;z++) if ((x!=y)(x!=z)(y!=z)) /* */ if ((x!=1)(x!=3)(z!=3)){ /*约束条件的表达式*/ printf(“ X 的新郎 是 %s\n”,xinlang[x-1]); /*输出求解出的夫妻关系*/ printf(“ Y 的新郎 是 %s\n”,xinlang[y-1]); printf(“ Z 的新郎 是 %s\n”,xinlang[z-1]);} } 4.6.1 案例描述 给你一个装有n枚硬币的袋子。n枚硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。你的任务是找出这枚伪造的硬币。 为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,比如天平。利用这台仪器,可以知道两组硬币的重量是否相同。 对n=2,3,4,5,6,7,8,9? N=80 ? 引例2:金块问题 有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇员所得到的金块重。如果有新的金块周
原创力文档

文档评论(0)