求解或近似数字序列的递归关系


89

在计算机科学中,我们经常必须解决递归关系,即为递归定义的数字序列找到闭合形式。在考虑运行时时,我们通常主要对序列的渐近增长感兴趣。

例子是

  1. 尾递归函数的运行时间从向下逐步降为,的身体花费时间:0nf(n)

    T(0)=0T(n+1)=T(n)+f(n)

  2. 的斐波那契序列:

    F0=0F1=1Fn+2=Fn+Fn+1

  3. 具有括号对的Dyck单词数:n

    C0=1Cn+1=∑i=0nCiCn−i

  4. mergesort运行时重复出现在长度为列表上:n

    T(1)=T(0)=0T(n)=T(⌊n/2⌋)+T(⌈n/2⌉)+n−1

解决递归关系的方法有哪些?我们正在寻找

  • 一般方法和
  • 重要子类的方法

以及

  • 产生精确解的方法
  • 提供(逐渐)渐近增长的方法。

这应该成为参考问题。请为每种方法发布一个答案,并提供一般说明和说明性示例。


9
这些说明可能会有所帮助。(但不,我不会将它们转录成答案。)
— JeffE 2012年

Answers:


35

将完整历史记录转换为有限历史记录

这是解决递归的第一步,其中任何整数的值都取决于所有较小整数的值。考虑,例如,复发 ,其产生在随机快速排序分析中的应用。(在此,是随机选择的枢轴的秩)。对于任何整数,的值依赖于所有同。这种形式的重复称为完整历史重复。knT(n)T(k)k<n

T(n)=n+1n∑k=1n(T(k−1)+T(n−k))
knT(n)T(k)k<n

要解决此重复,我们可以将其转换为有限的历史重复,其中仅取决于恒定数量的先前值。但首先,它有助于简化重复过程,收集常用术语并消除讨厌的分数。 现在可以转换为有限历史重复,我们记下的递归,减去和重新输入项: n T (n )T(n) T(n−1)(n − 1 )T (n − 1 )

nT(n)=n2+2∑k=1n−1T(k)
T(n−1)
(n−1)T(n−1)=(n−1)2+2∑k=1n−2T(k)⟹nT(n)−(n−1)T(n−1)=(2n−1)+2T(n−1)⟹nT(n)=(2n−1)+(n+1)T(n−1)⟹T(n)n+1=2n−1n(n+1)+T(n−1)n

现在,如果我们定义并将分数替换为更简单的渐近形式,我们获得了更简单的递归 将此递归扩展为求和,将立即得到,其中是第个谐波数。我们得出结论。2 Ñ - 1t(n)=T(n)/(n+1) Θ(1/n)t(n)=Θ(1/n)+t(n-1)。t(n)=Θ(Hn)=Θ(logn)Hnn2n−1n(n+1)Θ(1/n)

t(n)=Θ(1/n)+t(n−1).
t(n)=Θ(Hn)=Θ(log⁡n)HnnT(n)=Θ(nlog⁡n)

1
如果您想要的精确解决方案,那么有点麻烦,这也不难(在这里)。我们得到。实际上,使我感到困惑,所以我更喜欢精确的变体。Landau条款令人讨厌。Ť (Ñ )= 2 (Ñ + 1 )ħ ñ + (Ť (0 )- 3 )ñ + Ť (0 )Σ ñ 我= 1 Θ (1 /我)= Θ (ħ Ñ)TT(n)=2(n+1)Hn+(T(0)−3)n+T(0)∑i=1nΘ(1/i)=Θ(Hn)
— 拉斐尔

实际上,只要(归纳地)观察到,其中。实际上,当我替换时间以更简单的划分数组时,我就已经使用了这个技巧。这是完全标准的符号滥用。t ∗(n )= 1 / n + t ∗(n − 1 )Θ (n )nT(n)/(n+1)=Θ(t∗(n))t∗(n)=1/n+t∗(n−1)Θ(n)n
— JeffE 2012年

28

生成函数

每个数字序列都对应一个生成函数。通常可以从循环中轻松获得它的系数-系列的元素-。

此答案包括带有完整示例的常规ansatz,特殊情况的快捷方式以及有关使用此方法获得渐近线的一些注意事项(即使无法获得精确的结果)。

