时间复杂度和空间复杂度
一、时间复杂度O(f(n))
全称算法的渐进时间复杂度,其中f(n)表示每行代码执行的次数之和,O表示正比例关系
常见的时间复杂度有:
1、常数阶O(1)
2、对数阶O(logN)
3、线性阶O(n)
4、线性对数阶O(nlogN)
5、平方阶O(n²)
6、立方阶O(n³)
7、K次方阶O(n^k)
8、指数阶(2^n)
从上到下时间复杂度越来越大,执行效率越来越低
1、常数阶O(1)
int i=0;
int j;
j++4;
i++
i+=2;
i*=d;
无论这类代码有几万几十万行,时间复杂度仍然为O(1)
2、 对数阶O(logN)
int i = 1;
while(i<n)
{
i = i * 2;
}
设执行的x次, 达到i<n时会停止循环,有2^x=n,故x=log2(n),其时间复杂度为 O(logN)
3、线性阶O(n)
int ans = 0;;
for(i=1; i<=n; ++i)
{
ans+=i;
}
for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,时间复杂度为O(n)
4、线性对数阶O(nlogN)
线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)
for(j=1; j<n; j++)
{
i = 1;
while(i<n)
{
i = i * 2;
}
}
5、平方阶O(n²)
如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了
for(x=1; i<=n; x++)
{
for(i=1; i<=n; i++)
{
j = i;
j++;
}
}
6、立方阶O(n³)
参考上面的那就是三层循环
7、K次方阶O(n^k)
同理,那就是四层循环了
二、空间复杂度
时间复杂度不是用来计算程序具体耗时的,空间复杂度也不是用来计算程序实际占用的空间的。空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。常用的有O(1),O(n),O(n^2)
int i=0;
int j;
j++4;
i++
i+=2;
i*=d;
i,j所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)
int[] m = new int[n]
for(i=1; i<=n; ++i)
{
j = i;
j++;
}
O(n)
以上就是时间复杂度空间复杂度的简单介绍,欢迎留言