时间复杂度与空间复杂度
时间复杂度分析法
核心思想
忽略掉公式中的常量、低阶、系数,只需要记录一个最大阶的量级就可以了。
|
|
2、3行是常量,可以直接排除,我们只看其中的for循环就可以了。上面代码的时间复杂度是:O(n)。
嵌套循环的分析法
|
|
上面的代码,在cal()
方法里面循环调用了f()
,如果把前者循环里面的部分当作常量,那么前者的时间复杂度是O(n),而后者的时间复杂度是O(n),那么总共就是O(n x n),也就是O(n²)。
常见的时间复杂度(数量级递增)
多项式量级
O(1)
-常量阶O(n)
-线性阶O(logⁿ)
-对数阶O(nlogⁿ)
-线性对数阶O(n²)
-平方阶、立方阶…k次方阶
非多项式量级
O(2ⁿ)
-指数阶O(n!)
-阶乘阶
当数据规模n越来越大时,非多项式量级的执行时间会急剧增加。
对数阶
|
|
变量i的值从1开始,每次循环都会x2,实际上就形成了一个等比数列:
|
|
这种形式就是对数阶,因为以2
为底,计作O(log₂n)
。又由于底可以忽略,所以记为O(logn)
。
多数量级
|
|
这段代码即有m又有n,表示两个不同的数据量级,我们无法评估谁的数量级更大,所以两个都要考虑在内,记作O(m + n)
。
空间复杂度
核心思想
排除常量、系数和运算,只记录最大空间占用。
|
|
第二行代码申请了一个空间用来储存变量i,但由于是常量阶,可以忽略。
第三行代码申请了n个空间。
后续代码没有再继续申请空间。
所以空间复杂度就是O(n)
。
常见空间复杂度
O(1)
-常量阶O(n)
-线性阶O(n²)
-平方阶