Divide et Impera

Da testwiki.
Versione del 3 dic 2023 alle 12:48 di 79.30.221.3 (discussione) (Corretto: "costante")
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Vai alla navigazione Vai alla ricerca

Un approccio per ideare algoritmi ricorsivi si basa sul paradigma di Divide et Impera. Il metodo divide et impera applica tre passi ad ogni livello di ricorsione:

  • Divide: questo passo divide il problema in un certo numero di sottoproblemi, che sono istanze più piccole dello stesso problema.
  • Impera: i sottoproblemi vengono risolti in modo ricorsivo. Ovviamente, quando i sottoproblemi hanno una dimensione sufficientemente piccola, essi vengono risolti direttamente.
  • Combina: le soluzioni dei sottoproblemi vengono combinate per generare la soluzione del problema originale.

Quando i sottoproblemi sono abbastanza grandi da essere risolti ricorsivamente, si ha il cosiddetto caso ricorsivo. Mentre sei sottoproblemi hanno una dimensione sufficientemente piccola da non richiedere ricorsione, si dice che la ricorsione ha toccato il fondo e che si è raggiunto il caso base. A volte, oltre ai sottoproblemi che sono istanze più piccole dello stesso problema, dobbiamo anche risolvere dei sottoproblemi che non sono affatto uguali al problema originale. Noi consideriamo la soluzione di questi sottoproblemi come parte del passo combina.

Template:Risorsa

Ricorrenze

Le ricorrenze vanno mano nella mano con il paradigma di divide et impera, in quanto ci offrono un modo naturale per caratterizzare i tempi di esecuzione degli algoritmi divide et impera. Una ricorrenza è un’equazione o disequazione che descrive una funzione in termini del suo valore con input più piccoli. Un esempio di ricorrenza è la ricorrenza che caratterizza il tempo di esecuzione di merge-sort:

