Salta al contenuto
Note per Studenti Notazione asintotica

Notazione asintotica

In questa pagina 7

Si considerano funzioni f,g:N→Rf, g : \mathbb{N} \to \mathbb{R} positive per nn abbastanza grande. L'analisi asintotica ignora i fattori moltiplicativi costanti e i termini additivi non dominanti (vedi Complessità in tempo e caso pessimoPerché lo studio sperimentale non basta; complessità al caso pessimo come massimo sul numero di operazioni tra le istanze di una data taglia; stima con limiti superiore e inferiore senza trovare l'istanza peggiore; esempi arrayMax, prefixAverages e InsertionSort; efficienza asintotica e limiti dell'analisi.Complessità in tempo e caso pessimo →).

Le quattro definizioni

Notazione Definizione Si legge
f∈O(g)f \in O(g) ∃ c>0, n0≥1\exists\, c > 0,\ n_0 \ge 1 : f(n)≤c g(n)f(n) \le c\,g(n) per ogni n≥n0n \ge n_0 ff cresce al più come gg
f∈Ω(g)f \in \Omega(g) ∃ c>0, n0≥1\exists\, c > 0,\ n_0 \ge 1 : f(n)≥c g(n)f(n) \ge c\,g(n) per ogni n≥n0n \ge n_0 almeno come gg
f∈Θ(g)f \in \Theta(g) f∈O(g)f \in O(g) e f∈Ω(g)f \in \Omega(g), cioè c′g≤f≤c′′gc' g \le f \le c'' g definitivamente come gg
f∈o(g)f \in o(g) ∀ c>0 ∃ n0\forall\, c > 0\ \exists\, n_0 : f(n)≤c g(n)f(n) \le c\,g(n) per n≥n0n \ge n_0; equivale a lim⁡f/g=0\lim f/g = 0 strettamente meno di gg

Le costanti cc ed n0n_0 non dipendono da nn. Per oo vale invece "per ogni cc", e n0n_0 dipende da cc.

Esempi con le costanti

  • 3n+4∈O(n)3n + 4 \in O(n) con c=7c = 7, n0=1n_0 = 1 (perché 3n+4≤3n+4n3n + 4 \le 3n + 4n per n≥1n \ge 1); anche con c=4c = 4 e n0=4n_0 = 4: 3n+4≤4n  ⟺  n≥43n + 4 \le 4n \iff n \ge 4.
  • n+2n2∈O(n2)n + 2n^2 \in O(n^2) con c=3c = 3, n0=1n_0 = 1.
  • 3n+4∈O(n2)3n + 4 \in O(n^2) con c=4c = 4, n0=4n_0 = 4 (vero ma poco informativo: non è un limite stretto).
  • 2100∈O(1)2^{100} \in O(1) con c=2100c = 2^{100}.
  • 3n+4∈Ω(n)3n + 4 \in \Omega(n) con c=3c = 3; 6n2+1∈Ω(n)6n^2 + 1 \in \Omega(n) con c=6c = 6.
  • 100n∈o(n2)100 n \in o(n^2): per ogni cc si prende n0=100/cn_0 = 100/c.
  • 3n/log⁡2n∈o(n)3n/\log_2 n \in o(n) perché il rapporto 3/log⁡2n→03/\log_2 n \to 0.

Proprietà

  1. Polinomi: ∑i=0kaini∈Θ(nk)\sum_{i=0}^{k} a_i n^i \in \Theta(n^k) se ak>0a_k > 0 e k,aik, a_i costanti. Per OO si prende c=∑∣ai∣c = \sum |a_i|, n0=1n_0 = 1. Per Ω\Omega si pone γ=max⁡i<k∣ai∣\gamma = \max_{i<k}|a_i| e si usa che ∑i<kaini≥−kγnk−1\sum_{i<k} a_i n^i \ge -k\gamma n^{k-1}, da cui per n≥2kγ/akn \ge 2k\gamma/a_k si ottiene ≥ak2nk\ge \frac{a_k}{2} n^k. Esempio: (n+1)5∈Θ(n5)(n+1)^5 \in \Theta(n^5).
  2. Polinomio contro esponenziale: nk∈o(an)n^k \in o(a^n) se k>0k > 0, a>1a > 1 (limite nk/an→0n^k/a^n \to 0).
  3. Logaritmo contro potenza: (log⁡bn)k∈o(nh)(\log_b n)^k \in o(n^h) per b>1b > 1, k,h>0k, h > 0. Si pone m=log⁡bnm = \log_b n: nh=(bh)mn^h = (b^h)^m con a=bh>1a = b^h > 1 e mk∈o(am)m^k \in o(a^m) per il punto 2.
  4. Cambio di base: log⁡bn=log⁡an⋅log⁡ba\log_b n = \log_a n \cdot \log_b a, quindi log⁡bn∈Θ(log⁡an)\log_b n \in \Theta(\log_a n) per basi costanti. Dentro la notazione la base si omette; fuori si assume 22. Inoltre alog⁡2n=nlog⁡2aa^{\log_2 n} = n^{\log_2 a}.
  5. Legami tra notazioni:
    • f∈o(g)⇒f∈O(g)f \in o(g) \Rightarrow f \in O(g) (si prende c=1c = 1);
    • f∈O(g)  ⟺  g∈Ω(f)f \in O(g) \iff g \in \Omega(f) (si divide per cc);
    • f∈O(g)f \in O(g) e g∈O(f)⇒f∈Θ(g)g \in O(f) \Rightarrow f \in \Theta(g);
    • f∈O(g)⇒f+g∈Θ(g)f \in O(g) \Rightarrow f + g \in \Theta(g) (perché g≤f+g≤(c+1)gg \le f + g \le (c+1)g);
    • non valgono: O⇒oO \Rightarrow o (f=g=nf = g = n) né O⇒ΘO \Rightarrow \Theta (f=nf = n, g=n2g = n^2).

