Answers:
这是解决递归的第一步,其中任何整数的值都取决于所有较小整数的值。考虑,例如,复发 ,其产生在随机快速排序分析中的应用。(在此,是随机选择的枢轴的秩)。对于任何整数,的值依赖于所有同。这种形式的重复称为完整历史重复。knT(n)T(k)k<n
要解决此重复,我们可以将其转换为有限的历史重复,其中仅取决于恒定数量的先前值。但首先,它有助于简化重复过程,收集常用术语并消除讨厌的分数。 现在可以转换为有限历史重复,我们记下的递归,减去和重新输入项: n T (n ) T(n−1)(n − 1 )T (n − 1 )
现在,如果我们定义并将分数替换为更简单的渐近形式,我们获得了更简单的递归 将此递归扩展为求和,将立即得到,其中是第个谐波数。我们得出结论。2 Ñ - 1 Θ(1/n)t(n)=Θ(1/n)+t(n-1)。t(n)=Θ(Hn)=Θ(logn)Hnn
每个数字序列都对应一个生成函数。通常可以从循环中轻松获得它的系数-系列的元素-。
此答案包括带有完整示例的常规ansatz,特殊情况的快捷方式以及有关使用此方法获得渐近线的一些注意事项(即使无法获得精确的结果)。
令一系列数字。然后,正式的权力系列
是的普通生成函数 ¹ 。的级数展开中的系数等于序列,即。例如,著名的加泰罗尼亚数字的普通生成函数为甲(ż )[ Ž Ñ ] 甲(ż )= 一个Ñ Ç Ñ
。
的定义也是解决递归的难题。这对于线性递归最有效,因此为简单起见,假定形式的递归
对于某些固定的和一个独立于所有的函数。现在,我们只需将锚和递归部分都插入到ansatz中,即 ˚F (Ñ ):ñ → Ñ 一个我
利用求和操纵的力学,形式幂级数的性质和已知恒等式 ²,最后一个右手侧必须转换为封闭形式,通常以。生成的方程可以(通常)求解。结果的级数展开(可以容易地获得,已知或以其他方式可达到)实质上是解决方案。A (z )
在Wilf的书[3]和GKP [4]中可以找到很好的介绍。Flajolet和Sedgewick [5]收集了高级材料。
考虑
我们计算:
这解决了
现在我们终于可以读懂了
一旦习惯了,您会发现这一切都是很熟练的。实际上,计算机代数可以在许多情况下为您完成所有这些工作。这样做的好处是,即使复发更为复杂,它仍然(或多或少)保留该机制。请参阅此处,以获取更多参与,更少机械的示例。
还应注意,如果要搜索的对象是复数,甚至是多项式,则通用技术也可以使用。
对于线性和齐次递归,即形式
每次都以完全相同的方式进行上述操作。通过象征性地执行上述计算,我们发现以下引理。让
是(递归的)特征多项式。此外,分别使具有多重性的所述多项式的(成对不同的)零分别为。然后,所需的系数为ř 我
未知。由于特征多项式的阶次为,因此恰好有(复数)零,即 sum为。因此,丢失的系数可以通过求解与线性方程系统来确定由上述式等同与任何获得方程所述的(例如锚)。 k k r i k k k a n
得出的闭合形式通常很容易。通过生成函数来表达它,我们知道(如我们在示例中一样)的系数很快变得困难。示例是上面的和问题中提到的Dyck单词数的示例。C (z )
为了获得系数的渐近性,可以使用复杂的分析机制,特别是奇点分析。流行词包括Darboux方法和鞍点方法。这些基于残差定理和柯西积分公式。有关详细信息,请参见[6]。
该主定理给出了渐近所谓的解决方案鸿沟和征服复发,这使得他们划分成参数比例块(而不是切除常量)。它们通常在分析(递归)分治法时出现,因此得名。该定理之所以受欢迎,是因为它通常非常容易应用。另一方面,它只能应用于以下形式的重复发生:
与。有三种情况
对于一些 ;
,
对于一些 ;
对于一些和
对于某些和。n → ∞
这意味着无症状
分别。注意,这里没有说明或使用基本情况。考虑到我们只是在研究渐近行为,这很有意义。我们默默假定它们是一些常量(还能有什么,他们可以。这常量,我们没有看到的是无关紧要的,他们都在消失。
考虑复发
。
与与 -注意我们看到情况下,一个具有适用。因此,。b = 3 日志b一个≈ 1.26 ε = 0.25 Ť &Element; Θ (Ñ 登录3 4)= Θ (Ñ 1.261 ...)
考虑复发
。
在和 -注意我们看到情况2适用于。因此,。b = 2 日志b一个= 1 ķ = 0 Ť &Element; Θ (Ñ 登录Ñ )
考虑复发
。
在和 -注意我们看到情况三适用于和。因此,。b = 4 日志b一个≈ 0.79 ε = 0.2 c ^ = 1 Ť &Element; Θ (Ñ )
考虑复发
这里我们有,和-许多标准示例将具有多项式,但这不是规则。我们有,情况三再次适用。但是在这种情况下,我们可以选择任何且作为对于所有。因此。b = 4 f (n )= n !˚F 日志b一个= 2 ε ç > 0 Ñ !&Element; Ω (Ñ ķ)ķ Ť &Element; Θ (Ñ !)
大师定理的情况很可能都不适用。例如,子问题的大小可能不相等,也可能更复杂。Master定理有一些扩展,例如Akra-Bazzi [1]或Roura [2]。甚至有一个适用于离散递归的版本(即,递归参数使用了底数和小数),并提供了更清晰的结果[3]。
通常,在应用Master定理之前,您必须先弄清楚已形成的实际递归关系。保持渐近性的常见转换包括掉落地板和天花板以及假设。注意不要在这里弄坏东西;有关详细信息,请参见[4]第4.6节和该问题。
或我喜欢称之为“技术”。它可以应用于各种身份。这个想法很简单:
猜测解决方案并证明其正确性。
这是一种流行的方法,可以说是因为它通常需要一些创造力和/或经验(很好地炫耀),但是很少需要机械手(看起来很优雅)。这里的艺术是做出良好的,有根据的猜测;证明(在我们的情况下)通常是或多或少的简单归纳法。
当应用于递归时,“猜测”通常由
让我们扩展的定义几次:
在这里,这种模式很容易发现,并引出了我们的主张:
现在我们通过归纳证明身份。对于,我们可以通过插入相应的值来确定正确性。假设对于一个任意但固定的,身份对于所有成立,我们计算
通过归纳的力量证明了身份。
如果尝试在涉及更多的重复中使用此方法,则会很快遇到此方法的主要缺点:很难看到模式,或将其浓缩为一个很好的封闭形式。
也可以将此方法用于渐近疗法。但是请注意,您必须猜测 Landau符号的常数,因为必须有一个常数来确定所有 的边界,即常数因数在归纳过程中不能改变。
例如,考虑对 k¹简化的Mergesort运行时重现:
我们猜测该与常数,即。我们通过对的归纳来证明这一点;归纳步骤如下所示:
所述Akra-Bazzi方法给出渐近形式的复发: 这涵盖了通常的“分而治之”重复发生,但也包括除法不相等的情况。例如,“忽悠词”可以满足不完全精确的划分。适用条件为:
注意,并且作为锯齿函数始终在0到1之间,替换(或 适当)满足的条件。
求使得: 然后,的渐近行为为给出: 与 “足够大”,即因此 对于所有, 。
例如,对进行递归,其中: 满足条件,我们需要: 幸运的是,。因此,我们有:
因为使用我们对所有都满足。请注意,因为即使我们使用其他常量(例如)作为下界,积分也会收敛,因此也可以使用这些常量;差异消失在。
下面是另一个示例: 我们有,检查。我们有一个单独的,,可以检出。假设实际上是和/或,则隐含的也会检出。因此,我们需要: 因此,并且:
(感谢代数的极大帮助)
通常会遇到形式为的递归 其中是单调的。在这种情况下,我们可以展开 因此给定一个初始值以便估算我们需要估算总和。
当为单调非递减时,我们有明显的界限 就某些函数而言,这些边界是严格的,这是最好的:常量函数的上限,阶跃函数的下限对于和,对于)。但是,在许多情况下,这些估计不是很有帮助。例如,当,下限为,上限为,因此它们相距很远。
通过积分可以得到更好的估计: 对于,这给出了低阶项之和的正确值: 当我们可以显式计算总和,但是在许多情况下,显式计算很困难。例如,当,的反导数为,因此
该欧拉-麦克劳林公式给出更好的估计。例如,可以通过估算和来证明斯特林公式的强形式。
在某些情况下,是单调非递增的。平凡的估计变为 积分估计 例如,对于,使用我们获得
Sedgewick和Flajolet在分析组合学方面做了大量工作,可以结合使用生成函数和复杂分析来渐近地解决递归问题。他们的工作可以自动解决许多重复问题,并且已在某些计算机代数系统中实现。
这本有关该主题的教科书由Flajolet和Sedgewick撰写,是极好的参考。Sedgewick和Flajolet撰写的这篇文章是针对算法分析应用程序的一个较为简单的阐述。
希望这可以帮助!
有时您可能会遇到这样的异常重复:
如果您像我一样,会意识到您无法使用主定理,那么您可能会认为,“嗯...也许可以进行递归树分析。” 然后您会意识到这棵树开始变得非常粗壮。在互联网上搜索后,您会看到Akra-Bazzi方法将起作用!然后,您实际上开始研究它,并意识到您并不是真的想做所有的数学运算。如果到目前为止您一直都喜欢我,那么您会很高兴知道有一种更简单的方法。
令和为正常数。
然后令为正常数,使得。
我们还必须重复使用以下形式(例如上面的示例):
然后我要求其中是一个常数(例如,渐近线性),并且:
基础:
归纳法:假设任何为真,则有
然后我们有。
接下来,我们验证基本情况是否小于系数倒数的最大值:
满足这些条件,我们知道其中是一个等于的常数:
因此,我们有:
类似地,我们可以证明时的约束。证明将遵循大部分相同的格式:
令和为正常数,使。
然后令为正常数,使得。
我们还必须重复使用以下形式(例如上面的示例):
然后我要求(我们选择基数因为将是递归树的分支因子)其中和是常数(例如,渐近线性方程) ),以便:
基础:
归纳法:假设任何为真,则有
那么我们有。
让我们修改前面的示例,我们只使用了一点点:
我们首先验证递归调用内的系数之和为1:
接下来,我们验证基本情况是否小于系数倒数的最大值:
在满足这些条件的情况下,我们知道其中并且是一个常数,等于:
因此,我们得到:
再次检查了这篇文章后,我很惊讶这里还没有发布。
在处理递归时,如果不清楚递归堆栈的深度,有时可以更改域有时很有用。
例如,进行以下重复:
我们怎么能解决这个问题?我们可以扩展该系列,但是我保证这会非常快。相反,让我们考虑一下每次调用时输入的变化。
我们首先有:
域转换的目标现在是将我们的递归更改为等效,以便代替上面的转换,我们仅拥有。
例如,如果我们让,那么以上重复出现就是这样的:
然后我们可以简单地将其重写为:
然后,您要做的就是将转换为以获得:
通过此示例,我们现在可以看到我们的目标。
假设
对于某些常数和函数和。
现在,我们试图找到一些函数和,使得
更一般地,我们希望其中是重复应用上,次。(例如)。这将使充当“迭代”函数。其中,在递归深度处,完成的工作只是。
然后我们可以轻松地将其转换为这样
然后我们只需要担心在给定基本情况下,将所有相加。也就是说,
如果我们可以为某个封闭形式函数确定,则可以将确定为
然后我们使用它通过上面的其他方法之一来约束。您显然可以根据自己的规范修改此方法,但总的来说,您试图找到一个迭代函数将转换为简单的递归。
我目前不知道确定的确切方法,但是我会继续考虑它,并在它变得更清晰时(或者任何评论者有一些提示!)进行更新。过去,我大多数都是通过反复试验找到我的函数(有关示例,请参见此处,此处,此处和此处)。
还有一种方法可以用于简单的重复关系:请Wolfram Alpha为您解决重复问题。
例如,尝试输入f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2)
Wolfram Alpha。您将获得解决方案,并带有指向斐波那契数字的链接。或尝试f(1)=1, f(n)=f(n-1)+n
或f(1)=1, f(n)=2*f(n-1)+3*n
或f(n)=f(n-1) + 2 f(n-2), f(1)=1, f(2)=3
获取其他示例。但是请注意:Wolfram Alpha可以解决一些非常简单的重复,但对于更复杂的重复来说却分崩离析。
这种方法避免了进行任何思考的需要,可以将其视为错误或功能。
如通常所述,主定理的情况2仅处理形式为递归,其中表示。以下定理取自Jeffrey Leon 的讲义,给出了负的答案:
考虑具有适当基本情况的递归。
如果对于,则。
如果对于则。
如果对于,则)。
现在我们画草图,证明使用重复替换的方法。假设且。然后对于幂, 现在让我们一一考虑这些案例。当,系列收敛,因此。当,总和为谐波总和,依此