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),
c+1n+1f(x)dxm=c+1nf(m)cnf(x)dx.
f(m)=1/mf(m)=logm
m=c+1n1m=logn±Θ(1).

Questa risposta si occupa meno di risolvere le ricorrenze ma piuttosto di stimare le somme (che possono essere utili per risolvere le ricorrenze); la tecnica è il doppio delle somme di Riemann . Dovrebbe funzionare anche con altre forme come per costante ? T(nd)d
Raffaello

A destra, può anche essere risolto in questo modo. T(n)=cT(nd)+f(n)
Yuval Filmus,

9

Sedgewick e Flajolet hanno svolto un ampio lavoro di combinatoria analitica , che consente di risolvere asintoticamente le ricorrenze utilizzando una combinazione di funzioni generatrici e analisi complesse. Il loro lavoro consente di risolvere automaticamente molte ricorrenze ed è stato implementato in alcuni sistemi di algebra computerizzata.

Questo libro di testo sull'argomento è stato scritto da Flajolet e Sedgewick ed è un riferimento eccellente. Un'esposizione in qualche modo più semplice, orientata verso applicazioni all'analisi algoritmica, è questo testo di Sedgewick e Flajolet.

Spero che sia di aiuto!


4
Questo è un bel riferimento, ma vogliamo raccogliere metodi in modo accessibile. Puoi presentare un particolare metodo in dettaglio?
Raffaello

9

Ci possono essere momenti in cui ti imbatti in una strana ricorrenza come questa: Se sei come me, ti renderai conto che non puoi usare il Teorema del Maestro e poi potresti pensare " hmmm ... forse potrebbe funzionare un'analisi dell'albero di ricorrenza ". Quindi ti accorgeresti che l'albero inizia a ingrassare molto velocemente. Dopo alcune ricerche su Internet vedi che il metodo Akra-Bazzi funzionerà! Quindi in realtà inizi a esaminarlo e ti rendi conto che non vuoi davvero fare tutta la matematica. Se sei stato come me fino a questo punto, sarai entusiasta di sapere che c'è un modo più semplice.

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


Teorema della divisione irregolare Parte 1

Sia e costanti positive.ck

Quindi lascia che siano costanti positive tali che .{a1,a2,,ak}1kai<1

Dobbiamo anche ricorrere al modulo (come nel nostro esempio sopra):

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

Richiesta

Quindi rivendico dove è una costante (ad es. Asintoticamente lineare) e:T(n)bnb

b=c1(1kai)

Prova per induzione

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

Induzione : supponiamo vero per qualsiasi , quindi abbiamon<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

Quindi abbiamo .T(n)bnT(n)=O(n)

Esempio

