1.时间复杂度的 粗略计算方法:
1。用常数1取代运行时间中的所有加法常数
2.在修改后的运行次数函数中,只保留最高阶项
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。
常数阶
例如执行1次O(1),执行12次O(12) 这样说是不对的,无论常数是多少都记为O(1)
线性阶
下面既是O(n)
int i;
for(i=0;i<n;i++)
{
/*时间复杂度*/
}
对数阶
int count=1;
while(count<2)
{
count=count*2;
}
由于每次count乘以2之后就距离n更近了,也就是说有多次2相乘后大于n,循环则结束。由2^x=n 得到x等于 以2为底n的对数 O(logn)
平方阶
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
}
}
时间复杂度O(n^2)
如果外循环的n等于m 则时间复杂度O(m*n)
int i,j;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
}
}
当i=0时,内循环执行了n次,当i=1时,执行了n-1次,当i=n-1时 执行了1次 所以总的执行次数为:
n+(n-1)+(n-2)+......+1=n^2/2 + n/2 根据O的粗略求法 得到O(n^2)
int i,j;
for(i=0;i<n;i++) 执行N次
{
function(i);
}
void function(int count) 执行N次
{
int j;
for(j=count;j<n;j++)
{
}
}
所以时间复杂度O(n^2)
较复杂语句
n++; 执行1次
funcion(n); 执行N次
int i,j;
for(i=0;i<n;i++) 执行次数n^2
{
function(i);
}
for(i=0;i<n;i++) 执行n(n+1)/2
{
for(j=i;j<n;j++)
{
}
}
f(n)=1+n+n^2+n(n+1)/2=3/2n^2 + 3/2n + 1 所以时间复杂度O(n^2)
我们查找一个有n个数字的数组种的某个数字,那么最好这个数字在第一个,那么时间复杂度就是O(1),如果在最后 那就是O(n)。 这就是最坏运行时间
从概率角度讲,我们取平均运行时间
空间复杂度
S(n)=O(f(n))
本文出自 “linux_oracle” 博客,请务必保留此出处http://pankuo.blog.51cto.com/8651697/1631332
原文地址:http://pankuo.blog.51cto.com/8651697/1631332