Resolvendo ou aproximando relações de recorrência para sequências de números


89

Na ciência da computação, geralmente precisamos resolver as relações de recorrência , ou seja, encontrar uma forma fechada para uma sequência de números definida recursivamente. Ao considerar os tempos de execução, geralmente nos interessamos principalmente pelo crescimento assintótico da sequência .

Exemplos são

  1. O tempo de execução de uma função recursiva de cauda que desce para de cujo corpo leva tempo :0nf(n)

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

  2. A sequência de Fibonacci :

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

  3. O número de palavras Dyck com pares de parênteses:n

    C0=1Cn+1=i=0nCiCni

  4. A recorrência do tempo de execução do mergesort em listas de comprimento :n

    T(1)=T(0)=0T(n)=T(n/2)+T(n/2)+n1

Quais são os métodos para resolver as relações de recorrência? Nos estamos procurando por

  • métodos gerais e
  • métodos para uma subclasse significativa

assim como

  • métodos que produzem soluções precisas e
  • métodos que proporcionam (limitam) crescimento assintótico.

Isso deveria se tornar uma pergunta de referência. Poste uma resposta por método e forneça uma descrição geral e um exemplo ilustrativo.


9
Essas anotações podem ser úteis. (Mas não, eu não vou transcrevê-los em respostas.)
Jeffe

Respostas:


35

Convertendo o histórico completo em histórico limitado

Esta é uma primeira etapa na solução de recorrências em que o valor em qualquer número inteiro depende dos valores em todos os números menores. Considere, por exemplo, a recorrência que surge na análise do quicksort randomizado . (Aqui, é a classificação do pivô escolhido aleatoriamente.) Para qualquer número inteiro , o valor de depende de todos os com . As recorrências deste formulário são chamadas de recorrências completas do histórico .knT(n)T(k)k<n

T(n)=n+1nk=1n(T(k1)+T(nk))
knT(n)T(k)k<n

Para resolver essa recorrência, podemos transformá-la em uma recorrência histórica limitada , onde depende apenas de um número constante de valores anteriores. Mas, primeiro, ajuda a simplificar um pouco a recorrência, coletar termos comuns e eliminar frações traquinas. Agora, para converter em uma recorrência de histórico limitado , anotamos a recorrência de , subtraímos e reorganizamos os termos: n T ( n )T(n) T(n-1) ( n - 1 ) T ( n - 1 )

nT(n)=n2+2k=1n1T(k)
T(n1)
(n1)T(n1)=(n1)2+2k=1n2T(k)nT(n)(n1)T(n1)=(2n1)+2T(n1)nT(n)=(2n1)+(n+1)T(n1)T(n)n+1=2n1n(n+1)+T(n1)n

Agora, se definirmos e substituir a fração pela forma assintótica mais simples , obtemos a recorrência muito mais simples Expandir este recorrência em um somatório de imediato nos dá , onde é o º número harmônica . Concluímos que .2 n - 1t(n)=T(n)/(n+1) Θ(1/n)t(n)=Θ(1/n)+t(n-1). t(n)=Θ(Hn)=Θ(logn)Hnn2n1n(n+1)Θ(1/n)

t(n)=Θ(1/n)+t(n1).
t(n)=Θ(Hn)=Θ(logn)HnnT(n)=Θ(nlogn)

1
Se você deseja a solução precisa para , também não é difícil (aqui), se um pouco entediante; obtemos . Na verdade, me confunde, por isso prefiro a variante precisa. Somas traquinas de termos landau . T ( n ) = 2 ( n + 1 ) H n + ( T ( 0 ) - 3 ) n + T ( 0 ) n i = 1 Θ ( 1 / i ) = Θ ( H n )TT(n)=2(n+1)Hn+(T(0)3)n+T(0)i=1nΘ(1/i)=Θ(Hn)
Raphael

Na verdade, basta observar (indutivamente) que , onde . De fato, eu já usei esse truque logo no início, quando substituí o tempo para particionar uma matriz pelo mais simples . Este é um abuso totalmente padrão de notação. t ( n ) = 1 / n + t ( n - 1 ) Θ ( n ) nT(n)/(n+1)=Θ(t(n))t(n)=1/n+t(n1)Θ(n)n
21412 JeffE

28

Gerando funções

Toda série de números corresponde a uma função geradora . Muitas vezes, pode ser obtido confortavelmente em uma recorrência para que seus coeficientes - os elementos da série - sejam arrancados.

