佛说:欠下的债,早晚会还的。哎,大学没好好学数据结构,现在恶补吧。还债啦!!!
时间复杂度用O()来体现,我们称之为大O记法。记做:T(n)=O(f(n))
一般情况下随着n的增大,T(n)增长最慢的算法为最优算法。
O(1)叫常数阶 O(n)叫线性阶 O(n2)叫平方阶
推倒大O阶
1. 用常数1取代运行时间中的所有加法常数
2. 在修改后的运行次数函数中,只保留最高阶项。
3. 如果最高阶项存在且不是1,则去除与这个项相乘的常数。
得到的结果就是大O阶。
对于高斯算法而言,这个算法的运行次数函数是f(n)=3,根据我们推导大O阶的方法,第一步就是把常数项3改为1。在保留最高阶项时发现,它根本没有最高阶项,所以这个算法的时间复杂度为O(1)。
对于分支结构而言,无论是真,还是假,执行的次数都是恒定的,不会随着n的变大而发生变化,所以单纯的分支结构(不包含在循环结构中),其时间复杂度也是O(1)。
线性阶:
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)