程序精简第一步之百鸡问题(减少循环提高运行速度)
2010-01-15 10:36
260 查看
引言:
此文献给各个初学编程,和刚入门的编程的各位,也以此文告诫自己不断的优化,不断的去提高程序的效率
百鸡问题其实很简单,但是从百鸡问题中映射出的程序算法的精简是程序开发的第一步
百鸡问题的题目是这样的:公鸡5元一只,母鸡3元一只,小鸡1元3只,100元能买多少公鸡,母鸡,小鸡?
第一种(穷举法):
可以通过分析题意理解出,公鸡x的取值只能在1~19之间,毕竟还要有母鸡,小鸡
母鸡y的取值只能在1~32之间,不能超过32,因为就会超过96元,但是还要买公鸡,小鸡
小鸡z的取值只能在3~98之间,而且应该是3的整倍数
可以得出一个方程组:
x+y+z=100
5*x+3*y+z/3=100
只要满足方程就能得到一组解,则算法如下:
int x,y,z;
for(x=1;x<=19;x++)
{
for(y=1;y<=32;y++)
{
for(z=3;z<=98;z+=3)
{
if(x+y+z==100&&x*5+y*3+z/3==100)
{
Console.WriteLine("公鸡:"+x.ToString()+"只 母鸡:"+y.ToString()+"只 小鸡:"+z.ToString()+"只");
}
}
}
}
从上面的解法可以看出,外重循环会执行19次,每执行一次,中间的循环要执行32次,而中间的循环执行一次,最里面的循环要执行32次
所以三重循环执行需要 19456 次
对于上面的程序来说,是不是有一种方法可以去优化呢?从而减少循环的次数提高运行的效率
第二种(基于穷举法的优化):
程序运行的时间与穷举算法的次数成正比,虽然这个百鸡问题不能很直观的显示出算法优化的速度,但是优化算法的理念还是要去追求的
为了提高运算速度,必须从循环的重数下手
通过方程式的变,可以得出 z=100-x-y带入另外一个方程可以简化成 7*x+4*y=100
所以算法可以精简如下:
int x,y,z
for(x=1;x<=19;x++)
{
for(y=1;y<=32;y++)
{
if(7*x+4*y==100)
{
Console.WriteLine("公鸡:"+x.ToString()+"只 母鸡:"+y.ToString()+"只 小鸡:"+Convert.ToString(100-x-y)+"只");
break;
}
}
}
通过优化循环执行次数已经从原先的 19456 次 简化至 608 次
既然可以这样优化,拿能不能再精简我们的方程组而达到一重循环呢?
进一步分析百鸡问题,发现公鸡x应该是4的整数倍,所以,既然要一重循环,那么必须进一步优化我们的方程组,则:
y=25-7*x/4
z=75+3*x/4
因此,根据方程式可以将算法优化成以下的方法
int x,y,z
for(x=4;x<=19;x+=4)
{
y=25-7*x/4;
z=75+3*x/4;
if(y>0&&y<=32&&z<=98)
{
Console.WriteLine("公鸡:"+x.ToString()+"只 母鸡:"+y.ToString()+"只 小鸡:"+z.ToString()+"只");
}
}
对于这个方法循环的次数可由原先的 608 次 简化至 4 次
总结:
百鸡问题虽小,但是折射出优化算法提高程序效率的理念是不言而喻的
此文献给各个初学编程,和刚入门的编程的各位,也以此文告诫自己不断的优化,不断的去提高程序的效率
百鸡问题其实很简单,但是从百鸡问题中映射出的程序算法的精简是程序开发的第一步
百鸡问题的题目是这样的:公鸡5元一只,母鸡3元一只,小鸡1元3只,100元能买多少公鸡,母鸡,小鸡?
第一种(穷举法):
可以通过分析题意理解出,公鸡x的取值只能在1~19之间,毕竟还要有母鸡,小鸡
母鸡y的取值只能在1~32之间,不能超过32,因为就会超过96元,但是还要买公鸡,小鸡
小鸡z的取值只能在3~98之间,而且应该是3的整倍数
可以得出一个方程组:
x+y+z=100
5*x+3*y+z/3=100
只要满足方程就能得到一组解,则算法如下:
int x,y,z;
for(x=1;x<=19;x++)
{
for(y=1;y<=32;y++)
{
for(z=3;z<=98;z+=3)
{
if(x+y+z==100&&x*5+y*3+z/3==100)
{
Console.WriteLine("公鸡:"+x.ToString()+"只 母鸡:"+y.ToString()+"只 小鸡:"+z.ToString()+"只");
}
}
}
}
从上面的解法可以看出,外重循环会执行19次,每执行一次,中间的循环要执行32次,而中间的循环执行一次,最里面的循环要执行32次
所以三重循环执行需要 19456 次
对于上面的程序来说,是不是有一种方法可以去优化呢?从而减少循环的次数提高运行的效率
第二种(基于穷举法的优化):
程序运行的时间与穷举算法的次数成正比,虽然这个百鸡问题不能很直观的显示出算法优化的速度,但是优化算法的理念还是要去追求的
为了提高运算速度,必须从循环的重数下手
通过方程式的变,可以得出 z=100-x-y带入另外一个方程可以简化成 7*x+4*y=100
所以算法可以精简如下:
int x,y,z
for(x=1;x<=19;x++)
{
for(y=1;y<=32;y++)
{
if(7*x+4*y==100)
{
Console.WriteLine("公鸡:"+x.ToString()+"只 母鸡:"+y.ToString()+"只 小鸡:"+Convert.ToString(100-x-y)+"只");
break;
}
}
}
通过优化循环执行次数已经从原先的 19456 次 简化至 608 次
既然可以这样优化,拿能不能再精简我们的方程组而达到一重循环呢?
进一步分析百鸡问题,发现公鸡x应该是4的整数倍,所以,既然要一重循环,那么必须进一步优化我们的方程组,则:
y=25-7*x/4
z=75+3*x/4
因此,根据方程式可以将算法优化成以下的方法
int x,y,z
for(x=4;x<=19;x+=4)
{
y=25-7*x/4;
z=75+3*x/4;
if(y>0&&y<=32&&z<=98)
{
Console.WriteLine("公鸡:"+x.ToString()+"只 母鸡:"+y.ToString()+"只 小鸡:"+z.ToString()+"只");
}
}
对于这个方法循环的次数可由原先的 608 次 简化至 4 次
总结:
百鸡问题虽小,但是折射出优化算法提高程序效率的理念是不言而喻的
相关文章推荐
- 程序精简第一步之百鸡问题(减少循环提高运行速度)
- matlab运行出现“变量似乎会随着迭代次数改变而变化,请预分配内存,以提高运行速度”问题
- 关于asp.net程序第一次运行速度慢的问题解决办法
- 提高程序运行速度 让Ext JS华而又实
- 如何减少内存分配频率,提高程序运行效率
- 提高程序运行速度 让Ext JS华而又实
- 让程序的运行速度提高100倍
- 减少缓存冲突,提高程序执行速度
- [转载]提高Python程序的运行速度_李小红_新浪博客
- 提高系统运行速度,阻止木马病毒程序运行 软件限制策略
- 提高程序运行速度的方法
- 数学建模_使用ginput函数提高CV模型程序的运行速度
- .解决带迅盘的机器WIN7关机速度慢的问题(去掉 ReadyBoost),怎样用询盘加速程序运行(装turbo momery dashboard)
- 优化Ruby代码使程序运行速度提高的例子
- 如何利用VS的代码优化和openmp并行计算提高程序运行速度
- linux运行自启动死循环java程序 及 必须注意的问题
- C++程序提高运行速度的方法
- 利用VS的代码优化和openmp并行计算提高程序运行速度
- 易语言内存不能为read错误解决方案和提高程序运行速度
- C# ASP.NET 优化程序性能、降低内存使用、提高程序运行速度