






















Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
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
1 / 30
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!























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):
𝑔(𝑛) 𝑓(𝑛)
superiormente per 𝑛 → ∞
𝑔(𝑛)
𝑓(𝑛)
inferiormente da un numero strettamente positivo per 𝑛 → ∞
𝑔(𝑛) 𝑓(𝑛)
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 𝑛 * 𝑙𝑜𝑔 𝑛
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
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
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: 𝑃 𝑛
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:
𝑛,𝐾
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)!
𝐾
𝑛+𝐾− ( (^) 𝐾 )
−𝑛 ( (^) 𝐾)
𝑛 ( )𝐾
𝑛
( )𝐾
𝑛− (𝐾−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:
relazione tra la funzione generatrice della sequenza spostata rispetto a quella
standard 𝐺(𝑎 di riferimento: 𝑛
𝑛+
1
2
3
2
3 +... =
𝐺(𝑎 𝑛
)−𝑎 0 𝑡
In generale, quando lo spostamento è s, si ha:
𝑛+𝑠
𝑠
𝑠+
𝑠+
2
3 +... =
𝐺(𝑎 𝑛
)−𝑎 0
−𝑎 1
𝑡−...−𝑎 𝑠−
𝑡
𝑠−
𝑡
𝑠
𝑛
0
1
2
2
3 +... = (𝑑𝑒𝑟𝑖𝑣𝑎𝑡𝑎 𝑑𝑖 𝐺(𝑎 𝑛
δ𝑎 𝑛 δ𝑡
1
2
3
2
3 +... = 𝑚𝑜𝑙𝑡𝑖𝑝𝑙𝑖𝑐𝑜 𝑝𝑒𝑟 𝑡 = 𝑎 1
2
2
3
4
𝑛
due funzioni generatrici, ottengo:
𝑛
𝑛
0
1
2
2 +...) * (𝑏 0
1
2
2 +...) = 𝑎 0
0
0
1
1
0
2
1
1
2
0
2 +... = 𝐺
𝑛=
𝐾
∑ 𝑎 𝐾
𝐾≥
𝐾
𝑛
𝐾
𝐾≥
𝐾
𝑛
𝐾 = 𝐺(𝑎 𝑛
𝑛
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
𝑡
𝐺(𝑇 𝑛
)−𝑇 0
−𝑇 1
*𝑡
𝑡
𝐺(𝑇 𝑛
)−𝑇 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
Riprendiamo ora il caso medio del quicksort, cercando di risolvere le due ricorrenze di
Cn e Sn con l’operatore funzione generatrice.
𝑛
2
𝑛 𝐽=
𝑛+
∑ 𝐶 𝐽
𝑛
𝐽=
𝑛−
∑ 𝐶 𝐽
Applico quindi la funzione geratrice a entrambi i termini, considerando 𝐺(𝐶 𝑛
𝑛
𝐽=
𝑛−
∑ 𝐶
𝑛
2 ) − 2𝐺(𝑛) + 12𝐺
𝐽=
𝑛−
∑ 𝑆
𝑡+𝑡
2
(1−𝑡)
𝑡
(1−𝑡)
𝑡 1−𝑡
𝑡+𝑡
2 −2𝑡+2𝑡
2 +𝑡(1−𝑡)
3
(1−𝑡)
𝑡𝑆(𝑡)
1−𝑡
𝑡
3 (3−𝑡)
(1−𝑡)
𝑡𝑆(𝑡)
1−𝑡)
Divido da entrambi i lati per t:
𝑡
2 (3−𝑡)
6(1−𝑡)
𝑆(𝑡) 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 ς(𝑡):
𝑆(𝑡)
𝑆'(𝑡)ς(𝑡)−𝑆(𝑡)ς'(𝑡)
ς(𝑡)
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
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.
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
4
Noto che 𝐴 ∩ 𝐵 = 0
2
3
3
4
4 = 𝑡
2
3
4
Posso ora considerare la classe 𝐶 = 𝐴 ∪ 𝐵:
𝑐(𝑡) = 𝑎(𝑡) + 𝑏(𝑡) solo nel caso in cui 𝐴 e 𝐵sono disgiunti!
2
3
4
2
3
4 = 𝑡 + 3𝑡
2
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
𝑛
Definiamo una classe di oggetti 𝐴 | ∀α ∈ 𝐴 → |α| = 𝑚𝑖𝑠𝑢𝑟𝑎(α). Definiamo anche
delle operazioni:
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 𝐸
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
3
2
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
−
−
Da questa si ottiene:
0
𝑡
3
(1−𝑡)(1−2𝑡)(1−𝑡−𝑡
2 )
𝐴 1−𝑡
𝐵 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 )
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.
Per il processo di estrazione del coefficiente si hanno delle proprietà analoghe a
quelle delle funzioni generatrici:
𝑛 [ ](α · 𝑎(𝑡) + β · 𝑏(𝑡) =
Vale inoltre la regola di Newton:
𝑛
[ ](1 + α𝑡)
𝑟 ( )𝑛 · α
𝑛
e il principio di identità:
Es.:
𝑛
[ ] ·^
1− 1−4𝑡
2𝑡
1
2
𝑛 [ ]𝑡
−
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(
Riottengo quindi i numeri di Catalan.
Es.: Numero medio di confronti nel Quicksort
2
(1−𝑡)
1 ( (^) 1−𝑡)
𝑛 [ ]
2
(1−𝑡)
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−𝑡)
1 ( (^) 1−𝑡)
1 1−𝑡
1
(1−𝑡)
1 ( (^) 1−𝑡)
1
(1−𝑡)
𝑛 [ ]
1
(1−𝑡)
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: