算法时间复杂度和空间复杂度

为了在函数之间建立一种相对的级别,我们通过比较其相对增长率有以下两个定义:

如果存在正常数c和n0使得当N>=n0时T(N)<=cf(N),则记为T(N)=O(f(N))   即f(N)增长率大于等于T(N),f(N)是其上界

如果存在正常数c和n0使得当N>=n0时T(N)>=cf(N),则记为T(N)=Ω(f(N))   即f(N)增长率小于等于T(N),f(N)是其下界

(1) 复杂度 

为了描述一个算法的优劣,我们引入算法时间复杂度和空间复杂度的概念。 时间复杂度:一个算法主要运算的次数,用大 O 表示。通常表示时间复杂度时,我们只保留数量级最大的 项,并忽略该项的系数。 例如某算法,赋值做了 3n3+n2+8 次,则认为它的时间复杂度为 O(n3);另一算法的主要运算是比较,做 了 4×2n+2n4+700 次,则认为它的时间复杂度为 O(2n)。 当然,如果有多个字母对算法的运行时间产生很大影响,就把它们都写进表达式。如对 m×n 的数组遍历 的时间复杂度可以写作 O(mn)。 
 
空间复杂度:一个算法主要占用的内存空间,也用大 O 表示。 在实际应用时,空间的占用是需要特别注意的问题。太大的数组经常是开不出来的,即使开出来了,遍历 的时间消耗也是惊人的。 

(2) 常用算法的时空复杂度 

1s 运算次数约为 5,000,000。也就是说,如果把 n 代入复杂度的表达式,得数接近或大于 5,000,000, 那么会有超时的危险。 常见的数量级大小:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!) 

数量级    能承受的大致规模            常见算法 

O(1)        任意                               直接输出结果 

O(logn)   任意                               二分查找、快速幂 

O(n)        以百万计(五六百万)    贪心算法、扫描和遍历 

O(nlogn) 以十万计(三四十万)    带有分治思想的算法,如二分法 

O(n2)      以千计数(两千)           枚举、动态规划 

O(n3)      不到两百                         动态规划 

O(2n)      24                                  搜索 

O(n!)       10                                  产生全排列 

O(nn)      8                                    暴力法破解密码

 O(1)叫常数时间;O(n)、O(n^2)、O(n^3)、O(n^4)……叫做多项式时间;O(2^n)、O(3^n)……叫做指数时间。

 

猜你喜欢

转载自blog.csdn.net/slience_646898/article/details/80957032
今日推荐