算法
一、 算法的定义
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
二、 算法的特性
- 输入输出:算法就有零个或多个输入,算法至少要有一个或多个输出
- 有穷性:在算法执行有限的步骤后,自动结束而不是出现无限循环,并且每一个步骤在可接受范围内完成。
- 确定性:算法的每一步都有确定的含义,不会出现二义性。
- 可行性:算法的每一步都必须是可行的,也就是说每一步都能执行有限的次数完成。
三、 算法设计的要求
- 正确性:算法的正确性是指算法至少应该具有中输入、输出、加工处理无歧义性,能正确反应问题的需求,得到问题的正确答案
- 可读性:算法设计的另一目的是为了便于阅读、理解和交流。
- 健壮性:当输入数据不合法时,算法能够做出相应的处理,而不是产生异常或莫名其妙的结果。
- 时间效率高存储量低:设计算法应该满足时间效率高和存储量低的要求。
四、 算法的效率度量方法
-
事后统计法
通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
缺陷:
①必须要编制好代码后才能测试,不太靠谱。
②依赖计算机硬件和软件等因素,不同计算机在运算速度上可能不同。
③算法的测试数据设计困难。例如,一个优秀的算法在一个小的测试数据上得不到明显的体现,但在大的数据测试下相比于不好的算法就显而易见。 -
事前分析估计法
在计算机编制前,依据统计方法对算法进行估算。
经过分析,抛开这些与计算机硬件软件相关的因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓问题的输入规模就是指输入量的多少。
//代码一、
int i,sum=0,n=100;//执行1次
for(i=1;i<=n;i++)//执行n+1次要有一次用来判断循环是否结束。
{
sum=sum+i;//执行n次
}
printf("%d",sum);//执行1次
// 代码二
int sum=0,n=100;//执行1次
sum=(1+n)*n/2;//执行1次
printf("%d",sum);//执行1次
显然,第一种算法执行了2n+3次,第二种算法执行了3次,算法的好坏显而易见。