Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


ANALYSIS OF ALGORITHMS AND DATA STRUCTURES, Esercizi di Sistemi Informatici

Analisi degli algoritmi e complessità computazionale. Numeri speciali. Relazioni di ricorrenza. Funzioni generatrici. L'inversione di Lagrange. Metodi esatti e metodi approssimati. Il metodo simbolico. Espressioni regolari e grammatiche context-free: la metodologia di Chomsky-Schutzenberger. Simulazione di algoritmi e strutture dati e relativi test statistici.

Tipologia: Esercizi

2020/2021

In vendita dal 29/05/2023

elena-smith-1
elena-smith-1 🇮🇹

4.7

(3)

25 documenti

1 / 30

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
30/09/2019 Complessità gen.
Studio della complessità degli algoritmi in modo preciso, rigoroso e matematico
studio del caso medio, in quanto sia il caso ottimo che quello pessimo sono
improbabili.
Data ansequenza ricavo anesplicita
𝐺(𝑎𝑛)=𝑛
𝑎𝑛𝑡𝑛
funzione generatrice
𝐺(𝑎𝑛)estrazione del coefficiente
𝑛
𝑎𝑛𝑡𝑛
Medoto simbolico maple, mathematica, Sympy (py library)
Dato f(n):
- O(f(n)) = limite superiore, insieme di tutte le g(n) tali che è limitato
𝑔(𝑛)
𝑓(𝑛)
superiormente per 𝑛
-Ω(f(n)) = limite inferiore, insieme di tutte le g(n) tali che è limitato
𝑔(𝑛)
𝑓(𝑛)
inferiormente da un numero strettamente positivo per 𝑛
-Θ(f(n)) = sia superiore che inferiore, insieme di tutte le g(n) tali che è
𝑔(𝑛)
𝑓(𝑛)
limitato superiormente e inferiormente per 𝑛
Complessità di ordinamento basato sul confronto fra chiavi?
Input: a[1...n] numeri distinti in ordine casuale (n! modi di ordinamento)
Output: a[1...n] in ordine crescente
Mergesort complessità media nel caso in cui n = 2m
𝑛*𝑙𝑜𝑔𝑛
01/10/2019 Quicksort
Alberi binari: se h è l’altezza di un albero binario, allora si hanno al più 2hnodi esterni.
n! <= 2h, in quanto il numero delle permutazioni possibili è <= al numero possibile
delle foglie in un albero binario. Il quicksort è definito dal numero di partizioni, di
spostamenti e di confronti.
A differenza del mergesort, il quicksort è sensibile all’ordinamento iniziale dei dati.
Caso ottimo del mergesort:
Cn= C(parte intera inf.)[n/2] + C(parte intera sup.)[n/2] + n 𝑂(𝑛*𝑙𝑜𝑔𝑛)
Caso ottimo del quicksort:
Cn= C(parte intera inf.)[n-1/2] + C(parte intera sup.)[n-1/2] + n + 1 𝑂(𝑛*𝑙𝑜𝑔𝑛)
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e

Anteprima parziale del testo

Scarica ANALYSIS OF ALGORITHMS AND DATA STRUCTURES e più Esercizi in PDF di Sistemi Informatici solo su Docsity!

30/09/2019 Complessità gen.

Studio della complessità degli algoritmi in modo preciso, rigoroso e matematico →

studio del caso medio, in quanto sia il caso ottimo che quello pessimo sono

improbabili.

