渐进分析及主定理

本文详细介绍了渐进分析的基本概念,包括Θ记号、O记号、Ω记号、o记号和ω记号,并解释了它们在算法分析中的作用。此外,文章还阐述了主定理的应用,通过一个具体的例子展示了如何利用主定理解决递归式问题。
部署运行你感兴趣的模型镜像

一、渐进分析

渐进分析的目的是为了忽略依赖于机器的常量,关注运行时间的增长。下面介绍渐进分析的几种记号:

Θ记号:f(n)=Θ(g(n)),对于任一函数f(n),存在正常数c1,c2,使当n充分大时,f(n)能被夹在c1g(n)和c2g(n)中间,g(n)是f(n)的一个渐进确界。

O记号:Θ记号给出的是一个函数的上界和下界,当只有渐进上界时,使用O记号。例如快速排序时间复杂度为O(nlgn)。

Ω记号:给出函数的渐进下界。

o记号:给出的不是渐进紧确的上界,2n^2 = O(n^2)是渐进紧确的,2n = O(n^2)却不是,用o记号表示非渐进紧确的上界。

ω记号:对应o记号,非渐进紧确下界。

将函数f与g的渐进比较和两个实数a与b的比较做一类比:

f(n) = O(g(n))    ≈    a ≤ b

f(n) = Ω(g(n))    ≈    a ≥ b

f(n) = Θ(g(n))    ≈    a = b

f(n) = o(g(n))    ≈    a < b

f(n) = ω(g(n))    ≈    a > b

在进行算法分析时我们通常用O来衡量一个算法时间复杂度的好坏,我们需要的是算法在最坏情况下算法的性能,因为最好情况通常出现的概率很小。

二、主定理

我们对算法进行分析时通常会得出递归式,例如归并排序,将n个数分成两个n/2,将n/2使用递归继续分解,最终将两个n/2排好序的数进行合并,需要时间是Θ(n)。总的需要的时间T(n) = 2T(n/2) + Θ(n),通过该递归式可以得出该算法的时间复杂度。

递归式解法通常有三种方法:

1、代换法:首先猜测解的形式,然后用数学归纳法找出使解真正有效的常数。在此不细说。

2、递归树法:将递归式往下分解,直到达到常数,然后将所有数加起来,看起来繁琐,其实不难。可以用该法获得解的形式,然后用代换法证明,也不细说。

3、主定理:此法有公式,根据递归式形式带入即可求解,证明用可用递归树法,具体可查资料,由于公式复制不进来,下面附图片。


看一个列子,T(n) = 9T(n/3) + n,a = 9,b = 3,f(n) = n,则






您可能感兴趣的与本文相关的镜像

EmotiVoice

EmotiVoice

AI应用

EmotiVoice是由网易有道AI算法团队开源的一块国产TTS语音合成引擎,支持中英文双语,包含2000多种不同的音色,以及特色的情感合成功能,支持合成包含快乐、兴奋、悲伤、愤怒等广泛情感的语音。

### 定理的概念与算法复杂度分析 定理(Master Theorem)是一种用于分析分治算法时间复杂度的工具。它适用于以下形式的递归关系: \[ T(n) = a \cdot T\left(\frac{n}{b}\right) + f(n) \] 其中,\( a \geq 1 \) 表示子问题的数量,\( b > 1 \) 表示每个子问题规模缩小的因子,而 \( f(n) \) 是分解和合并子问题所需的时间[^2]。 定理的核心在于通过比较 \( a \)、\( b \) 和 \( f(n) \) 的增长速度来定递归关系的渐进。具体而言,定理分为三种情况: #### 情况 1 如果 \( f(n) = O(n^{\log_b a - \epsilon}) \) 对某个常数 \( \epsilon > 0 \),那么递归关系的时间复杂度为: \[ T(n) = \Theta(n^{\log_b a}) \] #### 情况 2 如果 \( f(n) = \Theta(n^{\log_b a} \cdot \log^k n) \) 对某个常数 \( k \geq 0 \),那么递归关系的时间复杂度为: \[ T(n) = \Theta(n^{\log_b a} \cdot \log^{k+1} n) \] #### 情况 3 如果 \( f(n) = \Omega(n^{\log_b a + \epsilon}) \) 对某个常数 \( \epsilon > 0 \),并且满足正则条件(regularity condition):\( a \cdot f\left(\frac{n}{b}\right) \leq c \cdot f(n) \) 对某个常数 \( c < 1 \) 和足够大的 \( n \),那么递归关系的时间复杂度为: \[ T(n) = \Theta(f(n)) \] --- ### 定理的应用实例 以二分搜索为例,每次递归将问题规模减半(即 \( a = 1 \), \( b = 2 \)),且分解和合并子问题所需的额外时间为常数(即 \( f(n) = O(1) \))。在这种情况下,根据定理的情况 2,可以得出其时间复杂度为: \[ T(n) = \Theta(\log n) \] 另一个例子是归并排序(Merge Sort),每次递归将问题分为两个子问题(即 \( a = 2 \), \( b = 2 \)),且分解和合并子问题所需的额外时间为线性(即 \( f(n) = O(n) \))。根据定理的情况 2,可以得出其时间复杂度为: \[ T(n) = \Theta(n \log n) \] --- ### 定理的推导背景 定理的推导基于递归树模型。假设每次递归将问题分为 \( a \) 个子问题,每个子问题的规模为原问题的 \( \frac{1}{b} \),那么递归树的深度为 \( \log_b n \),叶子节点的数量为 \( a^{\log_b n} = n^{\log_b a} \)[^5]。通过对每一层的计算量进行求和,最终可以得到整个递归过程的总计算量,并由此导出定理的三种情况。 --- ```python # 示例代码:使用定理分析归并排序的时间复杂度 def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right) def merge(left, right): result = [] i = j = 0 while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result.extend(left[i:]) result.extend(right[j:]) return result ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值