时间复杂度
计算机中,算法的时间复杂度是一个函数,它定性的描述了程序的运行时间,常用大O的渐进表示法。
在实际中,我们通常情况考虑的是算法的最坏情况。
递归算法的时间复杂度的计算:递归总次数*每次递归中执行的基本操作次数。
空间复杂度
空间复杂度是对一个算法在它运行过程中临时占用的储存空间的大小的度量,所以它所主要考虑的是辅助空间的大小,而不是所有空间的大小,要注意的是递归算法的空间的复杂度是递归深度*每次递归的辅助空间的大小,如果每次递归的辅助空间内的大小是常数,则空间复杂度位O(N).
二分查找:
int find_binary(const int *ptr, const int x, const len)
{
int let = 0;
int right = len-1;
int mid = (left + right)/2;
while(left<=right)
{
if(x<ptr[mid])
{
right = mid -1;
}
else if(x>ptr[mid])
{
left = mid +1;
}
else
{
return mid;
}
}
return -1;
}
通常最坏的的情况打算,用二分法找的时候,第一次在n/2的范围内找,第二次在n/4的范围内找,所以第x次就是n/2x,所以这个函数函数的时间复杂度就是O(log2n),所用的空间复杂度是O(1):
递归实现的斐波那契数:
long long fib(long long n)
{
assert(n>0);
return (n<2) ? (n) : (fib(n-1) + fib(n-2));
}
有递归实现的斐波那契数列可得:
虽然它不是一个满二叉树,但计算时间复杂度是按照最坏的情况来算的。
递归函数的时间复杂度 = 递归总次数每次递归中执行基本操作的次数。
这个二叉树的节点个数为2n-1,深度为n。
所以它的时间复杂度为O(2n)
递归的空间复杂度是:递归的深度每次递归的辅助空间的个数
所以空间复杂度为:O(N)。