递归的时间复杂度
子问题规模相同——master公式
当子问题的问题规模相同时,我们就可以使用master
公式来估算该递归问题的时间复杂度。
以我们的二分法求最大值(图文详解递归:二分法求数组中的最大值)为例,函数代码具体如下,该函数的两个子问题规模相同。
int process(int* a,int L,int R){
if(L == R)
return *(a+L);
int mid = L+((R-L)/2);//计算中点
int Leftmax = process(a,L,mid);
int Rightmax = process(a,mid+1,R);
return (Leftmax>Rightmax)?Leftmax:Rightmax;
}
-
master
的等式左侧:即母函数,N为该函数的总数据量。 -
master
的等式右侧第一项:我们将用于求解的Leftmax = process(a,L,mid);
和rightmax = process(a,mid+1,R);
分别视作一个子问题,也就是说在该函数中由两个子递归,所以a=2。而我们两个子递归将数据量分为两部分,故b=2。 -
master
等式右侧第二项:除了调用以外的行为的时间复杂度,在该函数中除调用以外的行为为一个if判断、计算mid和return返回值,这三个行为的时间复杂度都是常数级的,它与我们的数据量N无关,所以d=0。
那么我们上述给出的程序的时间复杂度使用master
公式求解,则结果如下:
将a,b,d的值代入,因为log2 =1 > 0
根据以上公式我们可以计算得出
也就是说我们上述给出的算法时间复杂度为
将a=2 b=2带入得O(n)。