Salta al contenuto
Note per Studenti Esercizio - induzione parametrica con parti intere e limite lineare (compito del 9 luglio 2025, es. 1)

Esercizio - induzione parametrica con parti intere e limite lineare (compito del 9 luglio 2025, es. 1)

Esame
In questa pagina 3

Testo (compito d'esame del 9 luglio 2025 di Algoritmi per l'Ingegneria, Ing. Informatica UniPD, seconda parte, esercizio 1, 16 punti). Si consideri la seguente relazione di ricorrenza definita per valori arbitrari positivi del parametro nn: T(n)={12n≤5T ⁣(⌊n/3⌋)+2 T ⁣(⌈n/4⌉−1)+2n+1n>5.T(n) = \begin{cases} 12 & n \le 5 \\ T\!\left(\lfloor n/3 \rfloor\right) + 2\,T\!\left(\lceil n/4 \rceil - 1\right) + 2n + 1 & n > 5. \end{cases} Utilizzando l'induzione parametrica, determinare una costante cc per cui T(n)≤c nT(n) \le c\,n per ogni n>0n > 0.


Teoria usata: Induzione parametrica - limitazioni esatte delle ricorrenzeL'induzione parametrica prova una limitazione T(n) <= cn+d (o >=) con costanti c e d incognite: si simula la verifica per induzione, si raccolgono i vincoli su c e d dalla base e dal passo HP => TH, e se l'intersezione non è vuota si sceglie la coppia migliore. Per MAX dà esattamente T(n) = n-1; può fallire anche con guess veri (si aggiunge un parametro o un termine di ordine inferiore).Induzione parametrica - limitazioni esatte delle ricorrenze →, Albero della ricorrenza e formula generale per le ricorrenzeL'albero della ricorrenza ha la forma dell'albero delle chiamate dell'istanza peggiore e T(n) è la somma dei lavori dei nodi. Per la famiglia T(n) = s(n)T(f(n)) + w(n) con base T0 per n <= n0, contando i nodi per livello con le iterate di f e il livello f*(n,n0) si ottiene la formula chiusa T(n) = somma_l [prodotto_j s(f^(j)(n))] w(f^(l)(n)) + [prodotto s] T0, verificata per induzione e applicata a esempi (merge sort, Hanoi, ricorrenze con radice).Albero della ricorrenza e formula generale per le ricorrenze →.

Il guess (T(n)≤cnT(n) \le cn, lineare) è dato dal testo. Il lavoro è nel passo: bisogna maggiorare le parti intere in modo da ottenere una disequazione in cc e nn, e risolverla per tutti gli nn che entrano nel passo (n≥6n \ge 6).

Vincolo dalla base

Per 1≤n≤51 \le n \le 5: T(n)=12≤?c n  ⟺  c≥12nT(n) = 12 \overset{?}{\le} c\,n \iff c \ge \frac{12}{n}. Il più stringente è n=1n = 1: c≥12.c \ge 12.

Passo induttivo

Ipotesi. T(m)≤c mT(m) \le c\,m per ogni 1≤m<n1 \le m < n, con n>5n > 5, cioè n≥6n \ge 6.

Gli argomenti sono ammessi. Per n≥6n \ge 6: ⌊n/3⌋≥2\lfloor n/3\rfloor \ge 2 e ⌊n/3⌋<n\lfloor n/3\rfloor < n; ⌈n/4⌉−1≥⌈6/4⌉−1=1\lceil n/4\rceil - 1 \ge \lceil 6/4\rceil - 1 = 1 e <n< n. Quindi l'ipotesi si applica a entrambi (l'argomento ⌈n/4⌉−1\lceil n/4\rceil - 1 non scende mai sotto 11, dove il guess è definito). Si ricava T(n)=T(⌊n/3⌋)+2T(⌈n/4⌉−1)+2n+1≤c⌊n/3⌋+2c(⌈n/4⌉−1)+2n+1.\begin{aligned} T(n) &= T(\lfloor n/3\rfloor) + 2T(\lceil n/4\rceil - 1) + 2n + 1 \\ &\le c\lfloor n/3\rfloor + 2c\bigl(\lceil n/4\rceil - 1\bigr) + 2n + 1. \end{aligned}