Sommatorie notevoli

∑i=0ni=n(n+1)2,∑i=0ni2=n(n+1)(2n+1)6∈Θ(n3),∑i=0nai=an+1−1a−1 (a≠1).\sum_{i=0}^{n} i = \frac{n(n+1)}{2}, \qquad \sum_{i=0}^{n} i^2 = \frac{n(n+1)(2n+1)}{6} \in \Theta(n^3), \qquad \sum_{i=0}^{n} a^i = \frac{a^{n+1} - 1}{a - 1}\ (a \ne 1).

Utili anche ⌊x⌋\lfloor x \rfloor (più grande intero ≤x\le x), ⌈x⌉\lceil x \rceil (più piccolo intero ≥x\ge x) e x mod yx \bmod y (resto della divisione intera, % in C): 39 mod 7=439 \bmod 7 = 4.

Terminologia

Complessità Nome
Θ(log⁡n)\Theta(\log n) logaritmica
Θ(n)\Theta(n) lineare
Θ(n2)\Theta(n^2), Θ(n3)\Theta(n^3) quadratica, cubica
Θ(nk)\Theta(n^k), kk costante polinomiale
Ω(an)\Omega(a^n), a>1a > 1 esponenziale

Ordine crescente: 1≺log⁡n≺n≺n≺nlog⁡n≺n2≺n3≺2n1 \prec \log n \prec \sqrt{n} \prec n \prec n \log n \prec n^2 \prec n^3 \prec 2^n.

Esempio svolto

Un algoritmo su un array XX di nn interi esegue c1nc_1 n operazioni per ogni intero pari e c2⌈log⁡2n⌉c_2 \lceil \log_2 n \rceil per ogni dispari. Nel caso peggiore tutti gli elementi sono pari: n⋅c1n=c1n2n \cdot c_1 n = c_1 n^2 (più costanti), quindi Θ(n2)\Theta(n^2). Limite superiore: ogni elemento costa al più max⁡(c1n,c2⌈log⁡2n⌉)≤c′n\max(c_1 n, c_2 \lceil \log_2 n \rceil) \le c' n, totale ≤c′n2\le c' n^2. Inferiore: l'istanza di soli pari costa c1n2c_1 n^2.

Errori comuni

  • Confondere "è O(n2)O(n^2)" con "è quadratico": OO è solo un limite superiore, 3n+4∈O(n2)3n + 4 \in O(n^2) è vero ma non stretto; per "esattamente" serve Θ\Theta.
  • Dire che f∈O(g)f \in O(g) implica f∈Θ(g)f \in \Theta(g), o che OO implica oo.
  • Far dipendere cc o n0n_0 da nn.
  • Dimenticare che log⁡\log senza base fuori dalla notazione è in base 2.

Versione ripasso

  • OO: ∃c>0,n0\exists c>0, n_0 con f(n)≤c g(n)f(n) \le c\,g(n) per n≥n0n \ge n_0. Ω\Omega: f(n)≥c g(n)f(n) \ge c\,g(n). Θ=O∩Ω\Theta = O \cap \Omega. oo: per ogni c>0c>0 vale f≤c gf \le c\,g definitivamente, cioè lim⁡f/g=0\lim f/g = 0. Le costanti non dipendono da nn (vedi Complessità in tempo e caso pessimoPerché lo studio sperimentale non basta; complessità al caso pessimo come massimo sul numero di operazioni tra le istanze di una data taglia; stima con limiti superiore e inferiore senza trovare l'istanza peggiore; esempi arrayMax, prefixAverages e InsertionSort; efficienza asintotica e limiti dell'analisi.Complessità in tempo e caso pessimo →).
  • Esempi: 3n+4∈O(n)3n+4 \in O(n) con c=7,n0=1c=7, n_0=1; n+2n2∈Θ(n2)n+2n^2 \in \Theta(n^2); 100n∈o(n2)100n \in o(n^2) con n0=100/cn_0 = 100/c.
  • Proprietà:
    • polinomio di grado kk con coefficiente direttivo positivo ∈Θ(nk)\in \Theta(n^k);
    • nk∈o(an)n^k \in o(a^n) (a>1a>1); (log⁡n)k∈o(nh)(\log n)^k \in o(n^h); basi dei logaritmi irrilevanti (log⁡bn=log⁡an⋅log⁡ba\log_b n = \log_a n \cdot \log_b a);
    • o⇒Oo \Rightarrow O; f∈O(g)  ⟺  g∈Ω(f)f \in O(g) \iff g \in \Omega(f); OO in entrambe le direzioni ⇒Θ\Rightarrow \Theta; f∈O(g)⇒f+g∈Θ(g)f \in O(g) \Rightarrow f+g \in \Theta(g);
    • falsi: O⇒oO \Rightarrow o (f=g=nf=g=n), O⇒ΘO \Rightarrow \Theta (nn contro n2n^2).
  • Sommatorie: ∑i=0ni=n(n+1)2\sum_{i=0}^n i = \tfrac{n(n+1)}{2}; ∑i2=n(n+1)(2n+1)6∈Θ(n3)\sum i^2 = \tfrac{n(n+1)(2n+1)}{6} \in \Theta(n^3); ∑ai=an+1−1a−1\sum a^i = \tfrac{a^{n+1}-1}{a-1}.
  • Terminologia: logaritmica, lineare, quadratica, cubica, polinomiale Θ(nk)\Theta(n^k), esponenziale Ω(an)\Omega(a^n).
  • Errori: OO letto come "esattamente"; cc o n0n_0 dipendenti da nn; base del log fuori dalla notazione = 2.

Esercizi su questo argomento

Teoria collegata