T(n)={Θ(1)se n=12T(n/2)+Θ(n)se n>1

la cui soluzione è T(n)=Θ(nlog2(n))

Risolvere le ricorrenze

Le ricorrenze possono avere varie forme: non sempre un algoritmo divide il problema originale in due sottoproblemi, può capitare una ripartizione 1/3 e 2/3, e non tutti gli algoritmi che adottano questo approccio dividono il problema in sottoproblemi di dimensione costante. Dato questa grande varietà di casistiche sono stati elaborati tre metodi per risolvere le ricorrenze:

  • Metodo di sostituzione: si ipotizza un limite e poi si usa l’induzione matematica per dimostrare che l’ipotesi è corretta
  • Metodo dell’albero di ricorsione: converte la ricorrenza in un albero i cui nodi rappresentano i costi ai vari livelli della ricorsione; per risolvere la ricorrenza si adottano tecniche che limitano le sommatorie.
  • Metodo dell’esperto: fornisce i limiti per ricorrenze della forma T(n)=aT(n/b)+f(n) dove a1,b>1 e f(n) è una funzione data. Una ricorrenza di questa forma caratterizza un algoritmo "divide et impera" che crea a sottoproblemi, ciascuno dei quali ha una dimensione pari a 1/b quella del problema originale ed in cui i passi divide e combina insieme richiedono un tempo f(n).

Metodo di sostituzione

Il metodo di sostituzione per risolvere le ricorrenze richiede due passi:

  1. Ipotizzare la forma della soluzione
  2. Usare l'induzione matematica per trovare le costanti e dimostrare che la soluzione funziona.

Questo metodo è potente, ma il problema è che può essere solamente applicato nei casi in cui sia facile immaginare la forma della soluzione. Il metodo di sostituzione può essere usato per determinare il limite inferiore o superiore di una ricorrenza. Ad esempio, si consideri la seguente ricorrenza:

T(n)={Θ(1)se n=13T(n/3)+n3se n>1

Supponiamo che la soluzione sia T(n)=O(n3). Il nostro metodo consiste nel dimostrare che esistono delle costanti positive c ed n0 tali che T(n)cn3 per ogni nn0. Procediamo per induzione su n.

  • Caso base: n=1. Se scegliamo c1 allora T(1)=1c=c13.
  • Passo induttivo: n1.

T(n)=n3+3T(n/3)n3+3c(n/3)3 per ip. induttiva T(n/3)c(n/3)3=n3+19cn3=(1+19c)n3cn3

L'ultima disuguaglianza è vera solo se la costante c è scelta in maniera tale che 1+19cc, ossia se c19c1, il che implica 89c1 e quindi c98. Ricapitolando se scegliamo c98 e n0=1, allora T(n)cn3 per ogni nn0.

Metodo dell'albero di ricorsione

Il metodo dell'albero di ricorsione permette di visualizzare lo sviluppo della ricorsione e dei costi. Ogni nodo rappresenta il costo di una particolare sotto problema appartenente all'insieme delle chiamate ricorsive della funzione. Il valore della ricorrenza viene calcolato sommando prima i costi dei nodi su ciascun livello, e poi determinando il costo totale di tutti i livelli dell'albero di ricorsione. Un albero di ricorsione è un ottimo metodo per ottenere una buona ipotesi, che poi viene verificata col metodo di sostituzione. Si può però usare anche l'albero di ricorsione come prova diretta di una soluzione della ricorrenza. Per esempio vediamo come un albero di ricorsione possa fornire una buona ipotesi per la ricorrenza:

Albero di ricorsione per T(n)=2T(n/2)+cn^2

T(n)={Θ(1)se n=12T(n/2)+Θ(n2)se n>1

Creiamo un albero di ricorsione per la ricorrenza T(n)=2T(n/2)+cn2, ricordando che il coefficiente c>0 è costante. Osserviamo che:

  • ogni livello i ha 2i nodi ognuno dei quali ha un costo pari ha (n2i)2. Il costo di ciascun livello è:

ci=2i(n2i)2=n22i.

  • l'ultimo livello corrisponde ad una chiamata di T(n2h) con n2h =1 e quindi h=log2(n).
  • T(n) è pari alla somma della somma dei costi associati a ciascun nodo dell'albero di ricorsione. Quindi:

T(n)=i=0log2(n)n22i=n2i=0log2(n)12i=n21(12)log2(n)+1112=n211212log2(n)12=n22(112(12)log2n)=n22(1122log2n)=n22(112nlog2(2))=n22(112n)=n22(2n12n)=n22n4=Θ(n2)

Metodo dell'esperto

il metodo dell'esperto rappresenta un "ricettario" per risolvere le ricorrenze della forma T(n)=aT(n/b)+f(n) dove a1 e b>1 sono costanti e f(n) è una funzione asintoticamente positiva. La ricorrenza T(n)=aT(n/b)+f(n) descrive il tempo di esecuzione di un algoritmo che divide un problema di dimensione n in a sottoproblemi, ciascuno di dimensione n/b. Mentre la funzione f(n) comprende il costo per dividere il problema e combinare i risultati dei sottoproblemi.

Teorema

Date le costanti a1 e b>1 e la funzione f(n), sia T(n) una funzione definita sugli interi non negativi dalla ricorrenza T(n)=aT(n/b)+f(n) dove n/b rappresenta (n/b) (floor di n/b) o (n/b) (ceil di n/b).Allora T(n) può essere asintoticamente limitata nei seguenti modi:

  1. Se f(n)=O(nlogb(aϵ)) per qualche costante ϵ>0, allora T(n)=Θ(nlogb(a)).
  2. Se f(n)=Θ(nlogb(a)), allora T(n)=Θ(nlogb(a)log2(n)).
  3. Se f(n)=Ω(nlogb(a+ϵ)) per qualche costante ϵ>0 e se af(n/b)cf(n) per qualche costante c<1 e per ogni n sufficientemente grande, allora T(n)=Θ(f(n)).

Intuitivamente, il teorema afferma che, data una relazione di ricorrenza della forma T(n)=aT(n/b)+f(n) dove a1 e b>1, la soluzione si può ottenere confrontando la funzione f(n) con la funzione nlogb(a). Se la funzione f è asintoticamente più piccola di nlogb(a) per un fattore nϵ, per qualche costante ϵ>0, allora T(n)=Θ(nlogb(a)); se le due funzioni asintoticamente hanno la stessa grandezza allora T(n)=Θ(nlogb(a)log2n); infine, se f(n) è polinomialmente più grande di nlogb(a) e soddisfa la condizione di regolarità af(n/b)cf(n), allora la soluzione è T(n)=Θ(f(n)).

Applicazione del teorema dell'esperto

Per utilizzare il metodo dell'esperto, determiniamo semplicemente quale caso (se esiste) del teorema dell'esperto possiamo applicare e scriviamo la soluzione. Per esempio consideriamo le tre seguenti ricorrenze:

  • T(n)=4T(n/2)+n
  • T(n)=4T(n/2)+n2
  • T(n)=4T(n/2)+n3

In tutti e tre i casi abbiamo che a=4 e b=2. Cambia invece il "rapporto" tra f(n) e nlogb(a)=n2. Ognuna delle tre ricorrenze corrisponde ad un diverso caso del teorema dell'esperto.

  • f(n)=n e f(n)=O(n)=Θ(nlogb(aϵ)) con ϵ=1>0 (in altri termini nlogb(a) è un limite superiore per f(n)). Primo caso del teorema dell'esperto: T(n)=Θ(nlogb(a))=Θ(n2).
  • f(n)=n2 ed f(n)=O(n2)=Θ(nlogb(a)) (ossia nlogb(a) è un limite stretto per f(n)). Secondo caso del teorema dell'esperto: T(n)=Θ(nlogb(a)log2(n))=Θ(n2log2(n)).
  • f(n)=n3 ed f(n)=Ω(n3)=Ω(nlogb(a+ϵ)) con ϵ=1>0 (ossia, nlogb(a) è un limite inferiore per f(n)). Terzo caso del teorema dell'esperto: T(n)=Θ(f(n))=Θ(n3).

Consideriamo, però anche un caso dove il metodo dell'esperto non si può applicare. Consideriamo la seguente ricorrenza:

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

dove a=2 , b=2 , f(n)=nlog2(n) e nlogb(a)=n. Potremmo erroneamente ritenere che si possa applicare il caso 3, in quanto f(n)=nlog2(n) è asintoticamente più grande di nlogb(a)=n; il problema è che non è polinomialmente più grande. Il rapporto f(n)/nlogb(a)=(nlog2(n))/n=log2(n) è asintoticamente minore di nϵ per qualsiasi costante positiva ϵ. Quindi, la ricorrenza ricade nell'intervallo fra i casi 2 e 3.