其他分享
首页 > 其他分享> > 时间复杂度

时间复杂度

作者:互联网

时间复杂度

先来一段有趣的对话

1
2
3
4
5

看到时间复杂度的重要性了吧

那什么是时间复杂度呢

7

一天过后,小灰和大黄各自交付了代码,两端代码实现的功能都差不多。大黄的代码运行一次要花100毫秒,内存占用5MB。小灰的代码运行一次要花100秒,内存占用500MB。于是......

8
9

由此可见,衡量代码的好坏,包括两个非常重要的指标:

10
11

我们先看一下标准的定义

定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。

当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。

我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。

此外,一个问题本身也有它的复杂性,如果某个算法的复杂性到达了这个问题复杂性的下界,那就称这样的算法是最佳算法。

如何计算时间复杂度

当i=m,j=k的时候,内层循环的次数为k

当i=m时,j可以取 \(0,1,…,m−1\)

所以这里最内循环共进行了\(0+1+…+m−1=\frac{(m−1)m}{2}\)次

所以,i从0取到n, 则循环共进行了:\(0+\frac{(1−1)×1}{2}+…+\frac{(n−1)n}{2}=\frac{n(n+1)(n−1)}{6}\)

所以时间复杂度为\(O(n^3)\)

语句②的频度是\((n−1)∗(2n+1)=2n^2−n−1\)

\(f(n)=2n^2−n−1+(n−1)=2n^2−2\)(f(n)上面提到了)

该程序的时间复杂度\(T(n)=O(n^2)\)

i=1;       ①
while (i<=n)
    i=i*2; ②

语句①的频度是1

到这里,又卡住了,语句②是什么鬼。。。(我也不知道)

那我们可以设语句②的频度是\(f(n)\), 则:\(2^{f(n)}≤n\);\(f(n)≤logn\)

取最大值\(f(n)=logn\),\(T(n)=O(logn)\)

一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数\(f(n)\),因此,算法的时间复杂度记做:\(T(n)=O(f(n))\)。随着模块n的增大,算法执行的时间的增长率和\(f(n)\)的增长率成正比,所以\(f(n)\)越小,算法的时间复杂度越低,算法的效率越高。

在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出\(T(n)\)的同数量级(它的同数量级有以下:\(logn, n, nlogn, n^2, n^3, 2^n,n!\)),找出后,\(f(n)=该数量级\),若\(\frac{T(n)}{f(n)}\)求极限可得到一常数c,则时间复杂度\(T(n)=O(f(n))\)。

标签:语句,复杂度,算法,时间,频度,logn
来源: https://www.cnblogs.com/orange-233/p/12037475.html