方法

令一系列数字。然后,正式的权力系列(an)n∈N

A(z)=∑n=0∞anzn

是的普通生成函数 ¹ 。的级数展开中的系数等于序列,即。例如,著名的加泰罗尼亚数字的普通生成函数为甲(ż )[ Ž Ñ ] 甲(ż )= 一个Ñ Ç Ñ(an)n∈NA(z)[zn]A(z)=an Cn

C(z)=1−1−4z2z。

的定义也是解决递归的难题。这对于线性递归最有效,因此为简单起见,假定形式的递归A

a0=c0⋮ak−1=ck−1an=f(n)+∑i=1kbian−i,n≥k

对于某些固定的和一个独立于所有的函数。现在,我们只需将锚和递归部分都插入到ansatz中,即 ˚F (Ñ ):ñ → Ñ 一个我b1,…,bk∈Rf(n):N→Nai

A(z)=∑n=0∞anzn=c0z0+c1z1+⋯+ck−1zk−1+∑n=k∞[f(n)+(∑i=1kbian−i)]zn

利用求和操纵的力学,形式幂级数的性质和已知恒等式 ²,最后一个右手侧必须转换为封闭形式,通常以。生成的方程可以(通常)求解。结果的级数展开(可以容易地获得,已知或以其他方式可达到)实质上是解决方案。A (z )A(z)A(z)

在Wilf的书[3]和GKP [4]中可以找到很好的介绍。Flajolet和Sedgewick [5]收集了高级材料。

例

考虑

a0=1a1=2an=5n+3an−1−2an2,n>1

我们计算:

A(z)=∑n=0∞anzn=1+2z+∑n=2∞[3an−1−2an−2+5n]zn=1+2z+3∑n=2∞an−1zn−2∑n=2∞an−2zn+5∑n=2∞nzn=1+2z+3z∑n=1∞anzn−2z2∑n=0∞anzn+5∑n=2∞nzn=1+2z+3z(A(z)−a0)−2z2A(z)+5(z(1−z)2−z)=1−6z+(3z−2z2)A(z)+5z(1−z)2

这解决了

A(z)=1−3z+13z2−6z3(1−2z)(1−z)3=161−2z−51−z−5(1−z)2−5(1−z)3=16∑n=0∞2nzn−5∑n=0∞zn−5∑n=0∞(n+1)zn−5∑n=0∞(n+1)(n+2)2zn

现在我们终于可以读懂了

an=16⋅2n−5−5(n+1)−52(n+1)(n+2)=2n+4−52n2−252n−15

一旦习惯了,您会发现这一切都是很熟练的。实际上,计算机代数可以在许多情况下为您完成所有这些工作。这样做的好处是,即使复发更为复杂,它仍然(或多或少)保留该机制。请参阅此处,以获取更多参与,更少机械的示例。

还应注意,如果要搜索的对象是复数,甚至是多项式,则通用技术也可以使用。

捷径

对于线性和齐次递归,即形式

a0=c0⋮ak−1=ck−1an=∑i=1kbian−i,n≥k

每次都以完全相同的方式进行上述操作。通过象征性地执行上述计算,我们发现以下引理。让

zk−b1zk−1−b2zk−2−⋯−bk

是(递归的)特征多项式。此外,分别使具有多重性的所述多项式的(成对不同的)零分别为。然后,所需的系数为ř 我λ1,…,λlri

an=∑i=1l∑j=1ribi,j⋅nj−1⋅λin

未知。由于特征多项式的阶次为,因此恰好有(复数)零,即 sum为。因此,丢失的系数可以通过求解与线性方程系统来确定由上述式等同与任何获得方程所述的(例如锚)。 k k r i k k k a nbi,jkkrikkkan

渐近性

得出的闭合形式通常很容易。通过生成函数来表达它,我们知道(如我们在示例中一样)的系数很快变得困难。示例是上面的和问题中提到的Dyck单词数的示例。C (z )A(z)C(z)

