Qual è la differenza tra il Big-O la notazione O(n)
e Little-O notazione o(n)
?
Qual è la differenza tra il Big-O la notazione O(n)
e Little-O notazione o(n)
?
Risposte:
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:
Quanto segue è vero per little-o:
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 <
)
a
c'è k
che ...", è "per ogni cosa che k
c'è a
..."
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
è:
O(n²)
, o(n²)
eO(n)
O(lg n)
, o(lg n)
oo(n)
Analogamente, il numero 1
è:
≤ 2
, < 2
e≤ 1
≤ 0
, < 0
o< 1
Ecco una tabella che mostra l'idea generale:
(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.
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 ( N ⁄ loglogloglogN ). 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. :)