Maggiorazione delle parti intere (valida per ogni valore di c>0c > 0). Si ha ⌊n/3⌋≤n3\lfloor n/3\rfloor \le \frac n3 e ⌈n/4⌉≤n4+34\lceil n/4\rceil \le \frac n4 + \frac34, quindi ⌈n/4⌉−1≤n4−14≤n4\lceil n/4\rceil - 1 \le \frac n4 - \frac14 \le \frac n4. La versione semplice usa solo ⌈n/4⌉−1≤n4\lceil n/4\rceil - 1 \le \frac n4: T(n)≤c n3+2c n4+2n+1=56 c n+2n+1.T(n) \le \frac{c\,n}{3} + 2c\,\frac n4 + 2n + 1 = \frac56\,c\,n + 2n + 1. Il passo riesce se 56cn+2n+1≤?cn\frac56 cn + 2n + 1 \overset{?}{\le} cn, cioè c n6≥?2n+1.\frac{c\,n}{6} \overset{?}{\ge} 2n + 1.

Come risolvere la disequazione. Per ogni n≥6n \ge 6 si vuole c≥6(2n+1)n=12+6nc \ge \frac{6(2n+1)}{n} = 12 + \frac6n. Il lato destro decresce con nn, quindi il caso peggiore è il più piccolo nn del passo, n=6n = 6: c≥12+66=13.c \ge 12 + \frac66 = 13. Equivalente geometrico: il fascio di rette yc=c x6y_c = \frac{c\,x}{6} (tutte per l'origine) deve stare sopra la retta y=2x+1y = 2x + 1 per tutti gli x≥6x \ge 6; basta imporlo in x=6x = 6: c⋅66≥2⋅6+1=13c\cdot\frac66 \ge 2\cdot6 + 1 = 13. Equivalente algebrico: da n≥6n \ge 6 segue 1≤n61 \le \frac n6, quindi 2n+1≤2n+n62n + 1 \le 2n + \frac n6 e basta c6≥2+16\frac c6 \ge 2 + \frac16, cioè c≥13c \ge 13.

Intersezione dei vincoli. c≥12c \ge 12 (base) e c≥13c \ge 13 (passo): si sceglie c=max⁡{12,13}=13c = \max\{12, 13\} = 13. T(n)≤13 n∀n>0.\boxed{T(n) \le 13\,n \quad \forall n > 0.}

Una costante migliore: c=12c = 12

La soluzione del corso si ferma a 1313, che è valida. Si può fare meglio con una maggiorazione più fine, mantenendo ⌈n/4⌉−1≤n−14\lceil n/4\rceil - 1 \le \frac{n - 1}{4} (perché ⌈n/4⌉≤n+34\lceil n/4\rceil \le \frac{n+3}4): T(n)≤c n3+2c n−14+2n+1=56 c n−c2+2n+1≤?c n  ⟺  c(n6+12)≥2n+1  ⟺  c≥6(2n+1)n+3=12−30n+3.T(n) \le \frac{c\,n}{3} + 2c\,\frac{n-1}{4} + 2n + 1 = \frac56\,c\,n - \frac c2 + 2n + 1 \overset{?}{\le} c\,n \iff c\left(\frac n6 + \frac12\right) \ge 2n + 1 \iff c \ge \frac{6(2n+1)}{n+3} = 12 - \frac{30}{n+3}. Il lato destro è minore di 1212 per ogni nn: quindi c=12c = 12 soddisfa il passo per tutti gli n≥6n \ge 6, e la base chiede già c≥12c \ge 12. Ne segue T(n)≤12 nT(n) \le 12\,n, e 1212 è la costante ottima, perché T(1)=12T(1) = 12 obbliga c≥12c \ge 12. L'esito 1313 del metodo semplice è dunque una condizione sufficiente ma non la migliore possibile: l'induzione parametrica dà una costante che dipende dalla finezza con cui si maggiorano le parti intere.

Controlli numerici. I primi valori sono T(6)=T(2)+2T(1)+13=12+24+13=49T(6) = T(2) + 2T(1) + 13 = 12 + 24 + 13 = 49, T(7)=51T(7) = 51, T(8)=53T(8) = 53, T(12)=61T(12) = 61 (cioè T(n)=2n+37T(n) = 2n + 37 per 6≤n≤156 \le n \le 15); i rapporti T(n)/nT(n)/n valgono 8,178{,}17 per n=6n = 6, 5,085{,}08 per n=12n = 12, 8,468{,}46 per n=1000n = 1000, e tendono a 1212 per n→∞n \to \infty (se T(n)≈γnT(n) \approx \gamma n: γ=γ3+γ2+2\gamma = \frac\gamma3 + \frac\gamma2 + 2, quindi γ=12\gamma = 12). Con un programma si è verificato T(n)≤12nT(n) \le 12n per n<300 000n < 300\,000 e il massimo di T(n)/nT(n)/n è 1212 (n=1,…,5n = 1, \dots, 5).

python
from functools import lru_cache

@lru_cache(None)
def T(n):
    return 12 if n <= 5 else T(n // 3) + 2 * T(-(-n // 4) - 1) + 2 * n + 1

assert all(T(n) <= 12 * n for n in range(1, 300000))
assert all(-(-n // 4) - 1 >= 1 for n in range(6, 10000))     # argomento >= 1
print([T(n) for n in range(6, 13)])                          # [49, 51, 53, 55, 57, 59, 61]

Versione ripasso

Testo. T(n)=12T(n)=12 per n≤5n\le5; T(n)=T(⌊n/3⌋)+2T(⌈n/4⌉−1)+2n+1T(n)=T(\lfloor n/3\rfloor)+2T(\lceil n/4\rceil-1)+2n+1 per n>5n>5. Con l'induzione parametrica trovare cc tale che T(n)≤cnT(n)\le cn per ogni n>0n>0 [16 punti].

Teoria: Induzione parametrica - limitazioni esatte delle ricorrenzeL'induzione parametrica prova una limitazione T(n) <= cn+d (o >=) con costanti c e d incognite: si simula la verifica per induzione, si raccolgono i vincoli su c e d dalla base e dal passo HP => TH, e se l'intersezione non è vuota si sceglie la coppia migliore. Per MAX dà esattamente T(n) = n-1; può fallire anche con guess veri (si aggiunge un parametro o un termine di ordine inferiore).Induzione parametrica - limitazioni esatte delle ricorrenze →.

  • Base: 12≤cn12\le cn per n=1..5n=1..5, il più stringente n=1n=1: c≥12c\ge12.
  • Passo (n≥6n\ge6): argomenti ⌊n/3⌋≥2\lfloor n/3\rfloor\ge2 e ⌈n/4⌉−1≥1\lceil n/4\rceil-1\ge1, entrambi <n<n: l'ipotesi si applica. Con ⌊n/3⌋≤n3\lfloor n/3\rfloor\le\frac n3 e ⌈n/4⌉−1≤n4\lceil n/4\rceil-1\le\frac n4: T(n)≤56cn+2n+1≤cn  ⟺  cn6≥2n+1  ⟺  c≥12+6nT(n)\le\frac56cn+2n+1\le cn\iff\frac{cn}6\ge2n+1\iff c\ge12+\frac6n; il caso peggiore è n=6n=6: c≥13c\ge13 (equivalente: retta y=cx6y=\frac{cx}6 sopra y=2x+1y=2x+1 in x=6x=6; oppure 1≤n61\le\frac n6).
  • Scelta: c=max⁡{12,13}=13c=\max\{12,13\}=13, T(n)≤13nT(n)\le13n.
  • Più fine: ⌈n/4⌉−1≤n−14\lceil n/4\rceil-1\le\frac{n-1}4 dà c≥12−30n+3c\ge12-\frac{30}{n+3}, minore di 1212: basta c=12c=12, ottima perché T(1)=12T(1)=12. Quindi T(n)≤12nT(n)\le12n; T(n)/n→12T(n)/n\to12.
  • Controlli: T(6..12)=49,51,53,55,57,59,61T(6..12)=49,51,53,55,57,59,61; max⁡T/n=12\max T/n=12.
  • Errori tipici: dimenticare che ⌈n/4⌉−1≥1\lceil n/4\rceil-1\ge1 per usare l'ipotesi; imporre il vincolo del passo con n=1n=1 invece del primo nn del passo; scegliere c=12c=12 senza controllare il passo; dimenticare il vincolo della base.

Teoria collegata