时间复杂度
时间复杂度的定义:算数的复杂度是一个函数,它定量描述了算法的运行时间
一个算法执行所花费的时间,从理论上是不能够算出来的,只有你在机器上跑出来,才可以知道。
但是每次都要上机测试十分麻烦,这样我们就衍生出了时间复杂度的这个概念,一个算法执行所花费的时间与其语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度
总而言之,可以这么理解,就是如果找到了某条基本语句和问题规模N之间的数学表达式,就是找到了该算法的时间复杂度
我们经常会用O(N)来表示时间复杂度,但我们通常都是取影响最大的项
大O表示法:估算
O(N^2)和O(N)——>取O(N*2)
注意:O(1)表示常数次,并不代表1次
推导大O的阶方法:
1、用常数1取代运行时间中的所有加法常数
2、在修改后的运行次数函数中,只保留最高阶项(取决定性的那项)
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数,得到的结果就是大O阶
此外,在 最好 平均 最坏 之中,我们常常取最坏结果,这就是时间复杂度的保守估算
时间复杂度计算不能数代码中循环运行的次数,要学会灵活计算
空间复杂度
空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时额外占用存储空间大小的量度
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大的意义,所以空间复杂度算得上是变量的个数
空间复杂度计算规则基本跟时间复杂度类似,也是使用大O渐进表示法
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显示申请的额外空间来确定
注意:一般空间复杂度都是O(1)或者是O(N)
所谓的时间的优化,很多时候都是使用了空间来换取时间的算法,所以说数据结构和算法这个环节我们需要具备良好的思维构思,对数学有一定的要求(理科思维)