最为一个码农,要想往资深的方向发展,总是需要学习和了解算法这种高大上的技术。最近我将会把我学习到的算法能容进行一个总结分享给各位朋友,希望对大家有所帮助。
今天先学习一下算法里的大O符号。
程序就是为了解决问题而存在,那什么才是解决问题的最好方案。答案是性能。
这里先说一点,现实生活中很难找到最好的解决方案。
我们先看一个题目,写一个方法接收一个数值,从0开始加到函数接收到的数值。
实现方法如上图所示,进行循环遍历,然后将结果值进行相加。
那么问题来了,如果传入的值足够,比如说一个亿,就会发现,随着数值的增长,程序计算所消耗的时间就越大。而这个曲线对应的就是大O表示法里的线性阶。
同样一个问题,还有另外一个表示方法,如下图:
如上图所示,这个算法是第一个数值+最后一个数值*n/2次。这种算法,表达是对应程序所执行的次数只有一次,而这种算法程序对应的曲线几乎趋向同意一个值,大O表示法师O(1)常数阶,而上一个算法程序的执行次数取决于函数所接受到的参数,参数值越大,函数执行的次数就越多。相比之下,明显第二种的算法性能更优。
那么,如何判断曲线呢。
三个步骤:
1、定义行数。2、找到快速增长项。3、取消系数。
下面是两个程序的筛选步骤,如下图:
其中n代表程序执行的次数。通过以上三个步骤就能找到对应的大O表示符。
下面的各个大O表示符的性对快慢的顺序。
值得一提的事,提出的案例中能做到有O(1)线性阶梯,但是现实生活中其实很难找到这种阶梯。
思考题:函数接受一个数组,数组里面都是数值类型,然后将数组里面的数值进行相加。
答案如下:
如上图所示,通过程序实现结果我们来进行线性时间复杂度分析。
要拿到数组值就必须遍历数组,所以最后通过程序执行的计算的,得到的数值是一个一次方程,然后将方程的快速增长项提出来,最后去掉系数,得到的事O(n)的线性时间复杂度。