Differenza tra notazione Big-O e Little-O


Risposte:


442

f ∈ O (g) dice, essenzialmente

Per almeno una scelta di una costante k > 0, puoi trovare una costante a tale che la disuguaglianza 0 <= f (x) <= kg (x) vale per tutte le x> a.

Si noti che O (g) è l'insieme di tutte le funzioni per le quali vale questa condizione.

f ∈ o (g) dice, essenzialmente

Per ogni scelta di una costante k > 0, puoi trovare una costante a tale che la disuguaglianza 0 <= f (x) <kg (x) vale per tutte le x> a.

Ancora una volta, nota che o (g) è un set.

In Big-O, è necessario solo trovare un particolare moltiplicatore k per il quale la disuguaglianza vale oltre un minimo x .

In Little-o, deve esserci un minimo x dopo il quale la disuguaglianza è valida, non importa quanto piccolo diventi k , purché non sia negativo o zero.

Entrambi descrivono i limiti superiori, sebbene in qualche modo controintuitivamente, Little-o è l'affermazione più forte. C'è un divario molto più grande tra i tassi di crescita di f e g se f ∈ o (g) che se f ∈ O (g).

Un esempio della disparità è questo: f ∈ O (f) è vero, ma f ∈ o (f) è falso. Pertanto, Big-O può essere letto come "f ∈ O (g) significa che la crescita asintotica di f non è più veloce di g", mentre "f ∈ o (g) significa che la crescita asintotica di f è strettamente più lenta di g". È come <=contro <.

Più specificamente, se il valore di g (x) è un multiplo costante del valore di f (x), allora f ∈ O (g) è vero. Questo è il motivo per cui puoi eliminare le costanti quando lavori con la notazione big-O.

Tuttavia, affinché f ∈ o (g) sia vero, allora g deve includere una potenza maggiore di x nella sua formula, e quindi la relativa separazione tra f (x) e g (x) deve effettivamente aumentare quando x diventa più grande.

Per utilizzare esempi puramente matematici (anziché fare riferimento ad algoritmi):

Quanto segue è vero per Big-O, ma non sarebbe vero se si usasse little-o:

  • x² ∈ O (x²)
  • x² ∈ O (x² + x)
  • x² ∈ O (200 * x²)

Quanto segue è vero per little-o:

  • x² ∈ o (x³)
  • x² ∈ o (x!)
  • ln (x) ∈ o (x)

Nota che se f ∈ o (g), ciò implica f ∈ O (g). es. x² ∈ o (x³) quindi è anche vero che x² ∈ O (x³), (di nuovo, pensa a O come <=e o come <)


146
Sì, la differenza sta nel fatto che le due funzioni possano essere asintoticamente uguali. Intuitivamente mi piace pensare al significato di big-O "non cresce più velocemente di" (cioè cresce allo stesso ritmo o più lentamente) e il significato di little-o "cresce strettamente più lentamente di".
Phil,

12
Copia questo su Wikipedia? Questo è molto meglio di quello che c'è.
cloudsurfin

1
@SA Sì. Questo è un caso più complicato in cui la regola più semplice che ho dato sui "poteri superiori di x" non è ovviamente applicabile. Ma se guardi le definizioni dei limiti più rigorose fornite nella risposta di Strilanc di seguito, quello che vuoi sapere è se lim n-> inf (2 ^ n / 3 ^ n) = 0. Since (2 ^ n / 3 ^ n) = (2/3) ^ n e poiché per qualsiasi 0 <= x <1, lim n-> inf (x ^ n) = 0, è vero che 2 ^ n = o (3 ^ n).
Tyler McHenry,

1
Fai attenzione con "In Little-o, deve esserci un minimo x dopo il quale la disuguaglianza è valida, non importa quanto piccolo diventi k, purché non sia negativo o zero". Non è "per ogni cosa ac'è kche ...", è "per ogni cosa che kc'è a..."
GA1

1
"In Little-o, deve esserci un minimo x dopo il quale la disuguaglianza è valida, non importa quanto piccolo diventi k, purché non sia negativo o zero." no, questo non è corretto.
Filippo Costa

196

Big-O è troppo piccolo come lo è <. Big-O è un limite superiore inclusivo, mentre little-o è un limite superiore rigoroso.

Ad esempio, la funzione f(n) = 3nè:

  • in O(n²), o(n²)eO(n)
  • non in O(lg n), o(lg n)oo(n)

Analogamente, il numero 1è:

  • ≤ 2, < 2e≤ 1
  • Non ≤ 0, < 0o< 1

Ecco una tabella che mostra l'idea generale:

Tavolo grande

(Nota: la tabella è una buona guida ma la sua definizione del limite dovrebbe essere in termini di limite superiore invece del limite normale. Ad esempio, 3 + (n mod 2) oscilla tra 3 e 4 per sempre. È dentro O(1)nonostante non abbia un limite normale, perché ha ancora a lim sup: 4.)

Consiglio di memorizzare come la notazione Big-O si converte in confronti asintotici. I confronti sono più facili da ricordare, ma meno flessibili perché non si possono dire cose come n O (1) = P.


Ho una domanda: qual è la differenza tra la riga 3 e 4 (colonna definizioni limite)? Potresti mostrarmi un esempio in cui 4 vale (lim> 0), ma non 3?
Masked Man,

3
Oh, l'ho capito. Big Omega è per lim> 0, Big Oh è per lim <infinito, Big Theta è quando entrambe le condizioni mantengono, ovvero 0 <lim <infinito.
Masked Man,

Per f ∈ Ω (g), il limite all'infinito non dovrebbe essere valutato> = 1? Allo stesso modo per f ∈ O (g), 1 = <c <∞?
user2963623

1
@ user2963623 No, perché i valori finiti strettamente superiori a 0, compresi i valori compresi tra 0 e 1, corrispondono alla "stessa complessità asintotica ma a diversi fattori costanti". Se si omettono valori inferiori a 1, si ha un taglio nello spazio a fattore costante anziché nello spazio di complessità asintotica.
Craig Gidney,

1
@ubadub Trasmetti l'operazione di esponenziale sul set. È una notazione libera.
Craig Gidney,

45

Trovo che quando non riesco a cogliere concettualmente qualcosa, pensare al motivo per cui si dovrebbe usare X è utile per capire X. (Per non dire che non l'hai provato, sto solo preparando il palco.)

[cose che sai] Un modo comune per classificare gli algoritmi è per runtime e citando la complessità big-Oh di un algoritmo, puoi ottenere una stima abbastanza buona di quale sia "migliore", a seconda di quale sia la funzione "più piccola" nella O! Anche nel mondo reale, O (N) è "migliore" di O (N²), escludendo cose sciocche come costanti super-massicce e simili. [/ Cose che sai]

Diciamo che c'è qualche algoritmo che gira in O (N). Abbastanza bene, eh? Ma diciamo che tu (persona brillante, tu) crei un algoritmo che gira in O ( NloglogloglogN ). SÌÌ! È più veloce! Ma ti sentiresti sciocco scriverlo ancora e ancora quando scrivi la tua tesi. Quindi lo scrivi una volta e puoi dire "In questo documento, ho dimostrato che l'algoritmo X, precedentemente calcolabile nel tempo O (N), è in effetti calcolabile in o (n)."

Pertanto, tutti sanno che il tuo algoritmo è più veloce --- di quanto non è chiaro, ma sanno che è più veloce. Teoricamente. :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.