时间复杂度o(n^0.5)_复杂度的度量方法

平方以及立方级别的复杂度几乎已经是平贴着y轴的一条直线了,而O(n*log(n))与O(n)还保持着一定的速率进行增长,log(n)又是另一个极端,它变成了一个几乎贴着x轴的直线

1.度量时间复杂度

a)O(1) / O(C) C代表常数

1.2.#include3.int main(){4.     printf("Hello World");  //执行一次5.     return 0;       //执行一次6.}

对于如上代码,我们一共执行了n1+2次,即O(n1+2),由上文我们的公式得到其复杂度为O(n),或称之为线性阶时间复杂度。

c)O(n^2)

1.2.#include3.int main(){4.     int n=10000,ans=0;  //执行一次5.     for(int i=0;i

对于如上代码,我们一共执行了nn1+2次,即O(nn1+2),由上文我们的公式得到其复杂度为O(n^2),或称之为平方阶时间复杂度,此外还有三层循环结构嵌套组成的O(n^3)级别的时间复杂度,称之为立方阶时间复杂度,随着嵌套的增多,甚至还有O(n!)级,称之为阶层级时间复杂度,但是这种级别复杂度极高,程序运行极其缓慢。

d)O(logn)

1.2.#include3.int main(){4.     int i=1,n=10000;   //执行一次5.     while(i<=n){    //执行logn次6.            i*=2;7.     }8.     return 0;       //执行一次9.}

对于如下代码,与上文的线性增长不同,其i的增长是倍增的形式,也就是说i会随着运行次数的增加变大的趋势变更大,这样会比那些简单的用加法上涨的变量更快到达循环结构的边界,这样的代码时间复杂度一般为log级别,对于本样例,有O(logn+2)=O(logn),称之为对数阶时间复杂度

e)O(n*logn)

1.2.#include3.int main(){4.     int n=10000,ans=0;  //执行一次5.     for(int i=0;i

对于上文的对数级别的时间复杂度,一样可以实用别的循环进行嵌套,比如本样例O(n(logn+1)+2)=O(nlogn)级别

除此之外还有很多种时间复杂度的组合,比如说O(2^n)这样的指数阶时间复杂度,有时甚至需要引入多个变量乃进行表示,不过最核心的还是要观察循环结构的处理。

2.各个复杂度的比较

如图,我们以x轴为n的规模,y轴为整体的计算次数,可以发现其明显的计算区别,立方级别似乎很小的数就变得需要很多得计算了,而相对得logn级别得复杂度似乎无论怎么增加n,其涨幅都不是很明显。

643984ae92fb0efba0077ca6e5a01836.png

然而事实上,计算机的计算次数何止60次啊,计算机真实的计算速度是论千论万论亿级别的计算,所以我们的n会变得非常之大,让我们把坐标进行变化,以10000为界进行理解。

865f0282dabef6344368db59890d8e49.png

可以见到,平方以及立方级别的复杂度几乎已经是平贴着y轴的一条直线了,而O(n*log(n))与O(n)还保持着一定的速率进行增长,log(n)又是另一个极端,它变成了一个几乎贴着x轴的直线,这样算法的效率就轻易看得出了。

综上可以直观的得出:

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)

在设计程序的时候一定要注意,高计算需求的地方一定不要使用太高的时间复杂度的计算方式!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值