T(n)={cn<72T(n5)+4T(n7)+cnn7
Per prima cosa verifichiamo che i coefficienti all'interno delle chiamate ricorsive si a meno di uno:
1>1kai=15+15+17+17+17+17=25+47=3435

Successivamente verifichiamo che il caso base è inferiore al massimo degli inversi dei coefficienti:

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

Con queste condizioni soddisfatte, sappiamo che dove è una costante uguale a: Pertanto abbiamo: T(n)bnb

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


Teorema della divisione irregolare parte 2

Allo stesso modo possiamo dimostrare un limite per quando . La prova seguirà gran parte dello stesso formato:1k=1

Sia e costanti positive tali che .ckk>1

Quindi lascia che siano costanti positive tali che .{a1,a2,,ak}1kai=1

Dobbiamo anche ricorrere al modulo (come nel nostro esempio sopra):

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

Richiesta

Quindi rivendico (scegliamo base perché sarà il fattore di ramificazione dell'albero di ricorsione) dove e sono costanti (ad es. Asintoticamente linearitmico ) tale che:T(n)αnlogkn+βnlogkkαβ

β=c
e
α=c1kailogkai1

Prova per induzione

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

Induzione : supponiamo vero per qualsiasi , quindi abbiamon<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

Quindi abbiamo .T(n)αnlogkn+βnT(n)=O(nlogn)

Esempio

Modifichiamo l'esempio precedente che abbiamo usato solo un pochino:

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

Verifichiamo innanzitutto che i coefficienti all'interno delle chiamate ricorsive si sommano a uno:

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

Successivamente verifichiamo che il caso base è inferiore al massimo degli inversi dei coefficienti:

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

Con queste condizioni soddisfatte, sappiamo che dove e è una costante uguale a: Pertanto abbiamo: T(n)αnlogn+βnβ=cα

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


6

Dopo aver ricontrollato questo post, sono sorpreso che non sia ancora arrivato.

Trasformazione del dominio / Modifica delle variabili

Quando si hanno a che fare con le ricorrenze, a volte è utile essere in grado di cambiare il dominio se non è chiaro quanto sarà profondo lo stack di ricorsione.

Ad esempio, prendi la seguente ricorrenza:

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

Come potremmo mai risolvere questo? Potremmo espandere la serie, ma prometto che questo diventerà molto veloce. Consideriamo invece come cambia il nostro input ad ogni chiamata.

Per prima cosa abbiamo:

  1. n , quindi
  2. 22loglogn , quindi
  3. 22loglog(22loglogn) e così via.

L'obiettivo di una trasformazione del dominio sarà ora quello di cambiare la nostra ricorrenza in una equivalente tale che al posto delle transizioni precedenti abbiamo semplicemente .S(k)k,k1,k2,

Ad esempio, se lasciamo , allora questo è ciò che otteniamo per la nostra ricorrenza precedente: Quindi possiamo semplicemente riscriverlo come: Quindi tutto ciò che devi fare è riconvertire in per ottenere: 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)


Con questo esempio, ora possiamo vedere il nostro obiettivo.

Supponiamo che Per alcune costanti e funzioni e .

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

Ora stiamo provando a trovare alcune funzioni e tale che g(k)=nf(g(k))=g(k1)

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

Più in generale, vogliamo dove è l'applicazione ripetuta di su , volte. (es. ). Ciò consentirà a di agire come funzione "iterante". Dove, a profondità di ricorsione, il lavoro svolto è semplicemente .f(i)(n)=g(ki)f(i)(n)fnif(2)(n)=f(f(n))g(k)ih(g(ki))

Quindi possiamo facilmente convertirlo in modo che Quindi dobbiamo solo preoccuparci sommando per tutti i fino a un dato caso base. Cioè, 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 siamo in grado di determinare per qualche funzione chiusa , allora possiamo determinare come S(k)=γ(k)γT(n)

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

Quindi usiamo questo per ottenere un limite su tramite uno degli altri metodi sopra. Ovviamente potresti modificare un po 'questo metodo secondo le tue specifiche, ma in generale stai cercando di trovare una funzione iterante per trasformare in una semplice ricorsione.T(n)g(k)T(n)

Non conosco un modo esatto per determinare a questo punto, ma continuerò a pensarci e aggiornerò se diventa più chiaro (o se qualche commentatore ha qualche consiglio!). Ho trovato principalmente le mie funzioni attraverso tentativi ed errori in passato (vedi qui , qui , qui e qui per esempi).g(k)g(k)


1
Ci sono restrizioni su , e / o ? Sto chiedendo in particolare perché simili trucchi di sostituzione del folklore a volte falliscono quando è coinvolta la notazione di Landau, il che mi preoccupa se è sempre la risposta corretta. fghγg1
Raffaello

@Raphael, questa è la parte di cui non sono del tutto sicuro. Penso che ci siano alcune cose che dobbiamo garantire per stabilire l'equivalenza. 1) La profondità della ricorsione è la stessa, ciò può essere garantito da e . 2) il lavoro svolto ad ogni livello di ricorsione è lo stesso, che credo sia rafforzato da e quindi . L'idea di base è di trasformare semplicemente in una somma, ovvero . La conversione da a Inoltre non sono sicuro al 100% di (non ho una prova), ma non riesco a capire perché sarebbe errato. Pensieri? f(g(k))=g(k1)g(k)=ng(k)=nh(g(k))=h(n)T(n)i=ckh(g(i))γ(k)γ(g1(n))
Ryan

@Raphael potresti anche considerare il caso in cui invece di , quindi la conversione in dovrebbe essere più diretta inoltrare. Facile da dimostrare, penso che se mostri solo equivalenza nella somma. Probabilmente incontreresti qualche guaio divertente con la notazione di Landau qui, ma se lasci Landau fuori di esso e rimani bloccato solo con l'eguaglianza precisa, penso che dovrebbe andare bene. S(k)=γ(k)ΘT(n)=γ(g1(n))
Ryan,

@Raphael L'ho modificato per usare solo l'uguaglianza, quindi la notazione landau non dovrebbe rovinare tutto. Anche generalizzato un po 'di più. Che potresti anche generalizzare un po 'di più per usare una funzione invece della costante . Quindi invece di nella somma, basta avere un'applicazione di . β(n)aakiβ(g(i))
Ryan,

5

C'è un altro approccio che funziona per semplici relazioni di ricorrenza: chiedi a Wolfram Alpha di risolvere la ricorrenza per te.

Ad esempio, prova a digitare f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2)in Wolfram Alpha. Otterrai una soluzione, con un collegamento ai numeri di Fibonacci. Oppure prova f(1)=1, f(n)=f(n-1)+no f(1)=1, f(n)=2*f(n-1)+3*no f(n)=f(n-1) + 2 f(n-2), f(1)=1, f(2)=3per altri esempi. Tuttavia, attenzione: Wolfram Alpha può risolvere alcune ricorrenze molto semplici, ma cade a pezzi per quelle più complesse.

