一:大O的渐进表示法;
1:在修改后的运行次数函数中,只保留最高项;
时间复杂度算的是次数;
2:在实际中一般情况下关注的是算法的最坏的情况;
3:在计算冒泡排序的时间复杂度时:
有N个数,第一个数要比较N-1次,第二个数要比较N-2次....
所以数学表达式为:F(N) = N-1+N-2+N-3+.....+1;
所以时间复杂度为O(N^2);
这道题通过数学方法,列出每一项要比较的次数,然后用公式算出总的次数;
4:在二分查找的时间复杂度时
先看他最差的情况就是一直找,找到最后才找到;
所以其算法思想是:有N个数, 查找一次,便除了一次二,设查找了X次;我们计算的就是x的值;再次我们可以不管数字的奇偶对次数的影响(时间复杂度算的是次数的一个量级)
所以 x / 2/ 2 / 2 /2 / 2 / 2 /2 ...... = 1;
所以量级为O(logn);
5:计算阶乘Fac的时间复杂度
对于求阶乘的时间复杂度来说:我们可以 通过求函数调用的总次数拉来计算;
由图可见总共调用了N-1次,时间复杂度为O(N);
6;计算斐波那契额数列Fib的时间复杂度
思路和上题类似:
通过计算每一层调用的次数,对于2^(N-2)的计算思路为如图,只看他调用的最长路劲,
其他短的可以舍弃不算;通过计算(N-A)与指数的关系为 指数 + A =N;
即 2^0+2^1+.....+2^(N-2) ;然后算式子的总个数为N-1;最后运用数学公式算出总的次数;
时间复杂度为O(2^N);
二:空间复杂度
1:空间复杂度也是一个数学表达式,是对一个算法在运行过程中额外临时占用储存空间大小的量度;
在此过程中我们需要运用malloc一个N+1个int大小的空间;所以空间复杂度为O(N);
计算阶乘Fac的空间复杂度
每一次函数调用,他都会额外创建一个函数栈帧,每一次调用的空间还会被相同层次的函数所调用,它创建的空间并不是累积的;
例如:在第一列函数调用的空间中,其他列函数的调用都可以在第一列空间中找到相同的空间;
所以只需要计算第一列调用函数的总次数就行了;
时间复杂度为O(N)
由此可见空间复杂度是不可累计的,只需算出调用一遍的次数,时间复杂度是可以累计的,要算出调用的总次数;