Risolvere o approssimare relazioni di ricorrenza per sequenze di numeri


90

Nell'informatica, spesso dobbiamo risolvere le relazioni di ricorrenza , ovvero trovare una forma chiusa per una sequenza di numeri definita ricorsivamente. Quando si considerano i runtime, siamo spesso interessati principalmente alla crescita asintotica della sequenza .

Ne sono esempi

  1. Il tempo di esecuzione di una funzione ricorsiva della coda che scende da 0 a n cui corpo impiega il tempo f(n) :

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

  2. La sequenza di Fibonacci :

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

  3. Il numero di parole Dyck con n coppie di parentesi:

    C0=1Cn+1=i=0nCiCni

  4. La ricorrenza del runtime di mergesort su elenchi di lunghezza n :

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

Quali sono i metodi per risolvere le relazioni di ricorrenza? Noi stiamo cercando

  • metodi generali e
  • metodi per una sottoclasse significativa

così come

  • metodi che producono soluzioni precise e
  • metodi che forniscono (limitano) la crescita asintotica.

Questo dovrebbe diventare una domanda di riferimento. Si prega di inviare una risposta per metodo e fornire una descrizione generale e un esempio illustrativo.


9
Queste note possono essere utili. (Ma no, non li trascriverò in risposte.)
JeffE,

Risposte:


35

Conversione della cronologia completa in cronologia limitata

Questo è un primo passo per risolvere le ricorrenze in cui il valore di qualsiasi numero intero dipende dai valori di tutti i numeri più piccoli. Considera, ad esempio, la ricorrenza che emerge dall'analisi diquicksort randomizzato. (Qui,kè il rango del perno scelto casualmente.) Per qualsiasi numero interon, il valore diT(n)dipende da tuttoT(k)conk<n. Le ricorrenze di questo modulo sono chiamatericorrenze dellastoria completa.

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

Per risolvere questa ricorrenza, possiamo trasformarla in una ricorrenza storica limitata , dove dipende solo da un numero costante di valori precedenti. Ma prima, aiuta a semplificare un po 'la ricorrenza, a raccogliere termini comuni ed eliminare fastidiose frazioni. n T ( n )T(n) Ora per convertire in una ricorrenza a storia limitata, annotiamo la ricorrenza per i terminiT(n-1), sottraggiamo e regather: ( 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

Ora se definiamo e sostituiamo la frazione 2 n - 1t(n)=T(n)/(n+1) con la forma asintotica più sempliceΘ(1/n), otteniamo la ricorrenza molto più semplice t(n)=Θ(1/n)+t(n-1). Espandere questa ricorrenza in una somma ci dà immediatamentet(n)=Θ(Hn)=Θ(logn), dove2n1n(n+1)Θ(1/n)

t(n)=Θ(1/n)+t(n1).
t(n)=Θ(Hn)=Θ(logn) è il n esimonumero armonico. Concludiamo che T ( n ) = Θ ( n log n ) .HnnT(n)=Θ(nlogn)

1
Se vuoi la soluzione precisa per , anche questo non è difficile (qui), se un po 'noioso; otteniamo T ( n ) = 2 ( n + 1 ) H n + ( T ( 0 ) - 3 ) n + T ( 0 ) . In realtà, n i = 1 Θ ( 1 / i ) = Θ ( H n ) mi confonde, quindi preferisco la variante precisa. fastidiosoTT(n)=2(n+1)Hn+(T(0)3)n+T(0)i=1nΘ(1/i)=Θ(Hn)somme di termini Landau .
Raffaello

In realtà, è sufficiente osservare (induttivamente) che , dove t ( n ) = 1 / n + t ( n - 1 ) . In effetti, ho già usato quel trucco all'inizio, quando ho sostituito il tempo Θ ( n ) per partizionare un array con il più semplice nT(n)/(n+1)=Θ(t(n))t(n)=1/n+t(n1)Θ(n)n. Questo è un abuso di notazione assolutamente standard.
JeffE,

28

Funzioni di generazione

Ogni serie di numeri corrisponde a una funzione generatrice . Spesso si può ottenere comodamente da una ricorrenza per spennare i suoi coefficienti - gli elementi della serie.

Questa risposta include la risposta generale con un esempio completo, una scorciatoia per un caso speciale e alcune note sull'uso di questo metodo per ottenere asintotici (anche se non è possibile ottenere il risultato preciso).

Il metodo

Consenti a una serie di numeri. Quindi, la serie di potenze formali(an)nN

A(z)=n=0anzn

è la normale funzione generatrice ¹ di . I coefficienti nell'espansione in serie di uguali alla sequenza, ovvero . Ad esempio, la normale funzione generatrice dei famosi numeri catalani è A ( z ) [ z n ] A ( z ) = a n C n(an)nNA(z)[zn]A(z)=an Cn