为了获得系数的渐近性,可以使用复杂的分析机制,特别是奇点分析。流行词包括Darboux方法和鞍点方法。这些基于残差定理和柯西积分公式。有关详细信息,请参见[6]。


  1. 您可以使用exponential,Dirichlet和其他一些生成函数来做类似的事情。哪种方法效果最好取决于手头的顺序,尤其取决于您是否找到了必要的封闭表格。
  2. 例如,来自TCS备忘单或[3]。
  3. generatingfunctionology由H.维尔夫(1994年,第二版) -可免费下载
  4. RL Graham,DE Knuth和O.Patashnik撰写的《具体数学》(1994年,第二版)。
  5. R.Sedgewick和P.Flajolet 的算法分析简介(2013年第二版)-免费下载
  6. P.Flajolet和R.Sedgewick(2009)的Analytic Combinatorics-免费下载

21

大师定理

该主定理给出了渐近所谓的解决方案鸿沟和征服复发,这使得他们划分成参数比例块(而不是切除常量)。它们通常在分析(递归)分治法时出现,因此得名。该定理之所以受欢迎,是因为它通常非常容易应用。另一方面,它只能应用于以下形式的重复发生:

T(n)=a⋅T(nb)+f(n)

与。有三种情况a≥1,b>1

  1. f∈O(nlogb⁡(a)−ε)

    对于一些 ;ε>0

  2. f∈Θ(nlogb⁡alogk⁡n),

    对于一些 ;k≥0

  3. f∈Ω(nlogb⁡(a)+ε)

    对于一些和ε>0

    af(nb)≤cf(n)

    对于某些和。n → ∞c<1n→∞

这意味着无症状

  1. T∈Θ(nlogb⁡a),
  2. T∈Θ(nlogb⁡alogk+1⁡n)和
  3. T∈Θ(f),