Essa resposta inclui a ansatz geral com um exemplo completo, um atalho para um caso especial e algumas notas sobre o uso desse método para obter assintóticos (mesmo que o resultado preciso não possa ser obtido).

O método

Deixe uma série de números. Então, a série formal de poder(an)nN

A(z)=n=0anzn

é a função geradora comum ¹ de . Os coeficientes na expansão em série de iguais à sequência, ou seja, . Por exemplo, a função geradora comum dos famosos números catalães é A ( z ) [ z n ] A ( z ) = a n C n(an)nNA(z)[zn]A(z)=an Cn

C(z)=114z2z .

A definição de também é a nossa ansatz para resolver uma recorrência. Isso funciona melhor para recorrências lineares, portanto, assuma a simplicidade uma recorrência da formaA

a0=c0ak1=ck1an=f(n)+i=1kbiani,nk

para alguns fixo e uma função independente de todos . Agora, simplesmente inserimos âncoras e parte recursiva na ansatz, ou seja, f ( n ) : NN a ib1,,bkRf(n):NNai

A(z)=n=0anzn=c0z0+c1z1++ck1zk1+n=k[f(n)+(i=1kbiani)]zn

Usando mecânica de manipulação de soma, propriedades de séries formais de poder e identidades conhecidas ², o último lado direito deve ser trazido para formas fechadas, geralmente em termos de . A equação resultante pode (frequentemente) ser resolvida para . A expansão em série do resultado (que pode ser facilmente obtida, conhecida ou acessível de outra forma) é essencialmente a solução.A ( z )A(z)A(z)

Boas introduções podem ser encontradas no livro de Wilf [3] e no GKP [4]. Material avançado foi coletado por Flajolet e Sedgewick [5].

Exemplo

Considerar

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

Calculamos:

A(z)=n=0anzn=1+2z+n=2[3an12an2+5n]zn=1+2z+3n=2an1zn2n=2an2zn+5n=2nzn=1+2z+3zn=1anzn2z2n=0anzn+5n=2nzn=1+2z+3z(A(z)a0)2z2A(z)+5(z(1z)2z)=16z+(3z2z2)A(z)+5z(1z)2

Isso resolve para

A(z)=13z+13z26z3(12z)(1z)3=1612z51z5(1z)25(1z)3=16n=02nzn5n=0zn5n=0(n+1)zn5n=0(n+1)(n+2)2zn

Agora podemos finalmente ler

an=162n55(n+1)52(n+1)(n+2)=2n+452n2252n15

Depois de se acostumar , você percebe que tudo isso é bastante mecânico. De fato, a álgebra computacional pode fazer tudo isso em muitos casos. O bom é que permanece (mais ou menos) esse mecânico, mesmo que a recorrência seja mais complexa. Veja aqui um exemplo mais envolvido e menos mecânico.

Observe também que as técnicas gerais também funcionam se os objetos procurados forem números complexos ou mesmo polinômios.

Um atalho

Para recorrências lineares e homogêneas, isto é, da forma

a0=c0ak1=ck1an=i=1kbiani,nk

o exposto passa exatamente da mesma maneira, sempre. Ao executar o cálculo acima simbolicamente, encontramos o seguinte lema . Deixei

zkb1zk1b2zk2bk

ser o polinomal característico (da recorrência). Além disso, os zeros (distintos em pares) do referido polinômio com multiplicidade , respectivamente. Então, o coeficiente desejado é dado porr iλ1,,λlri

an=i=1lj=1ribi,jnj1λin

com desconhecido . Como o polinômio característico possui o grau , existem exatamente zeros (complexos) , ou seja, a soma de em . Portanto, os coeficientes ausentes podem ser determinados resolvendo o sistema de equações lineares com equações obtidas equacionando a fórmula acima com qualquer do (por exemplo, as âncoras). k k r i k k k a nbi,jkkrikkkan

Assintóticos

Chegar a um formulário fechado para é geralmente a parte mais fácil. Expressando-o na geração de funções, sabemos que os coeficientes (como fizemos no exemplo) rapidamente se tornam difíceis. Os exemplos são acima e o número de palavras Dyck mencionadas na pergunta.C ( z )A(z)C(z)