C(z)=114z2z .

La definizione di è anche la nostra risposta per risolvere una ricorrenza. Funziona meglio per le ricorrenze lineari, quindi supponiamo per semplicità una ricorrenza della formaA

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

per alcune fissa e una funzione indipendente da ogni . Ora inseriamo semplicemente sia le ancore che la parte ricorsiva nell'ansatz, cioè f ( n ) : NN a ib1,,bkRf(n):NNai

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

Usando la meccanica della manipolazione della somma, le proprietà delle serie di potenze formali e le identità conosciute ², l'ultimo lato destro deve essere portato in forme chiuse, in genere in termini di . L'equazione risultante può (spesso) essere risolta per . L'espansione in serie del risultato (che può essere facilmente ottenuta, conosciuta o altrimenti accessibile) è essenzialmente la soluzione.A ( z )A(z)A(z)

Buone introduzioni si possono trovare nel libro di Wilf [3] e in GKP [4]. Il materiale avanzato è stato raccolto da Flajolet e Sedgewick [5].

Esempio

Tener conto di

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

Calcoliamo:

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

Questo risolve

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

Ora possiamo finalmente leggere

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

Una volta che ti ci abitui , noti che è tutto abbastanza meccanico. In effetti, l'algebra del computer può fare tutte queste cose per te in molti casi. Il bello è che rimane (più o meno) quel meccanico anche se la ricorrenza è più complessa. Vedi qui per un esempio più coinvolto, meno meccanico.

Si noti inoltre che le tecniche generali funzionano anche se gli oggetti cercati sono numeri complessi o addirittura polinomi.

Una scorciatoia

Per ricorrenze lineari e omogenee, vale a dire tale della forma

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

quanto sopra passa esattamente nello stesso modo, ogni volta. Eseguendo simbolicamente il calcolo sopra, troviamo il seguente lemma . Permettere

zkb1zk1b2zk2bk

essere il polinomio caratteristico (della ricorrenza). Inoltre, gli zeri (distinti in coppia) di detto polinomio con molteplicità . Quindi, il coefficiente desiderato è dato dar iλ1,,λlri

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

con sconosciuto . Poiché il polinomio caratteristico ha grado , ci sono esattamente zeri (complessi), cioè la somma in . Pertanto, i coefficienti mancanti possono essere determinati risolvendo il sistema di equazioni lineari con equazioni ottenute mediante l'equazione sopra la formula con qualsiasi di (ad es. Le ancore). k k r i k k k a nbi,jkkrikkkan

asintotica

