递归的一种理解(master公式)


前言

记录本菜鸡今天学的算法

一、剖析递归行为和递归行为时间复杂度的估算

将以最简单的数组求最大值的递归,来看递归调用栈,和递归的时间复杂度怎么看(master公式)

用递归方法找一个数组中的最大值,系统上到底是这么做的?

思路

分治法,将数组的最大值的求解,分成左右两部分,求出左边和右边最大值,然后比较两个最大值,返回两个当中最大值。

代码

package study;

public class stacck {
    
    
         public static int getmax(int[] arr) {
    
    
        	return proccess(arr, 0, arr.length-1);
         }
         public static int proccess(int[]arr,int l,int r) {
    
    
        	 if(l==r) return arr[l];
        	 int lm,rm,mid;
        	 mid = l=l+(r-l)>>1;
        	 lm=proccess(arr,l,mid );
        	 rm=proccess(arr,mid,r);
        	 return Math.max(lm, rm);
        	 
         }
}

为什么想减位移求平均值

代码如下:

 mid = l=l+(r-l)>>1;
因为害怕直接想加除以二,会发生溢出(L+R)/2。

所以用想减(L+(R-L)>>1)求平均值,向右位移一位只不过是位移运算速度更快。

master公式的使用

master公式是什么

matser公式是一种求特殊递归的时间复杂度的公式
其特殊性为问题规模被等分。必需是等分。

形式

T(N) = a*T(N/b) + O(N^d)

那么怎么看呢?其中T(N)为问题的数据量是N级别的,规模为N
等号右边是什么:是递归内容
a指的是子问题(子函数)调用次数
T(N/b)指的是子问题将母问题平分为b个部分
O(N^d)指的是出去递归调用的东西后,其他部分的时间复杂度

怎么看时间复杂度

  1. log(b,a) > d -> 复杂度为O(N^log(b,a))
  2. log(b,a) = d -> 复杂度为O(N^d * logN)
  3. log(b,a) < d -> 复杂度为O(N^d)

用上述递归公式套用数组最大值

首先:调用了两次子函数

 lm=proccess(arr,l,mid );
    rm=proccess(arr,mid,r);

a=2;
其次:
将数组分成了等的两部分,左边最大值,右边最大值
问题规模被平分
所以:b=2;
再因为:log(b,a)=1>d=0
为什么d为零 O(1)=O(N^0);
所以时间复杂度:O(N^log(b,a))=O(N)


总结

数组的最大值确实没必要用递归,只不过这里是为了说明MASTER公式求平均值

猜你喜欢

转载自blog.csdn.net/weixin_51422230/article/details/121237916