如何理解算法的【时间复杂度】大白话
纯粹个人理解,比较简单粗暴,简单讲,所谓的时间复杂度,就是你的代码执行了多少次,执行的次数越多导致的耗时就越久。(以现在科技水平,暂时不考虑空间复杂度)
时间复杂度都包括哪些
O(1),O(log(n)),O(n),O(nlog(n)),O(n^2), 以及O(2^n),O(n!)等等 排个序: Ο(1) < Ο(logn) < Ο(n) < Ο(nlogn) < Ο(n^2) < O(2^n)<Ο(n!)
O(1) 的大白话理解
简单粗暴的讲就是: 你的每一行代码只执行了一次,注意是每一行代码。 举例:
log.info("test1");
这个就是O(1); 然后:
log.info("test1"); log.info("test2"); log.info("test3");
这个是O(3),执行了三次,但是对于时间复杂度来说,还是O(1); 懂了波?
O(log(n)) 理解
这个我之前一直不知道复杂度怎么和对数联系起来的。后来二分法,以及汉明距离计算,让我知道,原来是这样。二分法,顾名思义,排好序的一堆数据,每次从中间取数据与目标数据比较,分而治之,小了就从更小范围找,大了就从更大范围找,那么最坏的情况,就是遍历到最后,已经不可分割了,这个过程相当于数组大小一直除2,这个其实就相当于一直不带符号,不循环的右移,所以查找次数就是可右移的次数,也就是数据个数的二进制的位数,也就是以2为底的log(n)。汉明距离转化为异或操作之后计算1的个数,也是和数据的位数有关,以2为底的log(n)。
简单粗暴的讲:假设有一堆数据,你需要逐个循环10次处理的时候,但是经过某个算法,你可能只需要循环2到9次,那么这种就是O(log(n)),二分查找就是最好的例子 懂了波?
O(n) 的理解
O(n)与数据规模呈正相关。比如死循环查找数据,最坏的情况是查到最后一个才查到,那就查了n次。
简单粗暴的讲:就是你有10个数据就需要循环处理10次,就这么简单。 懂了波?
O(nlog(n)) 的理解
O(nlog(n))堆排序里,每次堆化取最值,复杂度都为O(logn),一共需要n次操作,可以证得,堆排复杂度为O(nlog(n))。
简单粗暴的讲,就是 O(log(n)) 的外层又套了一层循环,就是你的二分查找在某个循环里处理的,就这么回事! 懂了波?
O(n^2) 的理解
O(n^2)这里是n的平方,比如选择排序和冒泡排序,最坏的情况需要n-1+n-2+…1=n2(n的平方次)。又比如死循环计算两个给定数组的各其中一个元素加起来的最大和值,两层死循环,每个数组大小为n,n*n,n的平方。
其实这里还有O(n^3、4、5、6…)就是n的3次方4次方5次方等等。
简单粗暴的讲,就是你有多少层循环嵌套,而且每层循环嵌套的代码都要执行,说实话一般代码中不要出现这种情况,忒恶心了,当然也能理解无奈的时候。 懂了波?
O(2^n) 的理解
O(2^n)这里可以拿斐波那契数列的计算举例子,斐波那契数列f(n)=f(n-1)+f(n-2),递归运算时,每次需要调用的函数都会呈指数级增长。
简单粗暴的讲,就是递归,因为实际开发中用到最多这种时间复杂度的就是递归。特别注意,递归很容易死循环,我曾经因此而扣了工资,难受!!! 懂了波?
O(n!) 的理解
O(n!)这个复杂度已经是很恐怖的了,看下面的图就知道了。比如写出1~n的所有全排列。
能写出这种时间复杂度代码的已经不适合程序猿了。。。。。