Data an sequenza → 𝐺(𝑎 → ricavo an esplicita 𝑛

𝑛

∑ 𝑎 𝑛

𝑛

𝐺(𝑎 → funzione generatrice 𝑛

→ estrazione del coefficiente

𝑛

∑ 𝑎 𝑛

𝑛

Medoto simbolico → maple, mathematica, Sympy (py library)

Dato f(n):

  • O(f(n)) = limite superiore, insieme di tutte le g(n) tali che è limitato

𝑔(𝑛) 𝑓(𝑛)

superiormente per 𝑛 → ∞

  • Ω(f(n)) = limite inferiore, insieme di tutte le g(n) tali che è limitato

𝑔(𝑛)

𝑓(𝑛)

inferiormente da un numero strettamente positivo per 𝑛 → ∞

  • Θ(f(n)) = sia superiore che inferiore, insieme di tutte le g(n) tali che è

𝑔(𝑛) 𝑓(𝑛)

limitato superiormente e inferiormente per 𝑛 → ∞

Complessità di ordinamento basato sul confronto fra chiavi?

Input: a[1...n] numeri distinti in ordine casuale (n! modi di ordinamento)

Output: a[1...n] in ordine crescente

Mergesort → complessità media nel caso in cui n = 2

m 𝑛 * 𝑙𝑜𝑔 𝑛

01/10/2019 Quicksort

Alberi binari: se h è l’altezza di un albero binario, allora si hanno al più 2

h nodi esterni.

n! <= 2

h , in quanto il numero delle permutazioni possibili è <= al numero possibile

delle foglie in un albero binario. Il quicksort è definito dal numero di partizioni, di

spostamenti e di confronti.

A differenza del mergesort, il quicksort è sensibile all’ordinamento iniziale dei dati.

Caso ottimo del mergesort:

Cn = C(parte intera inf.)[n/2] + C(parte intera sup.)[n/2] + n → 𝑂(𝑛 * 𝑙𝑜𝑔 𝑛

Caso ottimo del quicksort:

Cn = C(parte intera inf.)[n-1/2] + C(parte intera sup.)[n-1/2] + n + 1 → 𝑂(𝑛 * 𝑙𝑜𝑔 𝑛

Caso pessimo del quicksort:

Cn = Cn-1 + n + 1 → 𝑂(𝑛 → il quicksort nel caso in cui si vada a dividere l’array in due

2 )

parti di lunghezza (1, n-1) ha complessità quadratica.

Cn = Cn-1 + n + 1 = Cn-2 + n + n + 1 = … = Cn-k + n - k + 2 + … + n + 1 = C 1 + n*n + 1 = 0 +

n*n + 1 → 𝑂(𝑛

2 )

Analisi del quicksort nel caso medio

Dopo il primo posizionamento del perno J (dallo stadio iniziale alla coda dell’array),

ho J-1 elementi a sinistra del perno e n-J elementi a destra.

Avendo n! permutazioni, tutte le permutazioni che contengono J come ultimo

elemento sono (n-1)!/n! = 1/n

Se Cn è il numero medio di confronti, considerando C 0 = 0:

𝑛

1

𝑛* 𝐽=

𝑛 ∑ 𝐶 𝐽− +𝐶 𝑛−𝐽

2 𝑛

𝐽=

𝑛−

∑ 𝐶 𝐽

𝑛

𝐽=

𝑛−

∑ 𝐶 𝐽

sottraggo tra loro le due equazioni di termini n e n+1:

𝑛

𝑛−

𝐽=

𝑛−

∑ 𝐶 𝐽

𝐽=

𝑛−

∑ 𝐶 𝐽

𝑛

𝑛−

𝐶 𝑛−

𝑛

𝐶 𝑛−

𝑛 * 𝐶 → divido tutto per n(n+1) → ; 𝑛

𝑛−

𝐶 𝑛 𝑛+

𝐶 𝑛− 𝑛

2

𝑛+

Ora ricordo: 2 * → serie armonica che si comporta come

𝐾=

𝑛+

1

𝐾

𝑛

𝐾=

𝑛

1 𝐾

𝑛

𝐶 𝑛 𝑛+

𝐾=

𝑛+

1 𝐾

𝑛+

𝑛

𝑛+

2

07/10/2019 Scambi quicksort med.

Il numero degli scambi è dato dal fattore 𝑆 𝑛

𝑛−

6

1

𝑛

𝐽=

𝑛

∑ 𝐶 𝐽−

𝑛−𝐽 ( )

𝑛

𝑛(𝑛−2) 6

𝐽=

𝑛−

∑ 𝑆 𝐽

𝑛−

(𝑛−1)(𝑛−3)

6

𝐽=

𝑛−

∑ 𝑆 𝐽

Sottraggo tra loro queste due espressioni:

𝑛

𝑛

𝑛(𝑛−2) 6

𝐽=

𝑛−

∑ 𝑆 𝐽

(𝑛−1)(𝑛−3) 6

𝐽=

𝑛−

∑ 𝑆 𝐽

𝑛

2 −2𝑛−𝑛

2 +3𝑛−𝑛− 6

𝑛−

2𝑛−

6

𝑛−

𝑛−

2𝑛−

6

𝑛*𝑆 𝑛 𝑛(𝑛+1)

(𝑛+1)𝑆 𝑛− 𝑛(𝑛+1)

termino perché ho trovato un termine che esprime Sn in

𝑆 𝑛 𝑛+

𝑆 𝑛− 𝑛

2𝑛−

6𝑛(𝑛+1)

termini di Sn-1 più una quantità dipendente da n.

calcolo ora

𝑆 𝑛 𝑛+

𝑆 2 3

1 6 𝐾=

𝑛

2𝐾− 𝐾(𝐾+1)

con un sistema per trovare A e B:

2𝐾− 𝐾(𝐾−1)

𝐴 𝐾

𝐵 𝐾+

𝐴(𝐾+1)+𝐵𝐾 𝐾(𝐾+1)

𝐴+(𝐴+𝐵)𝐾 𝐾(𝐾+1)

A+B = 2 e A = -3 → B = 5 e A = -

Mi riconduco quindi ad una situazione in cui posso ricavare il numero armonico

dall’espressione dotata di sommatoria su K:

1 6

𝐾=

𝑛

− 𝐾

5 𝐾+

1 6

𝑛

1 2

𝑛+

1 2

1 3

1 6

𝑛+

9 2

1 3

𝑛+

7 3

1 2

08/10/2019 Perm. Comb. Disp.

  • Permutazioni:

Definiamo come n la lunghezza della permutazione: 𝑃 = (𝑎 e permutazione 1

𝑛

come tutti i possibili ordinamenti della sequenza degli an.

𝑛

Definendo π , si ha che: 𝑛

1

𝑛

𝑛+

𝑛

𝑛−

0

Definiamo quindi ultimamente le possibili permutazioni di n oggetti come: 𝑃 𝑛

  • Disposizioni:

Definiamo disposizione come le possibili combinazioni di n oggetti in gruppi di K.

Definiamo come n la lunghezza dell’array di oggetti e K la lunghezza dei gruppi.

Nel caso in cui: n = 4, K = 2

→ possibili disposizioni di n=4 oggetti in gruppi da K=2 elementi.

Per 𝐷. 4,

In generale, definiamo le disposizioni di n oggetti in gruppi di K elementi come:

𝑛,𝐾

  • Combinazioni:

Definiamo combinazioni di n oggetti in gruppi di K elementi come le disposizioni di n

oggetti in gruppi di K elementi SENZA contare l’ordine.

𝑛,𝐾

𝑛 ( )𝐾

𝐷 𝑛,𝐾 𝐾!

𝑛(𝑛−1)(𝑛−2)...(𝑛−𝐾+1)

𝐾!

𝑛(𝑛−1)(𝑛−2)...(𝑛−𝐾+1)(𝑛−𝐾)(𝑛−𝐾−1)...

𝐾!(𝑛−𝐾)(𝑛−𝐾−1)...

𝑛!

𝑘!(𝑛−𝐾)!

Dato 𝑓(𝑥) = (1 + 𝑥)

𝑟

𝐾≥

𝐾

𝐾 𝑐𝑜𝑛 𝑓 𝐾

𝑓

𝐾 (0) 𝐾!

𝑟 → 𝑓'(𝑥) = 𝑟 * (1 + 𝑥)

𝑟− → 𝑓''(𝑥) = 𝑟 * (𝑟 − 1) * (1 + 𝑥)

𝑟− →...

𝐾 (0) = 𝑟 * (𝑟 − 1) *... * (𝑟 − 𝐾 + 1)

In generale, da Taylor, si ha che:

𝐾

𝑓

𝐾 (0) 𝐾!

𝑟 ( )𝐾

Studiamo ora il caso in cui qui n sia negativo.

−𝑛 ( (^) 𝐾)

−𝑛 ( (^) 𝐾)

−𝑛(−𝑛−1)(−𝑛−2)...(−𝑛−𝐾+1) 𝐾!

(−1)

𝐾 𝑛(𝑛+1)...(𝑛+𝐾−1) 𝐾!

(−1)

𝐾 (𝑛+𝐾−1)! 𝐾!(𝑛−1)!

𝐾

𝑛+𝐾− ( (^) 𝐾 )

−𝑛 ( (^) 𝐾)

NB.:

𝑛 ( )𝐾

𝑛

( )𝐾

𝑛− (𝐾−1 )

𝑛− ( (^) 𝐾 )

Coefficienti binomiali centrali:

2𝑛 ( (^) 𝑛)

Dimostrazione di :

𝑛 ( )𝐾

𝑛− (𝐾−1 )

𝑛− ( (^) 𝐾 )

Siano dati n oggetti 𝑎 e sia uno degli n elementi “marchiato” in modo da 1

𝑛 ( )

distinguerlo, nel nostro caso 𝑎. 1

Sia S l’insieme delle combinazioni degli ai oggetti in insiemi di lunghezza K.

𝑆 = 𝑆 definisco il gruppo S come l’unione dei due insiemi dove + =

𝑎 1

∪ 𝑆

𝑎 1

− → 𝑆

𝑎 1

±

a 1 è presente e - = a 1 non è presente.

Le combinazioni che contengono a 1 posso sceglierle tra tutti gli n elementi MENO 1,

in K-1 modi. Allo stesso modo, le combinazioni che non contengono a 1 posso

scelglierle tra tutti gli elementi di n MENO 1 in K modi. Da qui la tesi:

  1. Spostamento: se appaiono termini addizionali tipo 𝐺(𝑎 mi chiedo qual’è la 𝑛+

relazione tra la funzione generatrice della sequenza spostata rispetto a quella

standard 𝐺(𝑎 di riferimento: 𝑛

𝑛+

1

2

3

2

  • 𝑎 4

3 +... =

𝐺(𝑎 𝑛

)−𝑎 0 𝑡

In generale, quando lo spostamento è s, si ha:

𝑛+𝑠

𝑠

𝑠+

𝑠+

2

  • 𝑎 𝑠+

3 +... =

𝐺(𝑎 𝑛

)−𝑎 0

−𝑎 1

𝑡−...−𝑎 𝑠−

𝑡

𝑠−

𝑡

𝑠

  1. Derivazione: se ho un caso del tipo 𝐺(𝑛 * 𝑎 si ha: 𝑛

𝑛

0

1

2

2

  • 3𝑎 3

3 +... = (𝑑𝑒𝑟𝑖𝑣𝑎𝑡𝑎 𝑑𝑖 𝐺(𝑎 𝑛

δ𝑎 𝑛 δ𝑡

1

2

3

2

  • 4𝑎 4

3 +... = 𝑚𝑜𝑙𝑡𝑖𝑝𝑙𝑖𝑐𝑜 𝑝𝑒𝑟 𝑡 = 𝑎 1

2

2

  • 3𝑎 3

3

  • 4𝑎 4

4

  1. Convoluzione: se ho un caso del tipo 𝐺(𝑎 , ovvero un prodotto di 𝑛

𝑛

due funzioni generatrici, ottengo:

𝑛

𝑛

0

1

2

2 +...) * (𝑏 0

1

2

2 +...) = 𝑎 0

0

0

1

1

0

2

1

1

2

0

2 +... = 𝐺

𝑛=

𝐾

∑ 𝑎 𝐾

  1. Composizione: se ho un caso del tipo si ha:

𝐾≥

𝐾

𝑛

𝐾

𝐾≥

𝐾

𝑛

𝐾 = 𝐺(𝑎 𝑛

𝑛

ricavato sulla base teorica del seguente ragionamento:

𝑓(𝑡) = e

1

1−𝑡

Allora 𝑓(𝑔(𝑡)) =

1

1−(1−𝑡)

2

Proprietà MOLTO importante: Principio di identità:

𝑛

𝑛

𝑛

𝑛

Ciò significa che, se due sequenze sono uguali, allora anche le loro funzioni

generatrici sono uguali.

Es.:

𝑛

𝑛

2

  • 𝑡

3 +...

Quando parto da una sequenza conosciuta nella sua forma esplicita, devo trovare una

ricorrenza che la definisce.

Utilizzo in questi casi il metodo del rapporto, ovvero trovare il rapporto tra due

elementi successivi della sequenza nota:

𝑎 𝑛+ 𝑎 𝑛

Nel caso della sequenza 𝑎 in esame, il rapporto. 𝑛

𝑎 𝑛+ 𝑎 𝑛

Quindi 𝑎. 𝑛

𝑛+

0

Da 𝑎 posso scrivere per il principio di identità. Si ha 𝑛

𝑛+

𝑛

𝑛+

quindi:

𝑛

𝑛+

𝐺(𝑎 𝑛 )−𝑎 0 𝑡

𝑛

𝑛

𝑛

𝑛

𝑛

𝑛

𝑛

1 1−𝑡

In generale si ha:

𝑛=

𝐾

∑ =

𝑡

𝑛+ − 𝑡−

Nel caso in cui n tende ad infinito si ha:

𝑛 ∞

lim →

𝑡

𝑛+ − 𝑡−

1 1−𝑡

Es.:

𝑛

𝑛

2

  • 𝑛𝑡

3 +...

𝑛

1 ( (^) 1−𝑡)

1

(1−𝑡) ( 2 ) =

Es.:

𝑛

2 𝑝𝑒𝑟 𝑜𝑔𝑛𝑖 𝑛 → 𝐺(𝑎 𝑛

2 ) = 𝑛

2

  • 𝑛

2 𝑡 + 𝑛

2 𝑡

2

  • 𝑛

2 𝑡

3 +...

2 ) = 𝐺(𝑛 * 𝑛) = 𝐺(𝑛 * 𝑎 𝑛

𝑡

(1−𝑡) ( 2 ) =

(1−𝑡)

2 +2𝑡*(1−𝑡)

(1−𝑡) ( 4 ) =^

𝑡(1−𝑡)

(1−𝑡)

3

Es.:

𝑛

𝑛

3

  • 𝑡

5

  • 𝑡

7 +...

La funzione generatrice di 𝑎 è una somma di potenze dispari: 𝑛

𝑛

𝐾≥

2𝐾 = 𝑡 *

𝐾≥

2 ( )

𝐾 → 𝑐𝑜𝑚𝑝𝑜𝑠𝑖𝑧𝑖𝑜𝑛𝑒, 𝑐𝑜𝑛 𝑎 𝑛

𝑛

2

𝐺(𝑇 𝑛

)−𝑇 0

−𝑇 1

*𝑡−𝑇 2

*𝑡

2

𝑡

3 =^

𝐺(𝑇 𝑛

)−𝑇 0

−𝑇 1

*𝑡

𝑡

2 +^

𝐺(𝑇 𝑛

)−𝑇 0 𝑡

𝑛

𝑛

2 = 𝑡 * (𝐺(𝑇 𝑛

2

  • 𝐺(𝑇 𝑛

3

  • 𝐺(𝑇 𝑛

Es.:

𝑎 → calcolo il rapporto dell’elemento i+1-esimo con l’elemento i-esimo: 𝑛

1 𝑛!

→ non è una ricorrenza lineare a

𝑎 𝑛+ 𝑎 𝑛

𝑛!

(𝑛+1)!

1

(𝑛+1)

𝑛+

𝑛

coefficienti costanti!

𝐺((𝑛 + 1) * 𝑎 → sia spostamento perché la sequenza è an+1 sia 𝑛+

𝑛

derivazione perché ho un coefficiente che dipende da n e non è = 1.

𝑛+

𝑛+

𝑛

𝑛

0

→ porto tutto a sinistra dell’=

𝐺(𝑏 𝑛 )−𝑏 0 𝑡

𝐺(𝑛*𝑎 𝑛 )

𝑡

𝑡*𝐷(𝐺(𝑎 𝑛 ))

𝑡

𝑛

il che implica

𝑎'(𝑡) 𝑎(𝑡)

𝑎'(𝑡) 𝑎(𝑡)

𝑡+𝑐

che c = 0, e quindi 𝑎(𝑡) = 𝑒

𝑡

Es.:

𝑎 → rapporto tra due termini consecutivi: 𝑛

1

𝑛

0

→ ma questo non è vero, perché il principio

𝑎 𝑛+ 𝑎 𝑛

𝑛

𝑛+

𝑛

𝑛

di identità vale solo nel caso in cui la regola sia valida per tutti gli n. Qui per n=0 non

si ha la proprietà verificata, in quanto: 𝑎 , ma chiaramente quindi non 1

1

posso usarla così semplicemente.

(𝑛 + 1) * 𝑎 → questa vale per ogni n. La funzione applicata vale 0 𝑛

𝑛

  • δ 𝑛,

per tutti gli n tranne che per k = n, in cui vale 1. Quindi ora risulta correttamente

1

𝑛

𝑛

) + 𝐺(δ 𝑛,

𝑛

𝑛

𝑛

1 1−𝑡

→ 𝑎'(𝑡) = imposta usando il fatto che

1 1−𝑡

1 1−𝑡

𝑎 , quindi: 0

𝑎(𝑡) = − 𝑙𝑛(1 − 𝑡) + 𝑐 = 𝑙𝑛(1 − 𝑡) con c=

  • 𝑐 = 𝑙𝑛(

1

1−𝑡

necessariamente, perché se

𝑎 allora. 0

1 1−𝑡

Es.:

𝑛

𝐾=

𝑛

1 𝐾

Per questa dobbiamo adattare la quarta proprietà (convoluzione) e usarla in questo

modo (formula di Eulero):

𝐾=

𝑛

∑ 𝑎 𝐾

𝑛−𝐾

𝐾=

𝑛

∑ 𝑎 𝐾

𝑛

1

1−𝑡

𝑛

𝐻 con 𝑛

𝐾=

𝑛

1 𝐾

𝐾=

𝑛

∑ 𝑎 𝐾

𝐾

1 𝐾

Quindi si ha che:

𝑛

𝐾=

𝑛

1 𝐾

𝑛

1 1−𝑡

1 1−𝑡

Consideriamo ora la sequenza di Fibonacci 𝐹 = (0, 1, 1, 2, 3, 5, 8, 13, 21,...)e

supponiamo che vogliamo considerare solo i termini di indice pari:

𝐹 allora questa è ottenuta tramite una trasformazione 𝑝𝑎𝑟𝑖

particolare della funzione generatrice:

2𝑛

𝑎( 𝑡)+𝑎(− 𝑡)

2

2𝑛+

𝑎( 𝑡)−𝑎(− 𝑡)

2* 𝑡

Nel caso di Fibonacci si ha:

𝑝𝑎𝑟𝑖

𝑡

1−𝑡− 𝑡

− 𝑡

1−𝑡+ 𝑡

1 2

𝑡+𝑡−𝑡 𝑡− 𝑡+𝑡+𝑡 𝑡

(1−𝑡)

2 −𝑡

1 2

2𝑡

2(1−2𝑡+𝑡

2 −𝑡)

𝑡

1−3𝑡+𝑡

2

28/10/2019 QS: confronti e scambi

Riprendiamo ora il caso medio del quicksort, cercando di risolvere le due ricorrenze di

Cn e Sn con l’operatore funzione generatrice.

  • Confronti.

𝑛

2

𝑛 𝐽=

𝑛+

∑ 𝐶 𝐽

𝑛

𝐽=

𝑛−

∑ 𝐶 𝐽

Applico quindi la funzione geratrice a entrambi i termini, considerando 𝐺(𝐶 𝑛

𝑛

𝐽=

𝑛−

∑ 𝐶

𝑛

2 ) − 2𝐺(𝑛) + 12𝐺

𝐽=

𝑛−

∑ 𝑆

  • 𝐺(δ 𝑛+

𝑡+𝑡

2

(1−𝑡)

3 − 2^

𝑡

(1−𝑡)

2 + 12^

𝑡 1−𝑡

𝑡+𝑡

2 −2𝑡+2𝑡

2 +𝑡(1−𝑡)

3

(1−𝑡)

3 + 12^

𝑡𝑆(𝑡)

1−𝑡

𝑡

3 (3−𝑡)

(1−𝑡)

3 + 12^

𝑡𝑆(𝑡)

1−𝑡)

Divido da entrambi i lati per t:

𝑡

2 (3−𝑡)

6(1−𝑡)

3 + 2^

𝑆(𝑡) 1−𝑡

Di nuovo, primo passaggio studiare l’equazione differenziale omogenea associata

senza il termine noto:

ς'(𝑡) =

2 1−𝑡

ς(𝑡) →

ς'(𝑡) ς(𝑡)

2 1−𝑡

→ 𝑙𝑜𝑔(ς(𝑡)) = − 2𝑙𝑜𝑔(1 − 𝑡) → ς(𝑡) =

1

(1−𝑡)

2

Secondo passaggio, studio la derivata del rapporto tra 𝑆(𝑡) e ς(𝑡):

𝑆(𝑡)

'

𝑆'(𝑡)ς(𝑡)−𝑆(𝑡)ς'(𝑡)

ς(𝑡)

2 =^

1

ς(𝑡)

ς'(𝑡)

ς(𝑡)

2 𝑆'(𝑡) −

2

1−𝑡

2 𝑡 2 (

6(

Si ha quindi:

𝑆(𝑡)

'

𝑡

2 (1−3𝑡) 6(1−𝑡)

2 𝑆(𝑡) = ∫

𝑡

2 (1−3𝑡) 6(1−𝑡)

Semplifico il polinomio nell’integrale in modo che sia semplice integrare:

𝑡

2 (1−3𝑡)

6(1−𝑡)

𝑡

2 −3𝑡

3

6(1−𝑡)

𝑡

2 (1−𝑡)

6(1−𝑡)

2𝑡

3

6(1−𝑡)

𝑡

2

6

𝑡

3

3(1−𝑡)

𝑡

2

6

𝑡(𝑡−1)(𝑡+1)+𝑡 3(1−𝑡)

𝑡

2

6

𝑡

2

6

𝑡(𝑡+1) 6

1 3

1 3(1−𝑡)

𝑡

2

6

𝑡

2

6

𝑡 6

1 3

1 3(1−𝑡)

2 𝑆(𝑡) = ∫

𝑡

2 (1−3𝑡) 6(1−𝑡)

𝑡

2

6

𝑡

2

6

𝑡 6

1 3

1 3(1−𝑡)

1 3

𝑡

3

3

1 6

𝑡

2

2

1 3

1 3

29/10/2019 Maple quicksort

Appunti lezione su Maple:

randperm(n) restituisce una delle n! permutazioni di n numeri casuali.

La procedura 𝑡𝑒𝑠𝑡𝑎𝑙𝑙mi conta tutti i confronti e gli scambi nelle chiamate a quicksort

su tutte le permutazioni di un array di n elementi. Da qui potrò poi fare la media di

questi due valori.

04/11/2019 Metodo simbolico

Metodo simbolico → enumerare oggetti (strutture ad albero, parole di linguaggi,

etc..). Associare ad una classe di oggetti una funzione generatrice che conta questa

classe in base a diverse caratteristiche. In generale si ha quindi:

Di base prendendo α ∈ 𝐴, è possibile definire | |α come “misura” dell’oggetto.

Posso quindi applicare la funzione generatrice alla classe:

𝑎(𝑡) = dove an è il numero di oggetti 𝛼 di che hanno misura

α∈𝐴

| |α

𝑛≥

𝑛

𝑛 𝐴

| | = 𝑛α.

Es.:

Sulla base della classe 𝐴una misura che posso definire è la lunghezza:

∀α ∈ 𝐴, | | = 𝑙𝑢𝑛𝑔ℎ𝑒𝑧𝑧𝑎 𝑑𝑒𝑙𝑙𝑎 𝑝𝑎𝑟𝑜𝑙𝑎 𝑑𝑒𝑙𝑙'𝑖𝑛𝑠𝑖𝑒𝑚𝑒 𝐴α

2

  • 𝑡

2

  • 𝑡

3

  • 𝑡

3

  • 𝑡

3

  • 𝑡

4 = 𝑡 + 2𝑡

2

  • 3𝑡

3

  • 𝑡

4

Noto che 𝐴 ∩ 𝐵 = 0

2

  • 𝑡

3

  • 𝑡

3

  • 𝑡

4

  • 𝑡

4 = 𝑡

2

  • 2𝑡

3

  • 2𝑡

4

Posso ora considerare la classe 𝐶 = 𝐴 ∪ 𝐵:

𝑐(𝑡) = 𝑎(𝑡) + 𝑏(𝑡) solo nel caso in cui 𝐴 e 𝐵sono disgiunti!

2

  • 3𝑡

3

  • 𝑡

4

  • 𝑡

2

  • 2𝑡

3

  • 2𝑡

4 = 𝑡 + 3𝑡

2

  • 5𝑡

3

  • 3𝑡

4

In generale però, nell’unione i duplicati non contano, quindi bisogna fare comunque

la somma delle due funzioni generatrici ma senza contare i duplicati per il calcolo dei

coefficienti.

Posso anche effettuare il prodotto cartesiano tra 𝐴 e 𝐵:

𝐷 = 𝐴 × 𝐵 → γ ∈ 𝐷 | γ = (α, β)

𝑛≥

𝑛

𝑛

𝑛≥

𝐾=

𝑛

∑ 𝑎 𝐾

𝑛 = 𝑎(𝑡) · 𝑏(𝑡)

Un’altra operazione che possiamo fare a partire dalla classe 𝐴è considerare:

𝑆𝑒𝑞𝑢𝑒𝑛𝑧𝑎(𝐴) = {ε} ∪ 𝐴 ∪ 𝐴 × 𝐴 ∪ 𝐴 × 𝐴 × 𝐴 ∪... ∪ 𝐴 ×... × 𝐴

Allora: 𝑆(𝑡) = 𝑡

0

  • 𝑎(𝑡) + 𝑎(𝑡)

2

  • 𝑎(𝑡)

3 +... + 𝑎(𝑡)

𝑛

𝐾≥

𝐾

1

1−𝑎(𝑡)

Es.:

𝐺 = {𝑎𝑙𝑏𝑒𝑟𝑜 𝑣𝑢𝑜𝑡𝑜} × 𝐹dove

𝐹 = {𝑎𝑙𝑏𝑒𝑟𝑜 𝑣𝑢𝑜𝑡𝑜} ∪ 𝐺 ∪ 𝐺 × 𝐺 ∪ 𝐺 × 𝐺 × 𝐺 ∪... ∪ 𝐺 ×... × 𝐺

1 1−𝐺(𝑡)

Si ha quindi:

𝑡 1−𝐺(𝑡)

2 = 𝑡 → 𝐺(𝑡)

2 − 𝐺(𝑡) + 𝑡 = 0 → 𝐺(𝑡) =

1− 1−4𝑡 2

𝑛

11/11/2019 Numerosità elem. linguaggio

Definiamo una classe di oggetti 𝐴 | ∀α ∈ 𝐴 → |α| = 𝑚𝑖𝑠𝑢𝑟𝑎(α). Definiamo anche

delle operazioni:

- 𝐴 × 𝐵 → 𝑐(𝑡) = 𝑎(𝑡) · 𝑏(𝑡)

  • 𝑆(𝐴) → 𝑐(𝑡) = con caso particolare:

1 1−𝑎(𝑡)

≥𝑆 (𝐴) → 𝑐(𝑡) =

𝑎(𝑡)

𝑆

1−𝑎(𝑡)

Data una grammatica context-free:

N = non terminali con N 0 starting symbol

T = terminali

P = insieme di produzioni

con 𝑁 = {𝐸, 𝑇, 𝐹, 𝑃, 𝑀, 𝐴} e𝑇 = {𝑎, ·, ÷, (, ), +, −}

Per contare quindi la numerosità, nel caso di una produzione, per l’alternativa tra due

produzioni sommo le due parti e nel caso in cui ho più termini a destra moltiplico i

termini: in Maple:

2 𝐸(𝑡)

2 𝑤

2 𝐸

𝑀 → · | ÷ ⇒ 𝑀(𝑡) = 2𝑡 𝑀 = 2𝑡

Inserisco nel caso dei non terminali (ad esempio per contare le a e le parentesi),

aggiungo: 𝑃 → 𝑎 | (𝐸) ⇒ 𝑃(𝑡) = 𝑡𝑧 + 𝑡 con z che conta il numero delle a e

2 𝑤

2 𝐸(𝑡)

w che conta il numero delle parentesi.

Il risultato del sistema è qualcosa del tipo

2

  • 𝑧(𝑤

2

  • 4𝑧)𝑡

3

  • (4𝑧𝑤

2

  • 8𝑧

2 )𝑡

4 +...

Parole generate, in ordine di termini (fino al quarto termine):

{𝑎}, {± 𝑎}, {(𝑎), 𝑎 + 𝑎, 𝑎 − 𝑎, 𝑎 * 𝑎, 𝑎 ÷ 𝑎}, {± 𝑎 + 𝑎, ± 𝑎 − 𝑎, ± 𝑎 * 𝑎, ± 𝑎 ÷ 𝑎, ±

Un altro modo per definire un linguaggio (nel caso dei regolari) è quello di utilizzare

le espressioni regolari. Posso definire immediatamente una funzione generatrice su di

esse.

Es.:

Stringhe binarie che non contengono 4 bit 0 consecutivi.

(ε + 0 + 00 + 000)

Parole generate, in ordine di termini:

1

1

2

  • 𝑡

3

  • 𝑡

4

2

1

= ε + 𝑒 1

1

1

1

1

1

1

1

2

1

1−𝑒 1 (𝑡)

1

1−(𝑡+𝑡

2 +𝑡

3 +𝑡

4 )

3

= (ε + 0 + 00 + 000) → 𝑒 3

2

  • 𝑡

3

2

3

1+𝑡+𝑡

2 +𝑡

3

1−(𝑡+𝑡

2 +𝑡

3 +𝑡

4 )

1−𝑡 4

1−𝑡

(1−𝑡)*

1−𝑡 4

1−𝑡

1−𝑡

4

1−𝑡

1−𝑡

1−𝑡−𝑡(1−𝑡

4 )

1−𝑡

4

1−2𝑡+𝑡

5

Es.:

Linguaggio su {a,b} delle parole che contengono il pattern p = abb.

Automa generato a partire da questo è abbastanza semplice.

Definisco ora 4 linguaggi:

Linguaggio che accetto a partire da q 0 → 𝐿 0

1

0

Linguaggio che accetto a partire da q 1 → 𝐿 1

1

2

Linguaggio che accetto a partire da q 2 → 𝐿 2

1

3

Linguaggio che accetto a partire da q 3 → 𝐿 3

3

3

  • ε

Associo quindi ogni linguaggio ad una funzione generatrice:

0

1

0

1

1

2

2

1

3

3

3

3

12/11/2019 Polinomio di correlazione

  • 𝑣 → 𝐿 0

  • 𝑣

Da questa si ottiene:

0

𝑡

3

(1−𝑡)(1−2𝑡)(1−𝑡−𝑡

2 )

𝐴 1−𝑡

𝐵 1−2𝑡

𝐶+𝐷𝑡

1−𝑡−𝑡

2 → 𝐴 = 𝐵 = 1, 𝐶 =^ − 2, 𝐷 =^ − 1

Riscrivo queste due equazioni con le funzioni generatrici:

𝑆(𝑡) * 𝑡 con

𝑘 = 𝑇(𝑡) * 𝐶(𝑡) 𝑇(𝑡) =

𝑡

𝑘 𝑆(𝑡) 𝐶(𝑡)

𝑡

𝑘 𝑆(𝑡)

𝐶(𝑡)

𝑘

  • 𝑆(𝑡);

𝑘

  • 𝐶(𝑡) − 𝑚𝑡 * 𝐶(𝑡)) * 𝑆(𝑡) = 𝐶(𝑡); 𝑆(𝑡) =

𝐶(𝑡)

𝑡

𝑘 +(1−𝑚𝑡)𝐶(𝑡)

Es.:

3

  • 𝑡

6 ⇒ 𝑆(𝑡) =

1+𝑡

3 +𝑡

6

𝑡

8 +(1−3𝑡)(1+𝑡

3 +𝑡

6 )

19/11/2019 Lab. su grammatiche

2 𝐸(𝑡)

2 𝑤

2 𝐸

𝑀 → · | ÷ ⇒ 𝑀(𝑡) = 2𝑡 𝑀 = 2𝑡

Riprendendo questo esempio e calcolando la soluzione del sistema di equazioni, a noi

interessa la soluzione del sistema associata all’equazione di E, ovvero lo starting

symbol della grammatica.

25/11/2019 Estrazione del coefficiente

Per il processo di estrazione del coefficiente si hanno delle proprietà analoghe a

quelle delle funzioni generatrici:

  1. Linearità:

𝑛 [ ](α · 𝑎(𝑡) + β · 𝑏(𝑡) =

  1. Spostamento:
  2. Derivazione:
  3. Convoluzione:
  1. Composizione:

Vale inoltre la regola di Newton:

𝑛

[ ](1 + α𝑡)

𝑟

𝑟 ( )𝑛 · α

𝑛

e il principio di identità:

Es.:

𝑛

[ ] ·^

1− 1−4𝑡

2𝑡

1

2

𝑛 [ ]𝑡

(1 − 1 − 4𝑡) =^

1

2

𝑛+ [ ] (1 − 1 − 4𝑡) =^

1

2

𝑛+ [ ]𝑡

0 −

1

2

𝑛+ [ ] 1 −

1 2

1 2 ( 𝑛)

𝑛+

dato che si ha

1 2 ( 𝑛)

(−1 )

𝑛−

4

𝑛 (2𝑛−1)

2𝑛 ( (^) 𝑛)

1

2

(−1)

𝑛+

4

𝑛+ (2(𝑛+1)−1)

2𝑛+ ( (^) 𝑛+1)

𝑛+ ) =

1

2(2𝑛+1)

2𝑛+ ( (^) 𝑛+1)

1

2(2𝑛+1)

(2𝑛+2)!

(𝑛+1)!

(2𝑛+2)(2𝑛+1)(2𝑛)!

2(2𝑛+1)(𝑛+1)

2 (𝑛!)

2 =^

2(

2(

Riottengo quindi i numeri di Catalan.

Es.: Numero medio di confronti nel Quicksort

2

(1−𝑡)

2 · 𝑙𝑛^

1 ( (^) 1−𝑡)

𝑛 [ ]

2

(1−𝑡)

2 · 𝑙𝑛^

1 ( (^) 1−𝑡)

𝑛 [ ]

1 1−𝑡

1 1−𝑡

1 ( (^) 1−𝑡)

𝑘=

𝑛

∑ 𝐻 𝑘

Ma questa soluzione è imprecisa. Applico quindi la proprietà di derivazione:

𝑛

1 𝑡

𝑛

𝑛

1 1−𝑡

1 ( ( (^) 1−𝑡))

1

(1−𝑡)

2 · 𝑙𝑛^

1 ( (^) 1−𝑡)

1 1−𝑡

1

(1−𝑡)

2 · 𝑙𝑛^

1 ( (^) 1−𝑡)

1

(1−𝑡)

2 →^ 𝑡

𝑛 [ ]

1

(1−𝑡)

2 · 𝑙𝑛^

1 ( (^) 1−𝑡)

𝑛 [ ] 𝐷(𝐺(𝐻 𝑛

1

(1−𝑡) ( 2 ) =^ 𝑡

𝑛 [ ]𝐷(𝐺(𝐻 𝑛

𝑛 [ ](1 − 𝑡)

− ) = (𝑛 + 1)𝐻 𝑛+

− ( (^) 𝑛)

𝑛 = (𝑛 + 1)𝐻 𝑛+

𝑛+

Es.: Ricorrenza del Mergesort

𝑛

2 ⎡ ⎣

⎤ ⎦

2 ⎡ ⎣

⎤ ⎦

Poniamo: 𝐷 𝑛

𝑛+

𝑛

𝑛

2 ⎡ ⎣

⎤ ⎦

2 ⎡ ⎣

⎤ ⎦

2 ⎡ ⎣

⎤ ⎦

2 ⎡ ⎣

⎤ ⎦

ma dato che si ha

𝑛+ 2

𝑛 2

2 ⎡ ⎣

⎤ ⎦

2 ⎡ ⎣

⎤ ⎦

𝑛

2 ⎡ ⎣

⎤ ⎦

Applico ricorsivamente la divisione per 2, aggiungendo una volta 1 per ogni

ricorsione: