程序精简第一步之百鸡问题(减少循环提高运行速度)
来源:互联网 发布:电阻识别软件 安卓版 编辑:程序博客网 时间:2024/06/07 01:40
引言:
此文献给各个初学编程,和刚入门的编程的各位,也以此文告诫自己不断的优化,不断的去提高程序的效率
百鸡问题其实很简单,但是从百鸡问题中映射出的程序算法的精简是程序开发的第一步
百鸡问题的题目是这样的:公鸡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程序的运行速度
- 提高程序运行速度的方法
- C++程序提高运行速度的方法
- 如何减少内存分配频率,提高程序运行效率
- 提高eclipse运行速度
- 提高eclipse运行速度
- 提高eclipse运行速度
- 提高Magento运行速度
- 提高eclipse运行速度
- matlab提高运行速度
- 提高matlab运行速度
- 提高studio运行速度
- 让程序的运行速度提高100倍
- 提高PLC程序运行速度的编程方法
- Svn 学习
- 【Bing Map学习系列】(7)——如何使用Bing Maps Silverlight Control汇总
- J2EE程序的性能优化技巧 【转】
- 张亚勤新作《变革中的思索》谈高科技人才管理
- Hadoop跟Sector/Sphere对比
- 程序精简第一步之百鸡问题(减少循环提高运行速度)
- Spring和Struts 2整合
- 必须掌握的八个【cmd 命令行】
- Oracle 9.2下的“System.Exception: System.Data.OracleClient requires Oracle client software version 8.1.7 or greater”
- 直接附加数据库的批处理文件 和 执行sql 脚本的批处理文件的写法
- javascript 提交加密
- test
- 上山打老虎个人论坛源码
- 楼市看法