Pode-se empregar maquinaria complexa de análise, especificamente análise de singularidade, para obter assintóticos para os coeficientes; chavões incluem o método de Darboux e o método de ponto de sela. Estes são baseados no teorema do resíduo e na fórmula integral de Cauchy . Veja [6] para detalhes.


  1. Você pode fazer coisas semelhantes com exponencial , Dirichlet e algumas outras funções geradoras. O que funciona melhor depende da sequência em questão e, em particular, se você encontra os formulários fechados necessários.
  2. Por exemplo, na Folha de dicas do TCS ou [3].
  3. generatorfunctionology por H. Wilf (1994, 2ª ed.) - disponível para download gratuito
  4. Concrete Mathematics por RL Graham, DE Knuth e O. Patashnik (1994, 2ª ed.)
  5. Introdução à análise de algoritmos de R. Sedgewick e P. Flajolet (2ª edição, 2013) - disponível para download gratuito
  6. Analytic Combinatorics por P. Flajolet e R. Sedgewick (2009) - disponível para download gratuito

21

Teorema Mestre

O teorema mestre fornece assintóticos para as soluções das chamadas recorrências de dividir e conquistar , que são tais que dividem seu parâmetro em pedaços proporcionais (em vez de cortar constantes). Geralmente ocorrem ao analisar algoritmos de divisão e conquista (recursivos), daí o nome. O teorema é popular porque geralmente é incrivelmente fácil de aplicar. Por outro lado, ele só pode ser aplicado a recorrências do seguinte formulário:

T(n)=aT(nb)+f(n)

com . Existem três casosa1,b>1

  1. fO(nlogb(a)ε)

    para alguns ;ε>0

  2. fΘ(nlogbalogkn) ,

    para alguns ;k0

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

    para alguns eε>0

    af(nb)cf(n)

    para alguns e .n c<1n

que implicam os assintóticos

  1. TΘ(nlogba) ,
  2. TΘ(nlogbalogk+1n) e
  3. TΘ(f) ,

