Master公式(计算递归复杂度)

Master公式

在计算涉及递归的算法的时候,计算复杂度就会变得有些麻烦。Master公式就是用来进行剖析递归行为和递归行为时间复杂度的估算的

  • Master公式:T(N) = a*T(N/b) + O(N^d)

  • 公式解释:n表示问题的规模,a表示递归的次数也就是生成的子问题数,N/b表示子问题的规模。O(N^d)表示除了递归操作以外其余操作的复杂度

  • 结论(证明省略):
    ①当d ②当d=logb a时,时间复杂度为O((N^d)*logN)
    ③当d>logb a时,时间复杂度为O(N^d)

  • 注意:子问题规模必须等分,不管你是分成几部分

  • 补充阅读:想要了解更多请点击 点我点我

举个例子

下面代码,T(N) = 2 * T(N/2) + O(1)

  • 源代码:
package LeetCode;
/*** @Description:* @ProjectNmae: gitTest* @PackageName: LeetCode* @ClassName: test* @Author: Y-peak* @Date: 2021.08.27 15:27   星期五*/public class test {public static void main(String[] args) {int[] arr = new int[]{1,1,2,7,23,4,4};System.out.println(function(arr,1,3));}//求数组arr [L,N] 范围内的最大值public static int function(int[] arr, int L,int R){if(L == R)return arr[L];int mid = L + ((R-L)>>1);int leftMax = function(arr,L, mid);int rightMax = function(arr, mid + 1, R);  //两次递归,问题规模等分。return Math.max(leftMax,rightMax);}
}

与上面对比一下,下面的代码:T(N) = 2 * T(N/2) + O(N)

package LeetCode;/*** @Description:* @ProjectNmae: gitTest* @PackageName: LeetCode* @ClassName: test* @Author: Y-peak* @Date: 2021.08.27 15:27   星期五*/public class test {public static void main(String[] args) {int[] arr = new int[]{1,1,2,7,23,4,4};System.out.println(function(arr,1,3));}//求数组arr [L,N] 范围内的最大值public static int function(int[] arr, int L,int R){if(L == R)return arr[L];for (int i = L; i < R; i++)    //时间复杂度为 O(N)System.out.println("哎,我就是玩,我就是增加复杂度");int mid = L + ((R-L)>>1);int leftMax = function(arr,L, mid);int rightMax = function(arr, mid + 1, R);return Math.max(leftMax,rightMax);}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部