分别。注意,这里没有说明或使用基本情况。考虑到我们只是在研究渐近行为,这很有意义。我们默默假定它们是一些常量(还能有什么,他们可以。这常量,我们没有看到的是无关紧要的,他们都在消失。Θ

例子

  1. 考虑复发

    T(n)=4T(n3)+n。

    与与 -注意我们看到情况下,一个具有适用。因此,。b = 3 日志b一个≈ 1.26 ε = 0.25 Ť &Element; Θ (Ñ 登录3 4)= Θ (Ñ 1.261 ...)f(n)=n,a=4b=3logb⁡a≈1.26ε=0.25T∈Θ(nlog3⁡4)=Θ(n1.261…)

  2. 考虑复发

    T(n)=2T(n/2)+n。

    在和 -注意我们看到情况2适用于。因此,。b = 2 日志b一个= 1 ķ = 0 Ť &Element; Θ (Ñ 登录Ñ )f(n)=n,a=2b=2logb⁡a=1k=0T∈Θ(nlog⁡n)

  3. 考虑复发

    T(n)=3T(n4)+n。

    在和 -注意我们看到情况三适用于和。因此,。b = 4 日志b一个≈ 0.79 ε = 0.2 c ^ = 1 Ť &Element; Θ (Ñ )f(n)=n,a=3b=4logb⁡a≈0.79ε=0.2c=1T∈Θ(n)

  4. 考虑复发

    T(n)=16T(n4)+n!

    这里我们有,和-许多标准示例将具有多项式,但这不是规则。我们有,情况三再次适用。但是在这种情况下,我们可以选择任何且作为对于所有。因此。b = 4 f (n )= n !˚F 日志b一个= 2 ε ç > 0 Ñ !&Element; Ω (Ñ ķ)ķ Ť &Element; Θ (Ñ !)a=16b=4f(n)=n!flogb⁡a=2εc>0n!∈Ω(nk)kT∈Θ(n!)

进一步阅读

  • 大师定理的情况很可能都不适用。例如,子问题的大小可能不相等,也可能更复杂。Master定理有一些扩展,例如Akra-Bazzi [1]或Roura [2]。甚至有一个适用于离散递归的版本(即,递归参数使用了底数和小数),并提供了更清晰的结果[3]。

  • 通常,在应用Master定理之前,您必须先弄清楚已形成的实际递归关系。保持渐近性的常见转换包括掉落地板和天花板以及假设。注意不要在这里弄坏东西;有关详细信息,请参见[4]第4.6节和该问题。n=bk


  1. M. Akra和L. Bazzi(1998)关于线性递归方程的解
  2. S. Roura(1997)针对分治法则递归的
    改进的主定理指的是其他改进的主定理。
  3. M.Drmota和W.Szpankowski(2011)提出的离散除法和征服递归的主定理
  4. Cormen等人的算法简介。(2009年,第3版)

这可能是一个愚蠢的问题,但是当a不等于b时,我常常无法掌握心智模型,我不知道为什么,但是凭直觉,我总是觉得两者必须总是一样,就像在mergesort中,我们将问题划分为两个相等的(几乎)一半,每个n / 2个实例。此外,如果我们将算法分为三个相等的部分,则输入也应分为三个相等的部分,这又使a和b相等。我怎样才能打破这种错误的直觉?
— CodeYogi '16

17

猜测与证明

或我喜欢称之为“技术”。它可以应用于各种身份。这个想法很简单:…

猜测解决方案并证明其正确性。

这是一种流行的方法,可以说是因为它通常需要一些创造力和/或经验(很好地炫耀),但是很少需要机械手(看起来很优雅)。这里的艺术是做出良好的,有根据的猜测;证明(在我们的情况下)通常是或多或少的简单归纳法。

当应用于递归时,“猜测”通常由

  • 扩大复发几倍,
  • 找出锚点并
  • 猜测中间的模式()。…

简单的例子

s0=s1=s2=1sn=5sn−3+6n≥2

让我们扩展的定义几次:sn

sn=5sn−3+6=5(5sn−6+6)+6=5(5(5sn−9+6)+6)+6 ⋮=5(5(5(…5⋅1⏟n÷3 times+6…)+6)+6)+6⏟n÷3 times

在这里,这种模式很容易发现,并引出了我们的主张:

sn=5⌊n3⌋+6⋅∑i=0⌊n3⌋−15i=52⋅5⌊n3⌋−64

现在我们通过归纳证明身份。对于,我们可以通过插入相应的值来确定正确性。假设对于一个任意但固定的,身份对于所有成立,我们计算n∈{0,1,2}n′≤nn≥3

sn+3=5sn+6=5⋅(52⋅5⌊n3⌋−64)+6=52⋅5⌊n3⌋+1−64=52⋅5⌊n+33⌋−64

通过归纳的力量证明了身份。

如果尝试在涉及更多的重复中使用此方法,则会很快遇到此方法的主要缺点:很难看到模式,或将其浓缩为一个很好的封闭形式。

渐近性

也可以将此方法用于渐近疗法。但是请注意,您必须猜测 Landau符号的常数,因为必须有一个常数来确定所有 的边界,即常数因数在归纳过程中不能改变。n

例如,考虑对 k¹简化的Mergesort运行时重现:n=2k

T(1)=T(0)=0T(n)=2T(n/2)+n−1n≥1

我们猜测该与常数,即。我们通过对的归纳来证明这一点;归纳步骤如下所示:T(n)∈O(nlog⁡n)c=1T(n)≤nlog⁡nk

T(n)=2T(n/2)+n−1≤2n2log⁡n2+n−1=nlog⁡n−nlog⁡2+n−1<nlog⁡n


  1. 对于自然数的非递减序列,每个无限子序列都具有与原始序列相同的渐近增长。

15

Akra-Bazzi方法

所述Akra-Bazzi方法给出渐近形式的复发: 这涵盖了通常的“分而治之”重复发生,但也包括除法不相等的情况。例如,“忽悠词”可以满足不完全精确的划分。适用条件为:

T(x)=∑1≤i≤kaiT(bix+hi(x))+g(x)for x≥x0
hi(x)
  • 有足够的基本案例可以使重复进行
  • 该和都是常数aibi
  • 对于所有,iai>0
  • 对于所有,i0<bi<1
  • |g(x)|=O(xc)对于某个常数如cx→∞
  • 对于所有,i|hi(x)|=O(x/(log⁡x)2)
  • x0是一个常数

注意,并且作为锯齿函数始终在0到1之间,替换(或 适当)满足的条件。⌊bix⌋=bix−{bix}{u}=u−⌊u⌋⌊bix⌋⌈bix⌉hi

求使得: 然后,的渐近行为为给出: 与 “足够大”,即因此 对于所有, 。p

∑1≤i≤kaibip=1
T(x)x→∞
T(x)=Θ(xp(1+∫x1xg(u)up+1du))
x1k1>0
(2)g(x/2)≥k1g(x)
x>x1

例子A

例如,对进行递归,其中: 满足条件,我们需要: 幸运的是,。因此,我们有: n≥5T(0)=T(1)=T(2)=T(3)=T(4)=17

T(n)=9T(⌊n/5⌋)+T(⌈4n/5⌉)+3nlog⁡n
p
9(15)p+(45)p=1
p=2
T(n)=Θ(n2(1+∫3n3ulog⁡uu3du))=Θ(n2)

因为使用我们对所有都满足。请注意,因为即使我们使用其他常量(例如)作为下界,积分也会收敛,因此也可以使用这些常量;差异消失在。k1≤12(1−log⁡2log⁡3)(2)x≥31Θ

例子B

下面是另一个示例: 我们有,检查。我们有一个单独的,,可以检出。假设实际上是和/或,则隐含的也会检出。因此,我们需要: 因此,并且: n≥2

T(n)=4T(n/2)+n2/lg⁡n
g(n)=n2/ln⁡n=O(n2)a1=4b1=1/2n/2⌊n/2⌋⌈n/2⌉hi(n)
a1b1p=4⋅(1/2)p=1
p=2
T(n)=Θ(n2(1+∫2nu2duu3ln⁡u))=Θ(n2(1+∫2nduuln⁡u))=Θ(n2ln⁡ln⁡n)
我们将与上面类似的技巧应用于积分的下限,仅使用因为积分不收敛于。21

(感谢代数的极大帮助)


1
我检查了原纸。它们对积分的下限有技术限制;您的版本(援引Mehlhorn的调查?)明确要求积分收敛。由于我认为原始条件更容易检查,因此我更改了声明和示例,请检查。
— 拉斐尔

1
此外,原始论文没有给出带有的版本;摘自莱顿的手稿吗?您是否有同行评审的参考书?我们是否应该转向Akra&Bazzi在1998年论文中给出的版本?hi
— 拉斐尔

1
我偶然发现了定理中似乎不一致的地方。也许您知道答案?
— 拉斐尔

11

求和

通常会遇到形式为的递归 其中是单调的。在这种情况下,我们可以展开 因此给定一个初始值以便估算我们需要估算总和。

T(n)=T(n−1)+f(n),
f(n)
T(n)=T(c)+∑m=c+1nf(m),
T(c)T(n)f(c+1)+⋯+f(m)

不递减f(n)

当为单调非递减时,我们有明显的界限 就某些函数而言,这些边界是严格的,这是最好的:常量函数的上限,阶跃函数的下限对于和,对于)。但是,在许多情况下,这些估计不是很有帮助。例如,当,下限为,上限为,因此它们相距很远。f(n)

