6.迭代与master公式

利用master公式求时间复杂度

求递归行为的时间复杂度
master公式的式子: T(N) = a*T(N/b)+O(n^d)
N: 样本量
N/b: 子过程样本量
a: 子过程执行次数
O(n^d): 除了子过程之外的执行过程:比如比较

  • 第一步先看递归行为是不是满足master公式: T(N) = a*T(N/b)+O(n^d) 的形式,并求出式子中各个常数
    在下面例子中:
    子样本量是数组的一半: N/2
    子过程执行次数就是: 2 ( 2* N/2 = N 次数指的是一次过程中的函数压栈次数)
    除了子过程之外的执行过程: 就是O(1) (只有比较罢了)
    此例子上面满足公式

  • 第二部通过条件得到时间复杂度的式子
    满足上述公式的有统一的式子来求时间复杂度:

  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)
  • 第三步将常数代入
    将结果代入
    log(b, a) = log(2, 2) = 1
    d = 0
    log(b, a) > d
    此例子的时间复杂度就是:O(N^log(b,a)) = O(N)
package yzy.algorithm;
/* 测试递归
 * 将一个最简单的问题改成递归求法:"
 * 求数组中最大值
 * 思路是:将数组一分为二,分别找出左边和右边最大的元素,然后返回左右两边最大的元素
 */
public class testRecursion {
	public static int getMax(int[] arr, int L, int R) {
		if(L == R)
			return arr[L];
//		int mid = (L+R)/2;
		//可能存在int越界的风险,可写成:
		int mid = (R-L)/2 + L;
		int maxLeft = getMax(arr, L, mid);
		int maxRight = getMax(arr, mid+1, R);
		return Math.max(maxLeft, maxRight);
	}
	
	public static void main(String[] args) {
		/* 测试int会不会越界
		int n = Integer.MAX_VALUE;  
		//Integer.MAX_VALUE是整数所能表示的最大数 int范围[-2147483648, 2147483647]
		System.out.println(n);
		System.out.println(n+1);
		 * 结论: 会越界
		 */
		int[] arr = {4, 3, 2, 1};
		System.out.println(getMax(arr, 0, arr.length-1));
	}
}

发布了188 篇原创文章 · 获赞 65 · 访问量 8388

猜你喜欢

转载自blog.csdn.net/qq_43808700/article/details/104252982
今日推荐