Arrivare a un modulo chiuso per è di solito la parte facile. Esprimendolo nel generare funzioni sappiamo che i coefficienti di (come abbiamo fatto nell'esempio) diventano rapidamente difficili, però. Esempi sono dall'alto e quello per il numero di parole Dyck menzionate nella domanda.C ( z )A(z)C(z)

Si possono impiegare macchinari di analisi complessi, in particolare analisi di singolarità, al fine di ottenere asintotici per i coefficienti; le parole d'ordine includono il metodo di Darboux e il metodo del punto a sella. Questi sono basati sul teorema dei residui e sulla formula integrale di Cauchy . Vedi [6] per i dettagli.


  1. Puoi fare cose simili con esponenziale , Dirichlet e alcune altre funzioni di generazione. Quale funziona meglio dipende dalla sequenza a portata di mano e in particolare se trovi le forme chiuse necessarie.
  2. Ad esempio dal TCS Cheat Sheet o [3].
  3. generatore di funzionalità di H. Wilf (1994, 2a ed.) - disponibile per il download gratuito
  4. Concrete Mathematics di RL Graham, DE Knuth e O. Patashnik (1994, 2a edizione)
  5. Introduzione all'analisi degli algoritmi di R. Sedgewick e P. Flajolet (2a edizione, 2013) - disponibile per il download gratuito
  6. Analytic Combinatorics di P. Flajolet e R. Sedgewick (2009) - disponibile per il download gratuito

21

Teorema del maestro

Il teorema del Maestro fornisce asintotici per le soluzioni delle cosiddette ricorrenze di divisione e conquista , che è tale da dividere il loro parametro in blocchi proporzionati (anziché tagliare costanti). In genere si verificano quando si analizzano gli algoritmi di divisione e conquista (ricorsivi), da cui il nome. Il teorema è popolare perché spesso è incredibilmente facile da applicare. D'altra parte, può essere applicato solo alle ricorrenze del seguente modulo:

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

con . Vi sono tre casia1,b>1

  1. fO(nlogb(a)ε)

    per qualche ;ε>0

  2. fΘ(nlogbalogkn) ,

    per alcuni ;k0

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

    per alcuni eε>0

    af(nb)cf(n)

    per alcuni e .n c<1n

che implicano gli asintotici

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

rispettivamente. Si noti che i casi di base non sono indicati o utilizzati qui; ha senso, considerando che stiamo solo studiando il comportamento asintotico . Supponiamo in silenzio che siano alcune costanti (cos'altro possono essere. Quali costanti non vediamo è irrilevante, svaniscono tutte in .Θ

Esempi

  1. Considera la ricorrenza

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

    Con e - notare che vediamo che caso si applica con . Pertanto, .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. Considera la ricorrenza

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

    Con e - notare che si vede che due caso vale per . Pertanto, .b = 2 log b a = 1 k = 0 T Θ ( n log n )f(n)=n,a=2b=2logba=1k=0TΘ(nlogn)

  3. Considera la ricorrenza

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

    Con e - notare che vediamo questo caso tre dicasi e . Pertanto, .b = 4 log b a 0,79 ε = 0,2 c = 1 T Θ ( n )f(n)=n,a=3b=4logba0.79ε=0.2c=1TΘ(n)

  4. Considera la ricorrenza

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

    Qui abbiamo , e- molti esempi standard avranno polinomio , ma questa non è una regola. Abbiamo e il terzo caso si applica nuovamente. In questo caso, però, siamo in grado di scegliere qualsiasi e come per tutti i . Quindi .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!)

Ulteriori letture

  • È possibile che nessuno dei casi del teorema del Maestro si applichi. Ad esempio, i sottoproblemi potrebbero non avere le stesse dimensioni o avere una forma più complessa. Esistono alcune estensioni al teorema del Maestro, ad esempio Akra-Bazzi [1] o Roura [2]. Esiste anche una versione che funziona per ricorrenze discrete (ovvero i pavimenti e i ceils vengono utilizzati sui parametri ricorsivi) e fornisce risultati più nitidi [3].

  • Di solito, devi massaggiare l'attuale relazione di ricorrenza che hai in forma prima di poter applicare il teorema del Maestro. Le trasformazioni comuni che preservano gli asintotici includono la caduta di pavimenti e ceppi e l'assunzione di . Fai attenzione a non rompere le cose qui; fare riferimento a [4] sezione 4.6 e questa domanda per i dettagli.n=bk


  1. On the Solution of Linear Recurrence Equations di M. Akra e L. Bazzi (1998)
  2. Un teorema principale migliorato per le recidive di divisione e conquista di S. Roura (1997)
    Si riferisce ad altri teoremi principali migliorati.
  3. Un teorema maestro per la divisione discreta e la conquista delle ricorrenze di M. Drmota e W. Szpankowski (2011)
  4. Introduzione agli algoritmi di Cormen et al. (2009, 3a edizione)

Questa potrebbe essere la domanda stupida ma spesso non riesco a mantenere il modello mentale quando a non è uguale a b, non so perché ma per intuizione sento sempre che entrambi devono essere sempre gli stessi, come in fusione dividiamo il problema in due metà (quasi) uguali e con n / 2 istanze ciascuna. Inoltre, se dividiamo l'algoritmo in tre parti uguali, anche gli input dovrebbero essere divisi in tre parti uguali, il che rende di nuovo aeb. Come posso rompere questa intuizione sbagliata?
CodeYogi,

17

Indovina e prova

O come mi piace chiamarlo, la " tecnica ". Può essere applicato a tutti i tipi di identità. L'idea è semplice:

Indovina la soluzione e dimostra la sua correttezza.

Questo è un metodo popolare, probabilmente perché di solito richiede un po 'di creatività e / o esperienza (buono per mettersi in mostra) ma pochi meccanici (sembra elegante). L'arte qui è fare ipotesi valide e colte; la prova è (nel nostro caso) di solito un'induzione più o meno semplice.

Quando viene applicato alle ricorrenze, "indovinare" viene in genere eseguito da

  • espandendo la ricorrenza un paio di volte,
  • capire l' ancora e
  • indovinando il modello per l'intermedio (i ).

Esempio semplice

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

la definizione di alcune volte: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

Qui, il modello è facile da individuare e ci porta all'affermazione:

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

Ora dimostriamo l'identità per induzione. Per , possiamo stabilire la correttezza inserendo il rispettivo valore. Supponendo che l'identità valga per tutto per un arbitrario ma fisso , calcoliamon n n 3n{0,1,2}nnn3

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

che dimostra l'identità con il potere dell'induzione.

Se provi a usarlo su ricorrenze più coinvolte, incontri rapidamente il principale svantaggio di questo metodo: può essere difficile vedere lo schema o condensarlo in una bella forma chiusa.

asintotica

È possibile utilizzare questo metodo anche per gli asintotici. Tieni presente, tuttavia, che devi indovinare le costanti per i simboli di Landau in quanto deve esserci una costante che stabilisce il limite per tutti , cioè il fattore costante non può cambiare durante l'induzione.n

Considera, ad esempio, la ricorrenza del runtime di Mergesort, semplificata per il caso di ¹:n=2k

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

Noi indoviniamo che con la costante , che è . Lo dimostriamo per induzione su ; il passaggio induttivo è simile al seguente:T(n)O(nlogn)c=1T(n)nlognk

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


  1. Per sequenze non decrescenti di naturali, ogni sottosequenza infinita ha la stessa crescita asintotica della sequenza originale.

15

Il metodo Akra-Bazzi

Il metodo Akra-Bazzi fornisce asintotici per le ricorrenze del modulo: Questo copre le solite ricorrenze di divisione e conquista, ma anche i casi in cui la divisione è disuguale. I "termini fudge" possono soddisfare divisioni che non risultano esatte, per esempio. Le condizioni per l'applicabilità sono:

T(x)=1ikaiT(bix+hi(x))+g(x)for xx0
hi(x)
  • Ci sono abbastanza casi base per far ripartire la ricorrenza
  • e sono tutte le costantiaibi
  • Per tutti ,iai>0
  • Per tutti ,i0<bi<1
  • |g(x)|=O(xc) per una costante comecx
  • Per tutti ,i|hi(x)|=O(x/(logx)2)
  • x0 è una costante

Nota che e poiché la funzione dente di sega è sempre tra 0 e 1, sostituendo (o come appropriato) soddisfa le condizioni su .bix=bix{bix}{u}=uubixbixhi

Trova tale che: Quindi il comportamento asintotico di come è dato da: con "abbastanza grande", cioè c'è modo che per tutti .p

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

Esempio A

Ad esempio, prendi la ricorsione per , dove : Le condizioni sono soddisfatte, abbiamo bisogno di : Per fortuna, . Quindi abbiamo: 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)

