![v2-fb22544aec4e93b908a491d13938f341_1440w.jpg?source=172ae18b](http://img-01.proxy.5ce.com/view/image?&type=2&guid=69f1cf84-ff2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-fb22544aec4e93b908a491d13938f341_1440w.jpg?source=172ae18b)
耐心的理解下面的一段话:
时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度
在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度。这里进行归纳一下它们代表的含义:这是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。一个算法的优劣主要从算法的所需时间和所占用的空间两个方面衡量。一般空间利用率小的,所需时间相对较长。所以性能优化策略里面经常听到 空间换时间,时间换空间这样说法。
O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。
O(1) 最低的时空复杂度 耗时/耗空间和数据量没有关系 无论输入的数据量增大多少倍都不会变 典型的哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)
function
O(n) 说明数据量增大几倍 耗时就增大几倍 典型的遍历算法
function
O(n*n) 数据量增大n倍时 耗时也同时增大n的平方倍 典型的冒泡排序 快速排序
如果两层循环,该算法for循环,最外层循环每执行一次,内层循环都要执行n次,执行次数是根据n所决定的,最大时间复杂度是O(n^2),如果内层循环在某种场景一次就跳出,其实也可以退化成o(n), 通常我们计算时间复杂度都是计算最多情况.由此类推,如果是三层循环,最大时间复杂度就是 O(n^3).比如冒泡、选择等等
function
O(log(n)) 如二分算法 我们常玩的游戏猜大小数 给定数据范围是1~100 炸弹数是39 那么用中间数(50)做比较 大了 那就从1~50 在找中间数(25) 小了 那就从25~50中再找中间数以此类推 每次都能排除掉一半的数 二分算法前提是数据必须是有序的。
function