算法的基本概念
一般来说,算法的好坏直接决定了所实现软件性能的优劣。
通常来说,关于算法有如下几个 方面需要进行考虑
- 用什么方法来设计算法
- 所设计算法所需要的资源
- 需要的运行时间和存储空间
- 判定一个语法的好坏
算法的定义和特性
算法的定义
算法是解某一特定问题的一组有穷规则的集合
算法的特性
- 有限性:算法在有限步后必须终止
- 确定性:算法的每一步都有精确意义
- 输入:算法有0或多个输入
- 输出:算法有一或多个输出
- 能行性:算法中所实现的运算都是基本的运算
基础的算法–穷举法
- 百鸡问题:
今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?
这个问题用解析法是比较麻烦的,是一个三元不定方程组,这时就可以用穷举法来解决。
穷举法:
就是从有限集合中,注意列举集合的所有元素,对每个元素逐一进行判断和处理,从而找出问题的解。
void chicken(int n,int &k,int g[],int m[],int s[])
{
int a,b,c;
k = 0;
for (a=0;a<=n;a++){
for (b=0;b<=n;b++){
for (c=0;c<=n;c++){
if((a+b+c==n)&&(5*a+3*b+c/3==n)&&(c%3==0)){
g[k]=a;
m[k]=b;
s[k]=c;
k++;
}
}
}
}
}
该方法的外层循环执行n+1次,中间循环执行(n+1)(n+1)次,内循环执行(n+1)(n+1)(n+1)次,在这个问题中,循环体执行会超过100万次。
如果我们对于这个问题稍作思考和转换,n原钱只能买到n/5只公鸡或者n/3只母鸡,小鸡数量又可以通过公鸡和母鸡数量求出来
void chicken(int n,int &k,int g[],int m[].int s[])
{
int a,b,c,i,j;
k = 0;
i = n/5;
j = n/3;
for (a=0;a<=i;a++){
for (b=0;b<=j;b++){
c = n - a - b;
if ((5*a+3*b+c/3==n)&&(c%3==0)){
a[k]=a;
m[k]=b;
s[k]=c;
k++;
}
}
}
}
n=100时,只会执行(n/5+1)(n/3+1)=714次,减小很多。
然而这并不是问题的最优解,在解决问题时,我们有两个方程
x+y+z=100;
5x+3y+z/3=100;
我们对这个方程组进行消元可得
7x+4y=100;
因为X,Y,Z均不能为负,所以可以轻易得出
x的取值范围是【0,12】==n的取值范围是【0,3】
所以可以进行更少的循环得出问题的结果
#include <stdio.h>
main( )
{ int cocks,hens,chicks;//公鸡、母鸡、小鸡
for(int n=0;n<=3;n++)
{ cocks=4*n;
hens=25-7*n;
chicks=75+3*n;
printf("%d,%d,%d\n",cocks,hens,chicks);
}
}
这时候会引出一个新问题
算法复杂度
一般情况下,会用算法的复杂度来衡量一个算法的效率。
算法的复杂度分为
- 时间复杂度
- 空间复杂度
一般情况下,对于算法的时间复杂度我们考虑更多。