respectivamente. Observe que os casos base não são declarados ou usados ​​aqui; isso faz sentido, considerando que estamos apenas investigando o comportamento assintótico . Silenciosamente assumimos que são algumas constantes (o que mais elas podem ser. Quais constantes que não vemos são irrelevantes, todas elas desaparecem no .Θ

Exemplos

  1. Considere a recorrência

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

    Com e - notar que vemos que um caso aplica-se com . Portanto, .b = 3 log b a 1,26 ε = 0,25 T Θ ( n log 3 4 ) = Θ ( n 1,261 )f(n)=n,a=4b=3logba1.26ε=0.25TΘ(nlog34)=Θ(n1.261)

  2. Considere a recorrência

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

    Com e - notar que , vemos que caso dois aplica-se com . Portanto, .b = 2 log b a = 1 k = 0 T Θ ( n log n )f(n)=n,a=2b=2logba=1k=0TΘ(nlogn)

  3. Considere a recorrência

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

    Com e - notar que vemos que três caso aplica-se com e . Portanto, .b = 4 log b um 0,79 ε = 0,2 c = 1 T q ( n )f(n)=n,a=3b=4logba0.79ε=0.2c=1TΘ(n)

  4. Considere a recorrência

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

    Aqui temos , e- muitos exemplos padrão terão o polinômio , mas isso não é uma regra. Temos , e o caso três se aplica novamente. Neste caso, porém, podemos escolher qualquer e como para todos os . Daí .b = 4 f ( n ) = n ! f log b a = 2 ε c > 0 n ! Ω ( n k ) k T Θ ( n ! )a=16b=4f(n)=n!flogba=2εc>0n!Ω(nk)kTΘ(n!)

Leitura adicional

  • É bem possível que nenhum dos casos do teorema do mestre se aplique. Por exemplo, os subproblemas podem não ter tamanho igual ou ter uma forma mais complexa. Existem algumas extensões para o teorema do mestre, por exemplo Akra-Bazzi [1] ou Roura [2]. Existe até uma versão que funciona para recorrências discretas (ou seja, pisos e tetos são usados ​​nos parâmetros recursivos) e fornece resultados mais nítidos [3].

  • Geralmente, você precisa massagear a relação de recorrência real que você tem em forma antes de poder aplicar o teorema do mestre. As transformações comuns que preservam os assintóticos incluem a queda de pisos e tetos, bem como a suposição de . Tome cuidado para não quebrar as coisas aqui; consulte a seção 4.6 e esta pergunta para detalhes.n=bk


  1. Sobre a solução de equações de recorrência linear por M. Akra e L. Bazzi (1998)
  2. Um teorema mestre aprimorado para recorrências de dividir e conquistar por S. Roura (1997)
    Refere-se a outros teoremas mestre aprimorados.
  3. Um teorema mestre para dividir discretamente e conquistar recorrências de M. Drmota e W. Szpankowski (2011)
  4. Introdução aos Algoritmos por Cormen et al. (2009, 3ª edição)

Essa pode ser a pergunta estúpida, mas muitas vezes falho em manter o modelo mental quando a não é igual a b, não sei por que, mas por intuição sempre sinto que ambos devem ser os mesmos sempre, como em uma divisão em que dividimos o problema. duas metades iguais (quase) e com n / 2 instâncias cada. Além disso, se dividirmos o algoritmo em três partes iguais, as entradas também deverão ser divididas em três partes iguais, o que novamente torna aeb igual. Como posso quebrar essa intuição errada?
CodeYogi 2/16/16

17

Adivinha & Prove

Ou como eu gosto de chamá-lo, a técnica " ". Pode ser aplicado a todos os tipos de identidades. A ideia é simples:

Adivinhe a solução e prove sua correção.

Este é um método popular, sem dúvida porque geralmente requer alguma criatividade e / ou experiência (boa para se exibir), mas poucas mecânicas (parece elegante). A arte aqui é fazer palpites bons e educados; a prova é (no nosso caso) geralmente uma indução mais ou menos simples.

Quando aplicado a recorrências, "adivinhar" normalmente é feito por

  • expandindo a recorrência algumas vezes,
  • descobrir a âncora e
  • adivinhando o padrão para o intermediário (os ).

Exemplo Simples

s0=s1=s2=1sn=5sn3+6n2

Vamos expandir a definição de algumas vezes:sn

sn=5sn3+6=5(5sn6+6)+6=5(5(5sn9+6)+6)+6 =5(5(5(51n÷3 times+6)+6)+6)+6n÷3 times

Aqui, o padrão é fácil de identificar e nos leva à reivindicação:

sn=5n3+6i=0n315i=525n364

Agora provamos a identidade por indução. Para , podemos estabelecer a correção inserindo o respectivo valor. Supondo que a identidade seja válida para todos os para um arbitrário, mas fixo , calculamosn{0,1,2}nnn3

sn+3=5sn+6=5(525n364)+6=525n3+164=525n+3364

o que prova a identidade pelo poder da indução.

Se você tentar usá-lo em recorrências mais envolvidas, encontrará rapidamente a principal desvantagem desse método: pode ser difícil ver o padrão ou condensá-lo em uma boa forma fechada.

Assintóticos

É possível usar esse método também para assintóticos. Esteja ciente, no entanto, que você precisa adivinhar as constantes para os símbolos Landau, pois deve haver uma constante que estabeleça o limite para todos os , ou seja, o fator constante não pode mudar durante a indução.n

Considere, por exemplo, a recorrência do tempo de execução do Mergesort, simplificada para o caso de ¹:n=2k

T(1)=T(0)=0T(n)=2T(n/2)+n1n1

Nós acho que com constante , que é . Provamos isso por indução sobre ; o passo indutivo é assim:T(n)O(nlogn)c=1T(n)nlognk

T(n)=2T(n/2)+n12n2logn2+n1=nlognnlog2+n1<nlogn


  1. Para sequências naturais não decrescentes, toda subsequência infinita tem o mesmo crescimento assintótico que a sequência original.

15

O método Akra-Bazzi

O método Akra-Bazzi fornece assintóticos para recorrências da forma: Isso abrange as recorrências usuais de dividir e conquistar, mas também os casos em que a divisão é desigual. Os "termos de falsificação" podem atender a divisões que não são exatas, por exemplo. As condições de aplicabilidade são:

T(x)=1ikaiT(bix+hi(x))+g(x)for xx0
hi(x)
  • Existem casos base suficientes para que a recorrência aconteça
  • O e são todos constantesaibi
  • Para todos ,iai>0
  • Para todos os ,i0<bi<1
  • |g(x)|=O(xc) para alguma constante comocx
  • Para tudo ,i|hi(x)|=O(x/(logx)2)
  • x0 é uma constante

Observe que e como a função dente de serra está sempre entre 0 e 1, substituindo (ou conforme apropriado) satisfaz as condições do .bix=bix{bix}{u}=uubixbixhi

Encontre tal que: Então o comportamento assintótico de como é dado por: com "grande o suficiente", ou seja, existe para que para todos os .p

1ikaibip=1
T(x)x
T(x)=Θ(xp(1+x1xg(u)up+1du))
x1k1>0
(2)g(x/2)k1g(x)
x>x1

Exemplo A

Como exemplo, faça a recursão para , onde : As condições são satisfeitas, precisamos de : Por sorte, . Assim, temos: n5T(0)=T(1)=T(2)=T(3)=T(4)=17

T(n)=9T(n/5)+T(4n/5)+3nlogn
p
9(15)p+(45)p=1
p=2
T(n)=Θ(n2(1+3n3uloguu3du))=Θ(n2)

desde que com atendemos para todos os . Observe que, como a integral converge mesmo que usemos outras constantes, como , como limite inferior, é legal usá-las também; a diferença desaparece em .k112(1log2log3)(2)x31Θ

Exemplo B

Outro exemplo é o seguinte para : Temos , verifique. Temos que existe um único , , que faz check-out. Supondo que o seja realmente e / ou , o implícito também faz check-out. Então precisamos: Assim, , e: n2

T(n)=4T(n/2)+n2/lgn
g(n)=n2/lnn=O(n2)a1=4b1=1/2n/2n/2n/2hi(n)
a1b1p=4(1/2)p=1
p=2
T(n)=Θ(n2(1+2nu2duu3lnu))=Θ(n2(1+2nduulnu))=Θ(n2lnlnn)
Aplicamos um truque semelhante ao descrito acima para o limite inferior da integral, apenas que usamos porque a integral não converge para .21

(A ajuda do maxima na álgebra é reconhecida com gratidão)


1
Eu verifiquei o papel original. Eles têm uma restrição técnica no limite inferior da integral; sua versão (citando a pesquisa de Mehlhorn?) exige explicitamente que a integral converja. Como acho que a condição original é mais fácil de verificar, alterei a declaração e os exemplos de acordo. Verifique.
Raphael

1
Além disso, o artigo original não fornece a versão com o ; isso é retirado do manuscrito de Leighton? Você tem uma referência revisada por pares para isso? Devemos passar para a versão dada no artigo de 1998 de Akra & Bazzi? hi
Raphael

1
Eu tropecei no que parece ser uma inconsistência no teorema . Talvez você saiba a resposta?
Raphael

11

Summations

Muitas vezes, encontramos uma recorrência da forma onde é monótono. Nesse caso, podemos expandir e portanto, dado um valor inicial , para estimar precisamos estimar a soma .

T(n)=T(n1)+f(n),
f(n)
T(n)=T(c)+m=c+1nf(m),
T(c)T(n)f(c+1)++f(m)

não decrescentef(n)

Quando é monótono e não diminui, temos os limites óbvios Estes limites são melhor-possível no sentido de que eles são apertados para algumas funções: o limite superior para as funções constantes, e o limite inferior para as funções da etapa ( para e para ). No entanto, em muitos casos, essas estimativas não são muito úteis. Por exemplo, quando , o limite inferior é e o limite superior é , portanto, eles estão bastante distantes.f(n)

f(n)m=c+1nf(m)(nc)f(n).
f(m)=1mnf(m)=0m<nf(m)=mn(nc)n

Integração

Uma estimativa melhor é dada pela integração: Para , isso fornece o valor correto da soma para termos de ordem inferior: Quando , podemos calcular a soma explicitamente, mas em muitos casos a computação explícita é difícil. Por exemplo, quando a antiderivada de é , e assim

cnf(x)dxm=c+1nf(m)c+1n+1f(x)dx.
f(m)=m
12n212c2m=c+1nm12(n+1)212(c+1)2.
f(m)=mf(m)=mlogmf(1/2)x2logx(1/4)x2
m=c+1nmlogm=12n2logn±Θ(n2).

A fórmula de Euler-Maclaurin fornece melhores estimativas. Essa fórmula pode ser usada, por exemplo, para provar formas fortes da fórmula de Stirling, estimando a soma .logn!=m=1nlogm

não crescentef(n)

Em alguns casos, é monótono e não aumenta. As estimativas triviais tornam-se e as estimativas integrais Como exemplo, para , usando , obtemos f(n)

f(1)m=c+1nf(m)(nc)f(1),
c+1n+1f(x)dxm=c+1nf(m)cnf(x)dx.
f(m)=1/mf(m)=logm
m=c+1n1m=logn±Θ(1).

Essa resposta lida menos com a solução de recorrências, mas com a estimativa de somas (que podem ser úteis para solucionar recorrências); a técnica é a dupla das somas de Riemann . Também deve funcionar com outras formas, como para a constante ? T(nd)d
Raphael

Certo, também pode ser resolvido dessa maneira. T(n)=cT(nd)+f(n)
Yuval Filmus

9

Sedgewick e Flajolet fizeram um extenso trabalho em combinatória analítica , o que permite que as recorrências sejam resolvidas assintoticamente usando uma combinação de funções geradoras e análises complexas. Seu trabalho permite que muitas recorrências sejam resolvidas automaticamente e foi implementado em alguns sistemas de álgebra computacional.

Este livro sobre o assunto foi escrito por Flajolet e Sedgewick e é uma excelente referência. Uma exposição um pouco mais simples, voltada para aplicações na análise de algoritmos, é este texto de Sedgewick e Flajolet.

Espero que isto ajude!


4
Esta é uma boa referência, mas queremos coletar métodos de uma maneira acessível. Você pode apresentar um método específico em detalhes?
Raphael

9

Pode haver momentos em que você se depara com uma estranha recorrência como esta: Se você for como eu, perceberá que não pode usar o Teorema dos Mestres e poderá pensar: " hmmm ... talvez uma análise de árvore de recorrência possa funcionar. " Então você perceberia que a árvore começa a ficar nojenta muito rápido. Após algumas pesquisas na internet, você vê que o método Akra-Bazzi funcionará! Então você começa a investigar e percebe que não quer fazer todas as contas. Se você é como eu até este momento, ficará animado em saber que há uma maneira mais fácil.

T(n)={cn<72T(n5)+4T(n7)+cnn7


O Teorema da Divisão Desigual

Deixe- e ser constantes positivas.ck

Então, sejam constantes positivas, de modo que .{a1,a2,,ak}1kai<1

Também devemos ter uma recorrência do formulário (como nosso exemplo acima):

T(n)c0<n<max{a11,a21,,ak1}T(n)cn+T(a1n)+T(a2n)+T(akn)nmax{a11,a21,,ak1}

Afirmação

Então eu reivindico onde é uma constante (por exemplo, assintoticamente linear) e:T(n)bnb

b=c1(1kai)

Prova por Indução

Base :n<max{a11,a21,,ak1}T(n)c<b<bn

Indução : Assuma verdadeiro para qualquer , então temosn<n

T(n)cn+T(a1n)+T(a2n)++T(akn)cn+ba1n+ba2n++bakncn+ba1n+ba2n++bakn=cn+bn1kai=cncn1kai1(1kai)+cn1kai1(1kai)=cn1(1kai)=bn

Então temos .T(n)bnT(n)=O(n)

Exemplo

T(n)={cn<72T(n5)+4T(n7)+cnn7
Primeiro, verificamos que os coeficientes dentro das chamadas recursivas somam menos de um:
1>1kai=15+15+17+17+17+17=25+47=3435

Em seguida, verificamos que o caso base é menor que o máximo dos inversos dos coeficientes:

n<max{a11,a21,,ak1}=max{5,5,7,7,7,7}=7

Com essas condições atendidas, conhecemos onde é uma constante igual a: Portanto, temos: T(n)bnb

b=c1(1kai)=c13435=35c
T(n)35cnT(n)cnT(n)=Θ(n)


O desigual teorema de divisão parte 2

Da mesma forma, podemos provar que há um limite para quando . A prova seguirá muito do mesmo formato:1k=1

Deixe- e ser constantes positivas tais que .ckk>1

Então, sejam constantes positivas, de modo que .{a1,a2,,ak}1kai=1

Também devemos ter uma recorrência do formulário (como nosso exemplo acima):

T(n)c0<n<max{a11,a21,,ak1}T(n)cn+T(a1n)+T(a2n)+T(akn)nmax{a11,a21,,ak1}

Afirmação

Então eu afirmo (escolhemos base porque será o fator de ramificação da árvore de recursão) em que e são constantes (por exemplo, linearmente assintoticamente lineares) ) de tal modo que:T(n)αnlogkn+βnlogkkαβ

β=c
e
α=c1kailogkai1

Prova por Indução

Base :n<max{a11,a21,,ak1}T(n)c=β<αnlogkn+βn

Indução : Assuma verdadeiro para qualquer , então temosn<n

T(n)cn+T(a1n)+T(a2n)++T(akn)cn+1k(αainlogkain+βain)=cn+αn1k(ailogkain)+βn1kai=cn+αn1k(ailogknai1)+βn=cn+αn1k(ai(logknlogkai1))+βn=cn+αn1kailogknαn1kailogkai1+βn=αn1kailogkn+βn=αnlogkn+βn

Então temos .T(n)αnlogkn+βnT(n)=O(nlogn)

Exemplo

Vamos modificar o exemplo anterior que usamos um pouquinho:

T(n)={cn<352T(n5)+4T(n7)+T(n35)+cnn35

Primeiro, verificamos que os coeficientes das chamadas recursivas somam um:

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

Em seguida, verificamos que o caso base é menor que o máximo dos inversos dos coeficientes:

n<max{a11,a21,,ak1}=max{5,5,7,7,7,7,35}=35

Com estas condições atendidas, nós sabemos onde e é uma constante igual a: Portanto, temos: T(n)αnlogn+βnβ=cα

b=c1kailogkai1=c2log755+4log777+log735351.048c
T(n)1.048cnlog7n+cnT(n)=O(nlogn)


6

Depois de verificar este post novamente, estou surpreso que ainda não esteja aqui.

Transformação de Domínio / Alteração de Variáveis

Ao lidar com recorrências, às vezes é útil poder alterar seu domínio se não estiver claro o quão profunda será a pilha de recursão.

Por exemplo, considere a seguinte recorrência:

T(n)=T(22loglogn)+logloglogn

Como poderíamos resolver isso? Poderíamos expandir a série, mas eu prometo que isso ficará nojento muito rápido. Em vez disso, vamos considerar como nossa entrada muda a cada chamada.

Primeiro temos:

  1. n então
  2. 22loglogn , em seguida,
  3. 22loglog(22loglogn) e assim por diante.

O objetivo de uma transformação de domínio agora será transformar nossa recorrência em um equivalente, de modo que, em vez das transições acima, simplesmente tenhamos .S(k)k,k1,k2,

Por exemplo, se deixarmos , é o que obtemos para a recorrência acima: Então podemos simplesmente reescrevê-lo como: Então tudo o que você precisa fazer é converter volta em para obter: n=2222k

T(2222k)=T(22loglog2222k)+logloglog(2222k)=T(2222k1)+2k
T(k)=T(k1)+2k=i=1k2k=2k+11
kn
T(n)=2(loglogloglogn)+11=O(logloglogn)


Com este exemplo, agora podemos ver nosso objetivo.

Assuma Para alguma constante e funções e .

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

Estamos agora a tentar encontrar alguma função e de tal forma que g(k)=nf(g(k))=g(k1)

T(g(k))=aT(f(g(k)))+h(g(k))=aT(g(k1))+h(g(k))

De maneira mais geral, queremos onde é a aplicação repetida de em , vezes. (por exemplo, ). Isso permitirá que atue como a função "iterativa". Onde, na profundidade da recursão, o trabalho realizado é simplesmente .f(i)(n)=g(ki)f(i)(n)fnif(2)(n)=f(f(n))g(k)ih(g(ki))

Em seguida, pode converter facilmente esta a de modo a que , em seguida, que só tem que se preocupar somando para todos os até um determinado caso base. Ou seja, S(k)=T(g(k))

S(k)=aS(k1)+h(g(k))
h(g(k))k
S(k)=i=g1(1)kakih(g(i))

Se podemos determinar para alguma função forma fechada , então podemos determinar como S(k)=γ(k)γT(n)

T(n)=γ(g1(n))

Então, usamos isso para obter um limite em através de um dos outros métodos acima. Obviamente, você pode modificar esse método um pouco de acordo com suas especificações, mas, em geral, está tentando encontrar uma função iterativa para transformar em uma simples recursão.T(n)g(k)T(n)

Não conheço uma maneira exata de determinar neste momento, mas continuarei pensando sobre isso e atualizarei se ficar mais claro (ou se algum comentarista tiver algumas dicas!). Eu encontrei principalmente minhas funções por tentativa e erro no passado (veja aqui , aqui , aqui e aqui para exemplos).g(k)g(k)


1
Existem restrições quanto a , e / ou ? Estou perguntando especificamente, porque truques semelhantes de substituição de folclore às vezes falham quando a notação Landau está envolvida, o que me preocupa se realmente sempre é a resposta correta. fghγg1
Raphael

@ Rafael, esta é a parte que eu não tenho certeza. Acho que precisamos garantir algumas coisas para estabelecer a equivalência. 1) A profundidade da recursão é a mesma, isso pode ser garantido por e . 2) o trabalho realizado em cada nível de recursão é o mesmo, que acredito ser imposto por e depois . A idéia básica disso é simplesmente transformar em uma soma, ou seja, . A conversão de para também não tenho 100% de certeza (não tenho uma prova), mas não consigo ver por que seria incorreta. Pensamentos? f(g(k))=g(k1)g(k)=ng(k)=nh(g(k))=h(n)T(n)i=ckh(g(i))γ(k)γ(g1(n))
ryan

@ Rafael, você também pode considerar o caso, em que vez de , convertendo para deve ser mais direto frente. Fácil de provar, acho que se você apenas mostrar equivalência no somatório. Você provavelmente enfrentaria alguns problemas engraçados com a notação Landau aqui, mas se você deixasse Landau fora dela e apenas se mantivesse com uma igualdade precisa, acho que tudo bem. S(k)=γ(k)ΘT(n)=γ(g1(n))
ryan

@ Rafael Eu editei para usar apenas igualdade, então a notação landau não deve atrapalhar isso. Também generalizou um pouco mais. Que você pode generalizar um pouco mais para usar uma função vez da constante . Então, em vez de na soma, basta ter um aplicativo de . β(n)aakiβ(g(i))
ryan

5

Há mais uma abordagem que funciona para relações de recorrência simples: peça ao Wolfram Alpha para resolver a recorrência para você.

Por exemplo, tente digitar f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2)Wolfram Alpha. Você obterá uma solução, com um link para os números de Fibonacci. Ou tente f(1)=1, f(n)=f(n-1)+nou f(1)=1, f(n)=2*f(n-1)+3*nou f(n)=f(n-1) + 2 f(n-2), f(1)=1, f(2)=3para outros exemplos. No entanto, esteja avisado: o Wolfram Alpha pode resolver algumas recorrências muito simples, mas se desfaz das mais complexas.

