摘要: 尽管递归程序在执行时间上往往比非递归程序要付出更多,但有很多问题的数学模型或算法设计方法本来就是递归的,用递归过程来描述它们不仅非常自然,而且证明该算法的正确性也比相应的非递归形式容易得多,因此递归不失为是一种强有力的程序设计方法。 下面来举个例子:已知元素x,判断x是否在a(1:n)中。算法思想:在a(1:n)中检索x,若存在,返回该元素在a[]中的下标,否则,返回0。解决这一问题的递归算法可描述如下:算法4.3 在数组a(1:n)中检索x是否存在int void Search(int a[],int i,int x) {//设a[1..n]和x是全局变量//在a[1..n]中若有元素... 阅读全文
posted @ 2013-11-07 22:20 技术让梦想更伟大 阅读(621) 评论(0) 推荐(0) 编辑
摘要: 时间复杂性的计算一般而言,较小的问题所需要的运行时间通常要比较大的问题所需要的时间少。设一个程序P所占用的时间为T,则 T(P)=编译时间+运行时间。编译时间与实例特征是无关的,且可假设一个编译过的程序可以运行多次而无需再编译。因此分析程序的时间特性就只需考虑程序的运行时间。令程序P的运行时间为tp(n),其中n是所要求解问题的实例特征。由于编写程序时,影响tp的许多因素还是未知的,所以只能对tp进行估算。由于代码P的主要操作通常包括加、减、乘、除、比较、读、写等,而这些操作的执行时间是可预知的,从而可用下面的公式计算程序P的运行时间: tp(n)=ca*ADD(n... 阅读全文
posted @ 2013-11-07 13:16 技术让梦想更伟大 阅读(664) 评论(0) 推荐(0) 编辑
摘要: 1.大写Ο符号大写Ο符号给出了函数f的一个上限。定义[大写Ο符号]:f(n)=Ο(g(n)),当且仅当存在正的常数c和n0,使得对于所有的n≥n0,有 f(n)≤c*g(n)上述定义表明,函数f至多是函数g的c倍,除非n小于n0。因此,对于足够大的n(如n≥n0),g 是 f 的一个上限(不考虑常数因子 c )。在为函数 f 提供一个上限函数 g 时,通常使用比较简单的函数形式。比较典型的形式是含有 n 的单个项(带一个常数系数)。对于对数函数logn,没有给出对数的基数,是因为对于任何大于1的常数 a 和 b ,都有:logan=logbn/logba所以logan和logbn都有一个相对的 阅读全文
posted @ 2013-11-07 10:57 技术让梦想更伟大 阅读(429) 评论(0) 推荐(0) 编辑
摘要: Niklaus Wirth:Algorithm + Data Structures = Programs 这句话呢,觉得很正确,算法和程序是不同的概念,算法的思想呢有递推,枚举,分治,贪婪,试探法,模拟,这些都是一些基础的算法思想,一个“好”的算法,通常要考虑如下几个目标:􀀹正确性:算法应满足求解具体问题的需求。 对正确性的理解有不同程度1.不含语法错误;2.对几组输入数据能够得到满足规格需求的解;3.对精心选择的典型数据能够得到满足规格需求的解;4.对一切合法的输入数据都能得到满足规格需求的解。􀀹可读性:算法要便于交流,要有助于别人对算法的理解。h 阅读全文
posted @ 2013-11-07 09:56 技术让梦想更伟大 阅读(428) 评论(0) 推荐(0) 编辑