se n fosse un 1,000,000allora
(n^2 + n) / 2 = 500000500000 (5.00001E+11)
(n^2) / 2 = 500000000000 (5E+11)
(n^2) = 1000000000000 (1E+12)
1000000000000.00 cosa?
Mentre la complessità ci dà un modo per prevedere un costo nel mondo reale (secondi o byte a seconda che si tratti di complessità temporale o complessità dello spazio), non ci fornisce un numero di secondi o qualsiasi altra unità particolare.
Ci dà un certo grado di proporzione.
Se un algoritmo deve fare qualcosa n² volte, allora ci vorrà n² × c per un valore di c che è il tempo impiegato da ogni iterazione.
Se un algoritmo deve fare qualcosa n² ÷ 2 volte, allora impiegherà n² × c per un valore di c che è il doppio del tempo impiegato da ogni iterazione.
In entrambi i casi, il tempo impiegato è ancora proporzionale a n².
Ora, questi fattori costanti non sono qualcosa che possiamo semplicemente ignorare; in effetti puoi avere il caso in cui un algoritmo con complessità O (n²) fa meglio di uno con complessità O (n), perché se stiamo lavorando su un numero limitato di elementi, l'impatto dei fattori di consenso è maggiore e può sopraffare altre preoccupazioni . (In effetti, anche O (n!) È uguale a O (1) per valori sufficientemente bassi di n).
Ma non sono ciò che la complessità ci dice.
In pratica, ci sono alcuni modi in cui possiamo migliorare le prestazioni di un algoritmo:
- Migliora l'efficienza di ogni iterazione: O (n²) funziona ancora in n² × c secondi, ma c è più piccolo.
- Riduci il numero di casi visti: O (n²) viene eseguito ancora in n² × c secondi, ma n è più piccolo.
- Sostituisci l'algoritmo con uno che abbia gli stessi risultati, ma una complessità inferiore: ad esempio se potessimo riqualificare qualcosa di O (n²) in qualcosa di O (n log n) e quindi modificato da n² × c₀ secondi a (n log n) × c₁ secondi .
O per guardarlo in un altro modo, abbiamo f(n)×cpochi secondi e puoi migliorare le prestazioni riducendo c, riducendo no riducendo ciò che frestituisce per un dato n.
Il primo che possiamo fare con alcune micro-op all'interno di un loop o utilizzando hardware migliore. Darà sempre un miglioramento.
Il secondo che possiamo fare, forse identificando un caso in cui possiamo cortocircuitare l'algoritmo prima che tutto sia esaminato o filtrare alcuni dati che non saranno significativi. Non darà un miglioramento se il costo di fare questo supera il guadagno, ma sarà generalmente un miglioramento più grande rispetto al primo caso, specialmente con un grande n.
Il terzo che possiamo fare usando un algoritmo completamente diverso. Un classico esempio potrebbe essere la sostituzione di un ordinamento a bolle con un quicksort. Con un basso numero di elementi potremmo aver peggiorato le cose (se c₁ è maggiore di c₀), ma in genere consente i maggiori guadagni, specialmente con n molto grandi.
Nell'uso pratico, le misure di complessità ci consentono di ragionare sulle differenze tra gli algoritmi proprio perché ignorano la questione di come la riduzione di n o c aiuterà, a concentrarsi sull'esaming f()