递归与递归方程T(N)=aT(N/b)+O(N^d)

前言

递归:将一件大事分解成若干小事,通过对小事结果的决策过程,就能获得大事的答案
递归改成迭代(循环)–>就是自己用代码实现压栈,模拟系统栈的行为

1. 用递归方法求数组arr[L…R]中的最大值

解析:
1)  将[L…R]范围分成左右两半。左:[L…Mid]右[Mid+1…R]
2)  左部分求最大值,右部分求最大值
3)  是个递归过程,当范围上只有一个数,就可以不用再递归了

在这里插入图片描述

	//递归 将一件大事分解成若干小事,通过对小事结果的决策过程,得出对大事的答案
	// 求arr中的最大值
	public static int getMax(int[] arr) {
    
    
		return process(arr, 0, arr.length - 1);
	}

	// arr[L..R]范围上求最大值  L ... R   N
	public static int process(int[] arr, int L, int R) {
    
    
		// arr[L..R]范围上只有一个数,直接返回,base case
		if (L == R) {
    
     
			return arr[L];
		}
		// L...R 不只一个数
		// mid = (L + R) / 2
		int mid = L + ((R - L) >> 1); // 中点   	1
		int leftMax = process(arr, L, mid);
		int rightMax = process(arr, mid + 1, R);
		return Math.max(leftMax, rightMax);
	}

2) 递归方程T(N)=aT(N/b)+O(N^d)

才能使用

方程规律
Master公式
形如
T(N) = a * T(N/b)+O(N^d)(其中的a、b、d都是常数)
递归函数每个子问题的规模都一样,可以直接通过Master公式来确定时间复杂度
如果log(b,a) < d,复杂度为O(N^d)
如果log(b,a) > d,复杂度为O(N^log(b,a))
如果log(b,a) = d,复杂度为O(N^d * logN)

方程说明
上述例题T(N)=2T(N/2)+O(N^0)   复杂度为O(N^log(2,2))=O(N)


2:调用了两次子问题
int leftMax = process(arr, L, mid);
int rightMax = process(arr, mid + 1, R);


N/2:每个子问题都是取一半
process(arr, L, mid);


O( N^0 ):子问题除外的代码复杂度为O(N^0),如有循环语句就是O(N)

猜你喜欢

转载自blog.csdn.net/ws13575291650/article/details/113699042