C'è un libro di testo in attesa di essere scritto ad un certo punto, con il titolo provvisorio Strutture di dati, algoritmi e compromessi . Quasi ogni algoritmo o struttura di dati che probabilmente imparerai a livello universitario ha alcune funzionalità che lo rendono migliore per alcune applicazioni rispetto ad altre.
Prendiamo l'ordinamento come esempio, poiché tutti hanno familiarità con gli algoritmi di ordinamento standard.
Prima di tutto, la complessità non è l'unica preoccupazione. In pratica, i fattori costanti contano, ed è per questo che (diciamo) l'ordinamento rapido tende ad essere usato più dell'ordinamento dell'heap anche se l'ordinamento rapido ha una terribile complessità nel caso peggiore.
In secondo luogo, c'è sempre la possibilità che ti trovi in una situazione in cui stai programmando con strani vincoli. Una volta ho dovuto eseguire l'estrazione quantile da una raccolta di campioni di dimensioni modeste (circa 1000) il più velocemente possibile, ma era su un piccolo microcontrollore che aveva pochissima memoria di lettura-scrittura di riserva, quindi ha escluso la maggior parte di ordina algoritmi. L'ordinamento Shell è stato il miglior compromesso, poiché era sub-quadratico e non richiedeva memoria aggiuntiva.O(nlogn)
In altri casi, le idee di un algoritmo o di una struttura di dati potrebbero essere applicabili a un problema specifico. L'ordinamento delle bolle sembra essere sempre più lento dell'ordinamento di inserzione su hardware reale, ma l'idea di eseguire un passaggio di bolle a volte è esattamente ciò di cui hai bisogno.
Considera, ad esempio, una sorta di visualizzazione 3D o videogioco su una moderna scheda video, in cui desideri disegnare gli oggetti in ordine dal più vicino alla fotocamera al più lontano dalla fotocamera per motivi di prestazioni, ma se non ottieni l'ordine esatto, l'hardware se ne occuperà. Se ti sposti nell'ambiente 3D, l'ordine relativo degli oggetti non cambierà molto tra i fotogrammi, quindi eseguire un passaggio di bolle ogni fotogramma potrebbe essere un compromesso ragionevole. (Il motore Source di Valve lo fa per gli effetti particellari.)
Esistono persistenza, concorrenza, località della cache, scalabilità in un cluster / cloud e una serie di altre possibili ragioni per cui una struttura di dati o un algoritmo può essere più appropriata di un'altra, anche alla luce della stessa complessità computazionale per le operazioni a cui tieni.
Detto questo, ciò non significa che dovresti memorizzare un gruppo di algoritmi e strutture di dati per ogni evenienza. La maggior parte della battaglia si sta rendendo conto che c'è un compromesso da sfruttare in primo luogo, e sapendo dove cercare se pensi che potrebbe esserci qualcosa di appropriato.