f(n)≤∑m=c+1nf(m)≤(n−c)f(n).
f(m)=1m≥nf(m)=0m<nf(m)=mn(n−c)n

积分

通过积分可以得到更好的估计: 对于,这给出了低阶项之和的正确值: 当我们可以显式计算总和,但是在许多情况下,显式计算很困难。例如,当,的反导数为,因此

∫cnf(x)dx≤∑m=c+1nf(m)≤∫c+1n+1f(x)dx.
f(m)=m
12n2−12c2≤∑m=c+1nm≤12(n+1)2−12(c+1)2.
f(m)=mf(m)=mlog⁡mf(1/2)x2log⁡x−(1/4)x2
∑m=c+1nmlog⁡m=12n2log⁡n±Θ(n2).

该欧拉-麦克劳林公式给出更好的估计。例如,可以通过估算和来证明斯特林公式的强形式。log⁡n!=∑m=1nlog⁡m

不增加f(n)

在某些情况下,是单调非递增的。平凡的估计变为 积分估计 例如,对于,使用我们获得 f(n)

f(1)≤∑m=c+1nf(m)≤(n−c)f(1),
∫c+1n+1f(x)dx≤∑m=c+1nf(m)≤∫cnf(x)dx.
f(m)=1/m∫f(m)=log⁡m
∑m=c+1n1m=log⁡n±Θ(1).