poiché con soddisfiamo per tutti . Nota che poiché l'integrale converge anche se usiamo altre costanti, come , come limite inferiore, è legale usare anche quelle; la differenza svanisce in .k112(1log2log3)(2)x31Θ

Esempio B

Un altro esempio è il seguente per : Abbiamo , controlla. Abbiamo che esiste un singolo , , che verifica. Supponendo che sia davvero e / o , anche l' implicito controlla. Quindi abbiamo bisogno di: Quindi 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)
Applichiamo un trucco simile come sopra a il limite inferiore dell'integrale, solo che usiamo perché l'integrale non converge per .21

(L'aiuto di maxima con l'algebra è riconosciuto con gratitudine)


1
Ho controllato il documento originale. Hanno una limitazione tecnica sul limite inferiore dell'integrale; la tua versione (citando il sondaggio di Mehlhorn?) richiede esplicitamente che l'integrale converga. Dal momento che penso che la condizione originale sia più facile da controllare, ho modificato la dichiarazione e gli esempi di conseguenza, per favore controlla.
Raffaello

1
Inoltre, il documento originale non fornisce la versione con ; è preso dal manoscritto di Leighton? Hai un riferimento peer-reviewed per questo? Dovremmo passare alla versione fornita nell'articolo del 1998 di Akra & Bazzi? hi
Raffaello

1
Mi sono imbattuto in quella che sembra essere un'incoerenza nel teorema . Forse conosci la risposta?
Raffaello

11

sommatorie

Spesso si incontra una ricorrenza della forma dove è monotono. In questo caso, possiamo espandere e quindi dato un valore iniziale , al fine di stimare dobbiamo stimare la somma .

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)

non decrescentef(n)

Quando è monotono non decrescente, abbiamo i limiti ovvi Questi limiti sono i migliori possibili nel senso che sono stretti per alcune funzioni: il limite superiore per funzioni costanti e il limite inferiore per funzioni a gradino ( per e per ). Tuttavia, in molti casi queste stime non sono molto utili. Ad esempio, quando , il limite inferiore è e il limite superiore è , quindi sono abbastanza distanti.f(n)

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

Integrazione

Una stima migliore è data dall'integrazione: Per , questo fornisce il valore corretto della somma fino a termini di ordine inferiore: Quando possiamo calcolare esplicitamente la somma, ma in molti casi il calcolo esplicito è difficile. Ad esempio, quando l'antiderivativo di è , e quindi

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).

La formula di Eulero-Maclaurina fornisce stime migliori. Questa formula può essere usata, ad esempio, per dimostrare forme forti della formula di Stirling, stimando la somma .logn!=m=1nlogm

Non crescentef(n)

In alcuni casi, è monotono non crescente. Le stime banali diventano e le stime integrali Ad esempio, per , usando otteniamo f(n)

f(1)m=c+1nf(m)(nc)f(1),