Essa abordagem evita a necessidade de qualquer pensamento, que pode ser visto como um bug ou um recurso.


3
Eu não acho que o objectivo deste site seria explicar como álgebra computacional faz coisas como esta, não para defender seu uso cego. Mas as ferramentas são úteis, tão úteis que, provavelmente, você deve sempre experimentá-las antes de "desperdiçar" tempo (na "prática").
Raphael

Pela minha própria experiência, tentar usar álgebra computacional sem ter noção do que é "difícil" ou "fácil" não leva muito longe. Especialmente na análise de algoritmos, algumas massagens podem ser necessárias. Não sei como você faz isso sem saber como resolver as recorrências. (. Quanto ao objectivo deste site, existem múltiplos pontos de vista Fato: até agora "isto é útil para alguém " não era suficiente para justificar um post.)
Raphael

5

O caso 2 do teorema mestre, como geralmente afirmado, lida apenas com recorrências da forma na qual para . O teorema a seguir, retirado de uma apostila de Jeffrey Leon, fornece a resposta para negativo :T(n)=aT(n/b)+f(n)f(n)=Θ(nlogablogkn)k0k

Considere a recorrência com um caso base apropriado.T(n)=aT(n/b)+f(n)

  1. Se para então .f(n)=O(nlogbalogc1n)c<0T(n)=Θ(nlogba)

  2. Se para então .f(n)=Θ(nlogbalogc1n)c=0T(n)=Θ(nlogbaloglogn)

  3. Se para então )f(n)=Θ(nlogbalogc1n)c>0T(n)=Θ(nlogbalogcn

A prova usa o método de substituição repetida, como esboçamos agora. Suponha que e . Então, para uma potência de , Agora vamos considerar os casos um por um. Quando , a série converge e, portanto, . Quando , a soma é a soma harmônica e, portanto,f(n)=nlogbalogbc1nT(1)=0nb

T(n)=i=0logbn1ai(nbi)logbalogbc1(nbi)=i=0logbn1nlogba(logbni)c1=nlogbaj=1logbnjc1.
c<0j=0jc1T(n)=Θ(nlogba)c=0Hlogbn=log(logbn)+O(1)T(n)=Θ(nlogbaloglogn) . Quando , podemos aproximar a soma usando uma integral: e portanto, .c>0
j=1logbn0logbnxc1dx=xcc|0logbn=logbcnc,
T(n)=Θ(nlogbalogcn)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.