这个答案较少涉及解决递归问题,而是估计总和(这可能对解决递归问题很有用)。该技术是黎曼和的对偶。对于常数它也应该与其他形式一起使用,例如。T(n−d)d
— 拉斐尔

对,也可以用这种方法求解。T(n)=cT(n−d)+f(n)
— Yuval Filmus 2014年

9

Sedgewick和Flajolet在分析组合学方面做了大量工作,可以结合使用生成函数和复杂分析来渐近地解决递归问题。他们的工作可以自动解决许多重复问题,并且已在某些计算机代数系统中实现。

这本有关该主题的教科书由Flajolet和Sedgewick撰写,是极好的参考。Sedgewick和Flajolet撰写的这篇文章是针对算法分析应用程序的一个较为简单的阐述。

希望这可以帮助!


4
这是一个很好的参考,但是我们希望以一种可访问的方式来收集方法。您能否详细介绍一种特定的方法?
— 拉斐尔

9

有时您可能会遇到这样的异常重复: 如果您像我一样,会意识到您无法使用主定理,那么您可能会认为,“嗯...也许可以进行递归树分析。” 然后您会意识到这棵树开始变得非常粗壮。在互联网上搜索后,您会看到Akra-Bazzi方法将起作用!然后,您实际上开始研究它,并意识到您并不是真的想做所有的数学运算。如果到目前为止您一直都喜欢我,那么您会很高兴知道有一种更简单的方法。

