时间空间复杂度详解
算法复杂度
算法复杂度分为时间复杂度和空间复杂度。
- 时间复杂度是值执行算法所需要的计算工作量;
- 而空间复杂度是指执行这个算法所需要的内存空间。
时间复杂度
由于运行环境和输入规模的影响,代码的绝对运行时间是无法估计的,但我们可以预估出代码的基本操作执行次数。
一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。
一个算法中的语句执行次数称为语句频度或时间频度,这个基本操作执行次数的函数记为T(n)。
渐进时间复杂度(asymptotic time complexity)的概念:
若存在函数 f(n),使得当n趋近于无穷大时,T(n)/ f(n)的极限值为不等于零的常数,则称 f(n)是T(n)的同数量级函数。
记作 T(n)= O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
渐进时间复杂度用大写O来表示,所以也被称为大O表示法。
对于条件判断语句,总的时间复杂度等于其中 时间复杂度最大的路径 的时间复杂度。
时间复杂度分析的基本策略是:从内向外分析,从最深层开始分析。如果遇到函数调用,要深入函数进行分析。
-
如果运行时间是常数量级,用常数1表示;
-
只保留时间函数中的最高阶项;
-
如果最高阶项存在,则省去最高阶项前面的系数。
常见的算法时间复杂度排序:
空间复杂度
S(n)=O(f(n)),一个算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括这三个方面:
- 存储算法本身所占用的存储空间
- 算法的输入输出数据所占用的存储空间
- 算法在运行过程中临时占用的存储空间
要减少算法本身占用的存储空间,我们就要尽可能的写简短的代码。
算法的输入输出数据占用的空间由要解决的问题影响,所以算法的不同不怎么影响这部分的空间占用。
对算法的空间复杂度影响最大的是算法运行过程中临时占用的存储空间。不同的算法写出来,运行时申请的临时空间会有较大的不同。
时间复杂度为主,空间复杂度为辅!