分享

据说研究算法的效率很可怕(一)

 天道酬勤YXJ1 2016-09-30

何为效率?

比如,别人做一件事情用了一个小时,而你只用了半个小时,这就是效率。

初学者写的代码简短,几乎感觉不出不同算法执行时间的差异。然而,程序员不可能永远写小程序。当程序写大的时候,效率就成了最重要的考虑情况之一。

怎样优化算法,提高算法的效率呢?

我们先来看看两个词,时间复杂度和空间复杂度。

1.时间复杂度,百度百科给出的定义是:

计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。

2.空间复杂度,百度百科给出的定义是:

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。

我们现在只研究时间的效率。毕竟很多时候鱼与熊掌不可兼得,空间不值钱,消耗时间少才是王道。怎样来提高时间效率呢?这可不是一句两句就说的清楚的,需要大量的代码积累。这里只是举几个例子。

据说研究算法的效率很可怕(一)

1. 大程序消耗时间长的地方主要还是循环上面,循环次数为千万乃至亿的级别时,消耗的时间是很吓人的,有时候一个算法执行几天几夜都是很有可能的。所以最先考虑的应该是减少循环次数。

比如,本来可以循环到一半就可以完成的。不要循环到全部。比如判断质数,一个数能被另一个数整除,那么另一个数肯定小于等于这个数的一半,所以只需循环到一半就行了。可以减少一半的时间。

for(int i=1; i

for(int i=1; i

2. 能先判断了再循环的就不要再循环里每次都判断,比如排序算法中的升序还是降序。看代码,这是循环里面判断:

int[] array={0,3,6,8,34,5,7,4};

boolean isShengXu=false;

int temp;

for(int i=0;i<>

for(int j=i+1;j<>

if(isShengXu==true){

if(array[i]>array[j]){

temp=array[i];

array[i]=array[j];

array[j]=temp;

}

}

else{

if(array[i]>array[j]){

temp=array[i];

array[i]=array[j];

array[j]=temp;

}

}

}

}

这个程序有好多处事可以优化的,第一个就是前面说的循环内判断,这是每次循环都要判断一次,把判断放到外面的话就只需要判断一次,虽然程序会变大,这就是牺牲了空间。

int[] array={0,3,6,8,34,5,7,4};

boolean isShengXu=false; //这里的改变

int temp;

if(isShengXu==true){

for(int i=0;i<>

for(int j=i+1;j<>

if(array[i]>array[j]){

temp=array[i];

array[i]=array[j];

array[j]=temp;

}

}

}

}

else{

for(int i=0;i<>

for(int j=i+1;j<>

if(array[i]<>

temp=array[i];

array[i]=array[j];

array[j]=temp;

}

}

}

}

优化了判断。还可以优化计算的次数,这里每次循环都要计算一次array.length,因为这个值是没有变的,所以我们在循环外把它先计算出来。

int[] array={0,3,6,8,34,5,7,4};

boolean isShengXu=false;

int temp;

int length=array.length; //这里的改变

if(isShengXu==true){

for(int i=0;i<>

for(int j=i+1;j<>

if(array[i]>array[j]){

temp=array[i];

array[i]=array[j];

array[j]=temp;

}

}

}

}

else{

for(int i=0;i<>

for(int j=i+1;j<>

if(array[i]<>

temp=array[i];

array[i]=array[j];

array[j]=temp;

}

}

}

}

这样程序又可以减少很多的执行时间。

今天就差不多讲这么多吧。多了显示效果也不好。

下次继续。初学者慢慢来,慢慢体验算法的优化奥秘。

据说研究算法的效率很可怕(一)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约