T(n)={cn<72T(n5)+4T(n7)+cnn≥7


不均匀分裂定理第1部分

令和为正常数。ck

然后令为正常数,使得。{a1,a2,…,ak}∑1kai<1

我们还必须重复使用以下形式(例如上面的示例):

T(n)≤c0<n<max{a1−1,a2−1,…,ak−1}T(n)≤cn+T(a1n)+T(a2n)+…T(akn)n≥max{a1−1,a2−1,…,ak−1}

要求

然后我要求其中是一个常数(例如,渐近线性),并且:T(n)≤bnb

b=c1−(∑1kai)

归纳证明

基础:n<max{a1−1,a2−1,…,ak−1}⟹T(n)≤c<b<bn

归纳法:假设任何为真,则有n′<n

T(n)≤cn+T(⌊a1n⌋)+T(⌊a2n⌋)+⋯+T(⌊akn⌋)≤cn+b⌊a1n⌋+b⌊a2n⌋+⋯+b⌊akn⌋≤cn+ba1n+ba2n+⋯+bakn=cn+bn∑1kai=cn−cn∑1kai1−(∑1kai)+cn∑1kai1−(∑1kai)=cn1−(∑1kai)=bn◻

然后我们有。T(n)≤bn⟹T(n)=O(n)

例

T(n)={cn<72T(n5)+4T(n7)+cnn≥7
我们首先验证递归调用内的系数之和小于1:
1>∑1kai=15+15+17+17+17+17=25+47=3435

接下来,我们验证基本情况是否小于系数倒数的最大值:

n<max{a1−1,a2−1,…,ak−1}=max{5,5,7,7,7,7}=7

满足这些条件,我们知道其中是一个等于的常数: 因此,我们有: T(n)≤bnb

b=c1−(∑1kai)=c1−3435=35c
T(n)≤35cn∧T(n)≥cn∴T(n)=Θ(n)


不均匀分裂定理第2部分

类似地,我们可以证明时的约束。证明将遵循大部分相同的格式:∑1k=1

令和为正常数,使。ckk>1

然后令为正常数,使得。{a1,a2,…,ak}∑1kai=1

我们还必须重复使用以下形式(例如上面的示例):

T(n)≤c0<n<max{a1−1,a2−1,…,ak−1}T(n)≤cn+T(a1n)+T(a2n)+…T(akn)n≥max{a1−1,a2−1,…,ak−1}

要求

然后我要求(我们选择基数因为将是递归树的分支因子)其中和是常数(例如,渐近线性方程) ),以便:T(n)≤αnlogk⁡n+βnlogkkαβ

β=c
和
α=c∑1kailogk⁡ai−1

归纳证明

基础:n<max{a1−1,a2−1,…,ak−1}⟹T(n)≤c=β<αnlogk⁡n+βn

归纳法:假设任何为真,则有n′<n

T(n)≤cn+T(⌊a1n⌋)+T(⌊a2n⌋)+⋯+T(⌊akn⌋)≤cn+∑1k(αainlogk⁡ain+βain)=cn+αn∑1k(ailogk⁡ain)+βn∑1kai=cn+αn∑1k(ailogk⁡nai−1)+βn=cn+αn∑1k(ai(logk⁡n−logk⁡ai−1))+βn=cn+αn∑1kailogk⁡n−αn∑1kailogk⁡ai−1+βn=αn∑1kailogk⁡n+βn=αnlogk⁡n+βn◻

那么我们有。T(n)≤αnlogk⁡n+βn⟹T(n)=O(nlog⁡n)

例

让我们修改前面的示例,我们只使用了一点点:

T(n)={cn<352T(n5)+4T(n7)+T(n35)+cnn≥35

我们首先验证递归调用内的系数之和为1:

1=∑1kai=15+15+17+17+17+17+135=25+47+135=3535

接下来,我们验证基本情况是否小于系数倒数的最大值:

n<max{a1−1,a2−1,…,ak−1}=max{5,5,7,7,7,7,35}=35

在满足这些条件的情况下,我们知道其中并且是一个常数,等于: 因此,我们得到: T(n)≤αnlog⁡n+βnβ=cα

b=c∑1kailogk⁡ai−1=c2log7⁡55+4log7⁡77+log7⁡3535≈1.048c
T(n)≤1.048cnlog7⁡n+cn∴T(n)=O(nlog⁡n)


6

再次检查了这篇文章后,我很惊讶这里还没有发布。

域转换/变量更改

在处理递归时,如果不清楚递归堆栈的深度,有时可以更改域有时很有用。

例如,进行以下重复:

T(n)=T(22log⁡log⁡n)+log⁡log⁡log⁡n

我们怎么能解决这个问题?我们可以扩展该系列,但是我保证这会非常快。相反,让我们考虑一下每次调用时输入的变化。

我们首先有:

  1. n,然后
  2. 22log⁡log⁡n,然后
  3. 22log⁡log⁡(22log⁡log⁡n),依此类推。

域转换的目标现在是将我们的递归更改为等效,以便代替上面的转换,我们仅拥有。S(k)k,k−1,k−2,…

例如,如果我们让,那么以上重复出现就是这样的: 然后我们可以简单地将其重写为: 然后,您要做的就是将转换为以获得: n=2222k

T(2222k)=T(22log⁡log⁡2222k)+log⁡log⁡log⁡(2222k)=T(2222k−1)+2k
T(k)=T(k−1)+2k=∑i=1k2k=2k+1−1
kn
T(n)=2(log⁡log⁡log⁡log⁡n)+1−1=O(log⁡log⁡log⁡n)


通过此示例,我们现在可以看到我们的目标。

假设 对于某些常数和函数和。

T(n)={h(1)n=1a⋅T(f(n))+h(n)otherwise
af(n)h(n)

现在,我们试图找到一些函数和,使得 g(k)=nf(g(k))=g(k−1)

T(g(k))=aT(f(g(k)))+h(g(k))=a⋅T(g(k−1))+h(g(k))

更一般地,我们希望其中是重复应用上,次。(例如)。这将使充当“迭代”函数。其中,在递归深度处,完成的工作只是。f(i)(n)=g(k−i)f(i)(n)fnif(2)(n)=f(f(n))g(k)ih(g(k−i))

然后我们可以轻松地将其转换为这样 然后我们只需要担心在给定基本情况下,将所有相加。也就是说, S(k)=T(g(k))

S(k)=a⋅S(k−1)+h(g(k))
h(g(k))k
S(k)=∑i=g−1(1)kak−ih(g(i))

如果我们可以为某个封闭形式函数确定,则可以将确定为 S(k)=γ(k)γT(n)

T(n)=γ(g−1(n))

然后我们使用它通过上面的其他方法之一来约束。您显然可以根据自己的规范修改此方法,但总的来说,您试图找到一个迭代函数将转换为简单的递归。T(n)g(k)T(n)

我目前不知道确定的确切方法,但是我会继续考虑它,并在它变得更清晰时(或者任何评论者有一些提示!)进行更新。过去,我大多数都是通过反复试验找到我的函数(有关示例,请参见此处,此处,此处和此处)。g(k)g(k)


1
,和/或是否有限制?我之所以要特别问一下,是因为当使用Landau表示法时,类似的民俗替代技巧有时也会失败,这使我担心是否始终是正确的答案。fghγ∘g−1
— 拉斐尔

@Raphael,这是我不确定的部分。我认为我们需要确保建立等效性。1)递归深度相同,这可以通过和来确保。2)在每个递归级别上完成的工作都是相同的,我认为这是由强制执行的,然后是。这样做的基本思想是简单地将变成一个和,即。从到我也不是100%肯定(我没有证据),但是我不知道为什么会这样不正确 有什么想法吗?f(g(k))=g(k−1)g(k)=ng(k)=nh(g(k))=h(n)T(n)∑i=ckh(g(i))γ(k)γ(g−1(n))
— 瑞安

@Raphael您还可以考虑以下情况:而不是,然后转换为应该更简单向前。容易证明,我想如果您仅在求和中显示等效项。您可能会在这里用Landau表示法遇到一些有趣的麻烦,但是如果您将Landau排除在外而只坚持精确的等式,我认为应该没问题。S(k)=γ(k)ΘT(n)=γ(g−1(n))
— 瑞安

@Raphael我将其编辑为仅使用相等性,因此Landau表示法不应对此造成混乱。也泛化了一些。您甚至可以使用函数而不是常量来推广更多。然后,只使用而不是总和中的。β(n)aak−iβ(g(i))
— 瑞安

5

还有一种方法可以用于简单的重复关系:请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可以解决一些非常简单的重复,但对于更复杂的重复来说却分崩离析。

这种方法避免了进行任何思考的需要,可以将其视为错误或功能。


3
我确实认为该站点的目的是为了解释计算机代数是如何做到这一点的,而不是提倡盲目使用。但是,这些工具是有用的,所以实际上有用的一个应该总把“浪费”时间(以“实践”)之前尝试。
— 拉斐尔

从我自己的经验,试图用计算机代数没有任何的什么是“硬”或“易”的意义并不让你很远。特别是在算法分析中,可能需要一些按摩。不知道如何自行解决重复问题,我不知道该怎么做。(关于本网站的目的,有多种观点。事实:到目前为止,“这对某人有用”不足以证明一个帖子的合理性。)
— 拉斐尔

5

如通常所述,主定理的情况2仅处理形式为递归,其中表示。以下定理取自Jeffrey Leon 的讲义,给出了负的答案:T(n)=aT(n/b)+f(n)f(n)=Θ(nloga⁡blogk⁡n)k≥0k

考虑具有适当基本情况的递归。T(n)=aT(n/b)+f(n)

  1. 如果对于,则。f(n)=O(nlogb⁡alogc−1⁡n)c<0T(n)=Θ(nlogb⁡a)

  2. 如果对于则。f(n)=Θ(nlogb⁡alogc−1⁡n)c=0T(n)=Θ(nlogb⁡alog⁡log⁡n)

  3. 如果对于,则)。f(n)=Θ(nlogb⁡alogc−1⁡n)c>0T(n)=Θ(nlogb⁡alogc⁡n

现在我们画草图,证明使用重复替换的方法。假设且。然后对于幂, 现在让我们一一考虑这些案例。当,系列收敛,因此。当,总和为谐波总和,依此f(n)=nlogb⁡alogbc−1⁡nT(1)=0nb

T(n)=∑i=0logb⁡n−1ai(nb−i)logb⁡alogbc−1⁡(nb−i)=∑i=0logb⁡n−1nlogb⁡a(logb⁡n−i)c−1=nlogb⁡a∑j=1logb⁡njc−1.
c<0∑j=0∞jc−1T(n)=Θ(nlogb⁡a)c=0Hlogb⁡n=log⁡(logb⁡n)+O(1)T(n)=Θ(nlogb⁡alog⁡log⁡n)。当,我们可以使用积分来近似求和: 因此。c>0
∑j=1logb⁡n≈∫0logb⁡nxc−1dx=xcc|0logb⁡n=logbc⁡nc,
T(n)=Θ(nlogb⁡alogc⁡n)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.