第二章 算法
2.2 “数据结构”与“算法的关系”
简单的说:“数据结构”与“算法”的关系 --- 即:“梁山伯”与“祝英台”的关系
把其中一方隔离出来唱独角戏....没意义!
2.3 两种算法的比较
现写一个求1+2+3+......+100结果的程序,你应该怎么写呢?
大多数人马上写出下面的C语言代码:
int i, sum =0, n=100;
for (i=1;i<=n;i++)
{
sum =sum +i;
}
printf("%d",sum);
这是最简单的计算机程序之一,它就是一种算法,不去理解代码含义,问题在于,你的第一直觉这样写,是不是真的很好?是不是高效?
我们来看看高斯的解释算法:
用程序来实现如:
int i, sum=0,n=100;
sum = (1+n)*n/2;
printf("%d",sum);
神通就是神通,这样不仅可以用于1加到100,就是加到一千、一万、一亿(需要更改整型变量类型为长整型,否则溢出),也就是瞬间的事。
2.7 算法效率的度量方法
事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算。
经过分析,我们发现,一个用高级程序编写的程序在计算机上运行时间所消耗的时间取决于下列因素:
1.算法采用的策略、方法; //算法好坏的根本
2.编译产生的代码质量; //要由软件来支持
3.问题的输入规模;
4.机器执行的指令速度; //看硬件的性能
一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓问题输入规模是指输入量的多少。
我们来看下两种求和的算法:
第一种算法:
int i, sum =0, n=100; /*执行一次*/
for (i=1;i<=n;i++) /*执行n+1次*/
{
sum =sum +i; /*执行n次*/
}
printf("%d",sum); /*执行一次*/
第二种算法:
int i, sum=0,n=100; /*执行一次*/
sum = (1+n)*n/2; /*执行一次*/
printf("%d",sum); /*执行一次*/
显然,第一种算法,执行了 1+(n+1)+n+1=2n+3次 ;第二种算法,执行了1+1+1=3次
我们再来延伸一个例子:
int i ,j ,x=0,sum=0, n=100;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
x++;
sum =sum+x;
}
}
printf("%d",sum);
这个例子,i从1到100,每次都要让j循环100次,而当中的x++和sum=sum+x;其实就是1+2+3+...+100 ,也就是100^2次,所以这个算法当中,循环部分的代码整体需要执行n^2次。显然这个算法的执行次数对于同样的输入规模n=100,要多于前两种算法,这个算法的执行时间随着n的增加也将远远多于前两个。