大话数据结构之算法 时间复杂度

时间:2020-12-23 17:17:40

佛说:欠下的债,早晚会还的。哎,大学没好好学数据结构,现在恶补吧。还债啦!!!

 

时间复杂度用O()来体现,我们称之为大O记法。记做:T(n)=O(f(n))

一般情况下随着n的增大,Tn)增长最慢的算法为最优算法。

O1)叫常数阶 On)叫线性阶 On2)叫平方阶

 

推倒大O

1.       用常数1取代运行时间中的所有加法常数

2.       在修改后的运行次数函数中,只保留最高阶项。

3.       如果最高阶项存在且不是1,则去除与这个项相乘的常数。

得到的结果就是大O阶。

 

对于高斯算法而言,这个算法的运行次数函数是f(n)=3,根据我们推导大O阶的方法,第一步就是把常数项3改为1。在保留最高阶项时发现,它根本没有最高阶项,所以这个算法的时间复杂度为O(1)

 

对于分支结构而言,无论是真,还是假,执行的次数都是恒定的,不会随着n的变大而发生变化,所以单纯的分支结构(不包含在循环结构中),其时间复杂度也是O1)。

 

线性阶:

Int I;

For(i=0;i<n;i++)

{

 

}

因为循环体中的代码要执行N次,所以它的循环的时间复杂度为O(n)

 

对数阶:

Int count=1;

While (count<n)

{

   Count=count*2;

}

由于每次count乘以2以后,就距离n更近了一分。也就是,有多少个2相乘以后大于n,则会退出循环。由 2x=n 得到x=log2n。所以这个循环的时间复杂度为O(logn)

 

 

最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。在应用中,这是一种最重要的需求,通常,除非特别指定,我们提到的运行时间都是最坏情况的运行时间。

 

 

算法空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记做:S(n)=O(f(n)),其中n为问题的规模,f(n)为语句关于n所占存储空间的函数。

常见的时间复杂度所耗时间的大小排列

O(1)<O(logn)<O(n)<O(nlogn)<O(n2)