程序精简第一步之百鸡问题(减少循环提高运行速度)

来源:互联网 发布:电阻识别软件 安卓版 编辑:程序博客网 时间: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 次

 

总结:

 

百鸡问题虽小,但是折射出优化算法提高程序效率的理念是不言而喻的

原创粉丝点击