时间复杂度算法分析

时间复杂度

时间复杂度是描述算法运行的时间。我们把算法需要运算的次数用输入大小为 n 的函数来表示, 计作 T(n)。时间复杂度通常用O(n)来表示,公式为T(n)=O(f(n)),其中f(n)表示每行 代码的执行次数之和,注意是执行次数
在这里插入图片描述


O(1) 复杂度

算法执行所需要的时间不随着某个变量 n 的大小而变化,即此算法时间复杂度为一个常量,可表示
为 O(1)

在这里插入图片描述

O(1)表示常数级别的复杂度,不管你是O(几),统一给你计作 O(1)


O(n) 复杂度

在这里插入图片描述

上面这段代码,写了一个 for 循环,从 0 到 n ,不管 n 是多少,都要循环 n 次,而且只循环 n 次,所以得到复杂度为 O(n)


O(n2) 复杂度

在这里插入图片描述

上面的程序嵌套了两个循环,外层是 0 到 n ,内层基于每一个不同的 i ,也要从 0 到 n 执行, 得到复杂度为 O(n2)。可以看出,随着 n 增大,复杂度会成平方级别增加。


O(log(n)) 对数复杂度

在这里插入图片描述
讲到这里顺便来复习一下高中数学知识,函数 y = loga x 叫做对数函数, a 就是对数函数的底 数。

对数复杂度是比较常见的一种复杂度,也是比较难分析的一种复杂度。观察上面的代码, i 从 1 开 始,每循环一次就乘以 2,直到 i 大于 n 时结束循环。

21 −−>22 −−>23…−−>2x
观察上面列出 i 的取值发现,是一个等比数列,要知道循环了多少次,求出 x 的值即可。由
2x =n得到,x=log2n,所以这段代码的时间复杂度为log2n。 如果把上面的 i *= 2 改为 i *= 3 ,那么这段代码的时间复杂度就是 log3 n 。

在这里插入图片描述


递归的时间复杂度

递归算法中,每个递归函数的的时间复杂度为O(s),递归的调用次数为 n,则该递归算法的时 间复杂度为 O(n) = n ∗ O(s)

我们先来看一个经典的问题,斐波那契数列( Fibonacci sequence ):

F (0) = 1,F (2) = 1, F (n) = F (n − 1) + F (n − 2)(n ≥ 2, n ∈ N ∗ )

在这里插入图片描述

我们很容易写出上面这样一段递归的代码,往往会忽略了时间复杂度是多少,换句话说调用多少 次。可以代一个数进去,例如 n = 5,完了之后大概就能理解递归的时间复杂度是怎么来的。

在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章