Con il piccolo n
Big O è praticamente inutile e sono le costanti nascoste o anche l'effettiva implementazione che sarà più probabilmente il fattore decisivo per cui l'algoritmo è migliore. Questo è il motivo per cui la maggior parte delle funzioni di ordinamento nelle librerie standard passerà a un ordinamento di inserimento più veloce per gli ultimi 5 elementi. L'unico modo per capire quale sarà migliore è il benchmarking con set di dati realistici.
Big O fa bene a grandi serie di dati e discute su come un algoritmo scala, è meglio avere un algoritmo O(n log n)
di un O(n^2)
quando ti aspetti che i dati crescano in futuro, ma se O(n^2)
funziona bene così com'è e le dimensioni degli input rimarranno probabilmente costanti, ma tieni presente che puoi aggiornarlo ma lasciarlo così com'è, ci sono probabilmente altre cose di cui devi preoccuparti adesso.
(Nota: tutti i "grandi" e "piccoli" nei paragrafi precedenti sono pensati per essere presi relativamente, piccolo può essere qualche milione e grande può essere cento dipende tutto da ciascun caso specifico)
Spesso ci sarà un trade-off tra tempo e spazio: per esempio quicksort richiede O(log n)
di memoria extra mentre heapsort può usare O(1)
di memoria extra, tuttavia le costanti nascoste in heapsort lo rendono meno attraente (c'è anche il problema di stabilità che rende il mergesort più attraente se non ti dispiace pagare i costi extra di memoria).
Un'altra cosa da considerare sono gli indici di database, queste sono tabelle aggiuntive che richiedono log(n)
di tempo per aggiornare quando un record viene aggiunto, rimosso o modificato, ma consente le ricerche molto più velocemente ( O(log n)
invece di O(n)
). decidere se aggiungerne uno è un costante mal di testa per la maggior parte degli amministratori di database: avrò abbastanza ricerche sull'indice rispetto alla quantità di tempo che passo ad aggiornare l'indice?
Un'ultima cosa da tenere a mente: gli algoritmi più efficienti sono quasi sempre più complicati di quello ingenuo diretto (altrimenti sarebbe quello che avresti usato dall'inizio). Ciò significa un'area di superficie più ampia per bug e codice che è più difficile da seguire, entrambi i problemi non banali da affrontare.