以前一直对算法的时间复杂度理解的不够透彻,因为在看到一些算法的时间复杂度与自己想的不一样时,常常一头雾水,今日在阅读《大话数据结构》相关内容后,忽然有种豁然开朗的感觉,特此记录一下~
函数渐进增长
当存在一个值 N,当 n > N 时,f(n) > g(n) 永远成立,那么函数f(n)就是渐进增长的。而且随着n的增大。
定义
算法时间复杂度,即算法的时间度量,计作:T(n)=O(f(n)),表示随着n的增大,算法执行时间的增长率和f(n) 的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度,其中f(n)是n的运行次数函数。
Tips:一般在没有特殊说明的情况下,时间复杂度都是指最坏时间复杂度。
例如,计算 1~n 的总和:
sum=(1+n)*n/2 无论n多大,该函数的执行次数均为1
推导
如何准确的推导出一个算法的时间复杂度,这个也是之前自己比较容易混淆的地方,总体而言,主要有三个:
1、用常数1代替所有加法常数;
2、只保留最高阶项;
3、除以与最高阶项相乘的常数。
常见的时间复杂度
O(1) 常数阶
算法执行次数与n的大小无关,执行时间恒定,如计算1~n的总和;
O(n) 线性阶
算法执行次数与n称线性关系,如单层 for 循环;
O(n2) 平方阶
如 双层 for 循环;
时间复杂度所消耗时间大小排序:
O(1)<O(logn)<O(n)<O(nlogn)<O($n^2$)<O($n^3$)<O($2^n$)<O(n!)<O($n^n$)
空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式计作:S(n)=O(f(n)),其中n为问题的规模,f(n)为语句关于n所占存储空间的函数。