Non l'ho trovato così importante se non per comunicare idee, e lavoro in settori critici per le prestazioni (raytracing, elaborazione di immagini e mesh, sistemi di particelle, motori fisici, ecc.) E ho dovuto ideare molti algoritmi e strutture dati proprietari quando si lavora in R&S. In queste aree, spesso una manciata di strutture dati e algoritmi molto efficienti possono produrre prodotti completamente nuovi e all'avanguardia mentre gli algoritmi di ieri rendono obsoleti i prodotti esistenti, quindi c'è sempre la ricerca di fare le cose in modo più efficiente. Come avvertimento, non ho mai pubblicato articoli sugli algoritmi che ho ideato. Erano tutti proprietari. Se lo facessi, avrei bisogno dell'aiuto di un matematico per formulare prove e così via.
Tuttavia, a mio avviso, la quantità di lavoro computazionale per iterazione è spesso di interesse più immediato rispetto alla scalabilità dell'algoritmo, a meno che l'algoritmo non si ridimensioni davvero male. Se qualcuno presenta una tecnica all'avanguardia per il raytracing, sono più interessato alle tecniche computazionali come il modo in cui rappresentano e accedono ai dati piuttosto che alla complessità algoritmica perché in questo scenario competitivo e innovativo è già data una ragionevole scalabilità. Non puoi essere competitivo inventando algoritmi che non si adattano.
Naturalmente, se stai confrontando la complessità quadratica con la linearitmica, questa è una differenza enorme. Ma la maggior parte delle persone nel mio campo sono abbastanza competenti da evitare di applicare un algoritmo di complessità quadratica su un input epico. Quindi la scalabilità è spesso profondamente implicita e le domande più significative e interessanti diventano: "Hai usato GPGPU? SIMD? Funziona in parallelo? Come hai rappresentato i dati? Hai riorganizzato per schemi di accesso compatibili con la cache? Come ci vuole molta memoria? Può gestire in modo efficace questo caso? Stai rinviando determinati processi o esegui tutto in una volta sola? "
Anche un algoritmo linearitmico può sovraperformare un algoritmo a tempo lineare se il primo accede alla memoria in un modello più ottimale, ad esempio, o è più adatto per il multithreading e / o SIMD. A volte anche un algoritmo lineare può sovraperformare un algoritmo logaritmico per questi motivi, e gli algoritmi a tempo lineare naturalmente superano quelli logaritmici per gli input di adolescenti.
Quindi per me ciò che conta di più sono quelle che alcune persone potrebbero chiamare "microottimizzazioni", come rappresentazioni di dati (layout di memoria, schemi di accesso con suddivisione del campo caldo / freddo, ecc.), Multithreading, SIMD e occasionalmente GPGPU. In un campo in cui tutti sono già abbastanza competenti da utilizzare algoritmi decenti e all'avanguardia per tutto, con nuovi articoli che vengono sempre pubblicati, il vantaggio competitivo nel battere i maghi algoritmici non deriva da miglioramenti della complessità algoritmica tanto quanto più diretto efficienza computazionale.
Il mio campo è dominato da matematici brillanti, ma non sempre quelli che conoscono il costo computazionale di ciò che stanno facendo o molti trucchi di livello inferiore per accelerare il codice. Di solito questo è il mio vantaggio nel progettare algoritmi e strutture dati più veloci e più stretti, nonostante il mio sia molto meno sofisticato. Sto giocando a ciò che piace all'hardware, verso bit e byte e rendendo ogni iterazione di lavoro molto più economica anche se sto facendo alcune iterazioni di lavoro in più rispetto all'algoritmo davvero sofisticato - il lavoro nel mio caso è drasticamente più economico. Anche il codice che scrivo tende ad essere molto più semplice. Se le persone pensano che le versioni micro-ottimizzate di algoritmi e strutture di dati semplici siano difficili da capire e mantenere,
Come esempio di base, ho trovato una semplice struttura a griglia che ha finito per sovraperformare un albero KD presso la nostra azienda per il rilevamento delle collisioni e la rimozione di punti ridondanti. La mia stupida griglia grezza era molto meno sofisticata dal punto di vista algoritmico e sono molto più stupida matematicamente e algoritmicamente rispetto al ragazzo che ha implementato l'albero KD con il suo nuovo modo di trovare il punto mediano, ma ho appena sintonizzato l'utilizzo della memoria della griglia e i modelli di accesso e è bastato a superare qualcosa di molto più sofisticato.
Un altro vantaggio che ho che mi permette di sopravvivere in un campo dominato da persone molto più intelligenti di me è capire davvero come funziona l'utente, poiché utilizzo il software che sviluppo allo stesso modo. Questo mi dà idee per algoritmi che si allineano molto immediatamente con gli interessi degli utenti. Come esempio di base, la maggior parte delle persone cerca di accelerare cose come il rilevamento delle collisioni usando l'indicizzazione spaziale. Ho fatto una semplice osservazione di orientamento alla carriera quasi un paio di decenni fa per modelli organici che, ad esempio, se un personaggio si mette le mani sul viso, una struttura di indicizzazione spaziale vorrebbe dover dividere i nodi e fare costosi aggiornamenti se il personaggio poi si tolse la mano dalla faccia. Se invece esegui la partizione in base ai dati di connettività anziché alle posizioni dei vertici, puoi finire con una struttura gerarchica stabile che si aggiorna molto rapidamente e non ha mai bisogno di dividere o riequilibrare l'albero (deve solo aggiornare i riquadri di delimitazione in ogni fotogramma di animazione) ... cose come questa - algoritmi di un bambino senza un pesante background matematico potrebbe venire fuori se avessero appena compreso il concetto di base, ma quelli che sfuggivano ai matematici poiché non pensavano alle cose in un modo così vicino a come gli utenti lavoravano e pensavano troppo alle proprietà della geometria e non a come la geometria era comunemente usato. Vado abbastanza d'accordo appoggiandomi più alla conoscenza computazionale generale e alla conoscenza dell'utente finale che alla magia algoritmica. Quindi, comunque, non ho trovato così importante concentrarmi sulla complessità algoritmica.