Questo approccio evita la necessità di qualsiasi pensiero, che può essere visto come un bug o una funzionalità.


3
Io non penso che lo scopo di questo sito è quello di spiegare come algebra computazionale fa le cose in questo modo, di non sostenere il suo uso non vedenti. Ma gli strumenti sono utili, così utili in effetti che uno dovrebbe probabilmente provarli sempre prima di "perdere" tempo (in "pratica").
Raffaello

Dalla mia esperienza personale, provare ad usare l'algebra del computer senza avere un'idea di cosa sia "difficile" o "facile" non ti porta molto lontano. Soprattutto nell'analisi degli algoritmi, può essere necessario un po 'di massaggio. Non so come lo fai senza sapere come risolvere da solo le ricorrenze. (Per quanto riguarda lo scopo di questo sito, ci sono molti punti di vista. Fatto: finora, "questo è utile per qualcuno " non era sufficiente per giustificare un post.)
Raffaello

5

Il caso 2 del teorema principale, come di solito indicato, gestisce solo le ricorrenze della forma in cui per . Il seguente teorema, tratto da un volantino di Jeffrey Leon, fornisce la risposta per negativo :T(n)=aT(n/b)+f(n)f(n)=Θ(nlogablogkn)k0k

Considera la ricorrenza con un caso base appropriato.T(n)=aT(n/b)+f(n)

  1. Se per allora .c < 0 T ( n ) = Θ ( n log b a )f(n)=O(nlogbalogc1n)c<0T(n)=Θ(nlogba)

  2. Se per allora .f(n)=Θ(nlogbalogc1n)T ( n ) = Θ ( n log b a log log n )c=0T(n)=Θ(nlogbaloglogn)

  3. Se per allora ).c > 0 T ( n ) = Θ ( n log b a log c nf(n)=Θ(nlogbalogc1n)c>0T(n)=Θ(nlogbalogcn

La dimostrazione usa il metodo della sostituzione ripetuta, come ora abbozziamo. Supponiamo che e . Quindi per una potenza di , Ora consideriamo i casi uno per uno. Quando , la serie converge, e quindi . Quando , la somma è la somma armonica , e così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 , possiamo approssimare la somma usando un integrale: e quindi .c>0T(n
j=1logbn0logbnxc1dx=xcc|0logbn=logbcnc,
T(n)=Θ(nlogbalogcn)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.