时间复杂度
1.logn
void fun(int n)
{
int i=1;
while(i<=n)
i=i*2;
}
i循环多少次到达n?
i每次循环 乘2,以2的次数增长
转换为:求2的几次方 = n
循环次数即: = ?
最后简写成
所以复杂度就为logn
2.递推公式复杂度n
设某算法的递推公式是T(n)=T(n-1)+n,T(0)=1,则求该算法中第n项的时间复杂度为()
T(n)
=T(n-1)+n
=T(n-2)+(n-1)+n
=T(n-3)+(n-2)+(n-1)+n
...
=T(0)+1+2+...+(n-2)+(n-1)+n
=1+1+2+...+(n-2)+(n-1)+n
从递推公式中可以看到,第n项的值需要从n-1开始递归,一直递归到0次结束,共递归了n-1次
所以时间复杂度为n
3.递归复杂度n
int f ( unsigned int n )
{
if (n == 0 || n==1)
return 1;
else
return n * f(n-1);
}
每次递归的参数为,上一次,减1 ,当递归参数为1的时候返回,所以递归了n - 1次
4.寻找复杂度n
给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度是多少
求最快的时间复杂度,由于是有序数组,从头每确定两个元素,比较与sum的大小,然后再移动元素,整个数组被搜索一遍,就可以得到结果,所以最好时间复杂度为n。
空间复杂度
5.定义二维数组复杂度1
如果一个函数的内部中只定义了一个二维数组a[3][6],请问这个函数的空间复杂度为多少
函数内部数组的大小是固定的,不论函数运行多少次,所需空间都是固定大小的,因此空间复杂度为O(1)
6.malloc二维数组复杂度![n^{^{2}}](https://latex.csdn.net/eq?n%5E%7B%5E%7B2%7D%7D)
int** fun(int n)
{
int ** s = (int **)malloc(n * sizeof(int *));
while(n--)
s[n] = (int *)malloc(n * sizeof(int));
return s;
}
此处开辟的是一个二维数组,数组有n行,每行分别有1,2,3,...n列,所以是n(n + 1)/2个元素空间,空间复杂度为n^2