穷举法(例:买鸡)如何优化
本文主要为关于优化的思考,可通过时间(可创建折线图)观察区别。
公鸡1只5钱,母鸡一只3钱,雏鸡3只一钱,100钱买100只,问多少种方式,运行时间。
最初代码
#include <stdio.h>
#include <time.h>
const int N=100;
int main()
{
int start=clock();
int a,b,c;
for(a=0;a<=N;a++)
for(b=0;b<=N;b++)
for(c=0;c<N;c=c+3)
{
if((a+b+c)==N&&(5*a+3*b+c/3)==N)//found
{
printf("%d,",a);
printf("%d,",b);
printf("%d\n",c);
}
}
int end=clock();
int t=end-start;
printf("穷举搜索全部解空间计算需要:%dms\n",t);
}
N=100时
N=5000时(有太多种情况,只看时间,之后的也都为测试N=5000的情况)
尝试缩小变量循环范围
#include <stdio.h>
#include <time.h>
const int N=5000;
int main()
{
int start=clock();
int a,b,c;
for(a=0;a<=N/5;a++)
for(b=0;b<=N/3;b++)
for(c=0;c<N;c+=3)
{
if((a+b+c)==N&&(5*a+3*b+c/3)==N)//found
{
/*printf("%d,",a);
printf("%d,",b);
printf("%d\n",c);*/
}
}
int end=clock();
int t=end-start;
printf("穷举搜索全部解空间计算需要:%dms\n",t);
}
此时,a的范围缩小至原来的五分之一,b缩小至3分之一,时间也缩小至原来的15分之一。
尝试减少循环的次数
#include <stdio.h>
#include <time.h>
const int N=5000;
int main()
{
int start=clock();
int a,b,c;
for(a=0;a<=N/5;a++)
for(b=0;b<=N/3;b++)
// for(c=0;c<N;c=c+3)
{
c=N-b-a;
if((5*a+3*b+c/3)==N&&c%3==0)//found
{
/*printf("%d,",a);
printf("%d,",b);
printf("%d\n",c);*/
}
}
int end=clock();
int t=end-start;
printf("穷举搜索全部解空间计算需要:%dms\n",t);
}
减少了一个循环,时间只需4秒,优化的效果更加明显。
如何对算法进行最大程度的优化,是值的考虑学习的问题。要继续学习,继续补充。