主定理 Master Theorem

分治法主定理

在这里插入图片描述

主定理的证明

假设有递归式:
T ( n ) = a T ( n b ) + f ( n ) T(n) = aT(\frac{n}{b}) + f(n) T(n)=aT(bn)+f(n)
证明:
T ( n ) = a T ( n / b ) + f ( n ) T(n) = aT(n/b) + f(n) T(n)=aT(n/b)+f(n) = a [ a T ( n / b 2 ) + f ( n / b ) ] + f ( n ) = a\big[aT(n/b^2)+f(n/b)\big] + f(n) =a[aT(n/b2)+f(n/b)]+f(n) = a 2 T ( n / b 2 ) + f ( n ) + a f ( n / b )     = a^2T(n/b^2) + f(n) + af(n/b) ~\, =a2T(n/b2)+f(n)+af(n/b)  = a k T ( n / b k ) + ∑ j = 0 k − 1 a j f ( n / b j )      = a^{k}T(n/b^k) + \sum_{j=0}^{k-1} a^j f(n/b^j) ~~~~ =akT(n/bk)+j=0k1ajf(n/bj)     = ⋯   ( 不 妨 设 n 是 b 的 幂 )              = \cdots ~(不妨设n是b的幂)~~~~~~~~~~~~ = (nb)             = a l o g b n T ( 1 ) + ∑ j = 0 l o g b n − 1 a j f ( n / b j )    = a^{log_b^n}T(1) + \sum_{j=0}^{log_b^n-1} a^j f(n/b^j) ~~ =alogbnT(1)+j=0logbn1ajf(n/bj)  
由对数的换底公式: a l o g b n = b l o g b ( a l o g b n ) = b l o g b a l o g b n = b l o g b n l o g b a = b l o g b ( n l o g b a ) = n l o g b a a^{log_b^n} =b^{log_b^{(a^{log_b^n})}} =b^{log_b^a log_b^n} =b^{log_b^n log_b^a}= b^{log_b^{(n^{log_b^a})}}=n^{log_b^a} alogbn=blogb(alogbn)=blogbalogbn=blogbnlogba=blogb(nlogba)=nlogba

所以原递归式的渐进复杂度为 O ( n l o g b a ) + ∑ j = 0 l o g b n − 1 a j f ( n / b j ) O(n^{log_b^a}) + \sum_{j=0}^{log_b^n-1} a^j f(n/b^j) O(nlogba)+j=0logbn1ajf(n/bj)

简单起见,下面只考虑 f ( n ) = n k f(n) = n^k f(n)=nk 的情形:
∑ j = 0 l o g b n − 1 a j f ( n / b j ) \sum_{j=0}^{log_b^n-1} a^j f(n/b^j) j=0logbn1ajf(n/bj) = ∑ j = 0 l o g b n − 1 a j ( n / b j ) k         = \sum_{j=0}^{log_b^n-1} a^j (n/b^j)^k ~~~~~~~ =j=0logbn1aj(n/bj)k        = n k ∑ j = 0 l o g b n − 1 ( a / b k ) j         = n^k\sum_{j=0}^{log_b^n-1} (a/b^k)^j ~~~~~~~ =nkj=0logbn1(a/bk)j        = { n k ( 1 − ( a / b k ) l o g b n 1 − a / b k ) , 如果 a ≠ b k n k ( l o g b n − 1 ) , 如果 a = b k = \left\{ \begin{array}{lr} n^k \left(\frac{1-(a/b^k)^{log_b^n}}{1-a/b^k}\right), & \text{如果$a\neq b^k$}\\ &\\ n^k(log_b^n-1), & \text{如果$a = b^k$} \end{array} \right. =nk(1a/bk1(a/bk)logbn),nk(logbn1),如果a=bk如果a=bk = { O ( n k ) , 如果 a < b k ( k > l o g b a ) O ( n l o g b a ) , 如果 a > b k O ( n k l o g b n ) = O ( n l o g b a l o g b n ) , 如果 a = b k = \left\{ \begin{array}{lr} O(n^k) , & \text{如果$a < b^k(k>log_b^a)$}\\ &\\ O(n^{log_b^a}), & \text{如果$a> b^k$}\\ &\\ O(n^klog_b^n)=O(n^{log_b^a}log_b^n), & \text{如果$a = b^k$} \end{array} \right. =O(nk),O(nlogba),O(nklogbn)=O(nlogbalogbn),如果a<bk(k>logba)如果a>bk如果a=bk

综上所述,对 T ( n ) = a T ( n b ) + f ( n ) T(n) = aT(\frac{n}{b}) + f(n) T(n)=aT(bn)+f(n) 的情形:
T ( n ) = { O ( n k ) , 如果 a < b k ( k > l o g b a ) O ( n l o g b a ) , 如果 a > b k O ( n k l o g b n ) = O ( n l o g b a l o g b n ) , 如果 a = b k T(n)= \left\{ \begin{array}{lr} O(n^k) , & \text{如果$a< b^k(k>log_b^a)$}\\ &\\ O(n^{log_b^a}), & \text{如果$a> b^k$}\\ &\\ O(n^klog_b^n)=O(n^{log_b^a}log_b^n), & \text{如果$a = b^k$} \end{array} \right. T(n)=O(nk),O(nlogba),O(nklogbn)=O(nlogbalogbn),如果a<bk(k>logba)如果a>bk如果a=bk
在这里插入图片描述

减治法主定理

在这里插入图片描述

### 使用定理计算算法时间复杂度 对于给定的递归关系 \( T(n) = a \cdot T\left( \frac{n}{b} \right) + f(n) \)[^1],其中: - \( a \geq 1 \) 是子问题的数量, - \( b > 1 \) 是每个子问题大小相对于原始问题的比例因子, - \( f(n) \) 表示将问题划分为子问题以及组合子问题解决方案所需的工作量。 为了应用定理,需考虑三种不同情况下的渐近行为[^3]: #### 情况一 如果存在常数 \( \epsilon > 0 \),使得 \( f(n) = O(n^{c_{crit}-\epsilon}) \),其中 \( c_{crit}=\log_b{a} \),则 \( T(n)=\Theta(n^{c_{crit}}) \)[^4]。 #### 情况二 当 \( f(n)=\Theta(n^{c_{crit}}) \),此时 \( T(n)=\Theta(n^{c_{crit}}\log{n}) \)[^5]。 #### 情况三 如果有某个正数 \( \epsilon>0 \),并且 \( af\left(\frac{n}{b}\right)\le cf(n) \) 对于充分大的 \( n \) 成立(这里 \( c<1 \)),那么 \( T(n)=\Theta(f(n)) \)。 下面通过Python代码展示如何基于上述规则实现一个简单的判断逻辑来决定适用哪种情形,并给出相应的时间复杂度估计值。 ```python def master_theorem(a, b, f_n): import math # Calculate critical exponent crit_exp = math.log(a, b) # Determine which case applies based on the relationship between f(n) and n^(critical_exponent) if isinstance(f_n, str): # Simplified check for demonstration purposes only if 'n' not in f_n or int(f_n.split('n')[1]) < crit_exp: result = "Case 1: Θ(n^{})".format(crit_exp) elif '=' in f_n: result = "Case 2: Θ(n^{} * log(n))".format(crit_exp) else: result = "Case 3: Θ({})".format(f_n) return result print(master_theorem(2, 2, "n")) # Example usage with merge sort parameters ``` 此函数接受三个参数 `a`、`b` 和描述 \( f(n) \) 的字符串表达式。注意这只是一个简化的例子,在实际应用中可能需要更复杂的解析方法来处理各种类型的输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值