Sì, direi che conoscere qualcosa sulla complessità computazionale è un must per qualsiasi programmatore serio. Finché non hai a che fare con enormi set di dati, starai bene non conoscendo la complessità, ma se vuoi scrivere un programma che affronti seri problemi, ne hai bisogno.
Nel tuo caso specifico, il tuo esempio di ricerca di componenti collegati potrebbe aver funzionato per grafici fino a nodi. Tuttavia, se provassi un grafico con 100.000 nodi, l'algoritmo del tuo docente probabilmente lo avrebbe gestito in 1 secondo, mentre il tuo algoritmo avrebbe richiesto (a seconda di quanto fosse grave la complessità) 1 ora, 1 giorno o forse 1 eternità.100100.000
Un errore un po 'comune che gli studenti fanno nel nostro corso sugli algoritmi è quello di scorrere su un array come questo:
while array not empty
examine first element of array
remove first element from array
Questo potrebbe non essere il codice più bello ma in un programma complicato potrebbe apparire qualcosa di simile senza che il programmatore ne sia consapevole. Ora, qual è il problema con questo programma?
Supponiamo di eseguirlo su un set di dati di elementi. Rispetto al seguente programma, il precedente programma eseguirà 50.000 più lentamente.100.00050.000
while array not empty
examine last element of array
remove last element from array
Spero che tu sia d'accordo che avere le conoscenze per far funzionare il tuo programma volte più velocemente è probabilmente una cosa importante per un programmatore. Comprendere la differenza tra i due programmi richiede alcune conoscenze di base sulla teoria della complessità e alcune conoscenze sui particolari del linguaggio in cui si sta programmando.50.000
Nel mio linguaggio pseudocodice, "la rimozione di un elemento da un array" sposta tutti gli elementi a destra dell'elemento che viene rimosso di una posizione da sinistra. Questo rende la rimozione dell'ultimo elemento un'operazione poiché per fare ciò dobbiamo solo interagire con 1 elemento. La rimozione del primo elemento è O ( n ) poiché per rimuovere il primo elemento dobbiamo spostare anche tutti gli altri n - 1 elementi di una posizione verso sinistra.O ( 1 )O ( n )n - 1
Un esercizio di base nella complessità è dimostrare che il primo programma farà operazioni mentre il secondo programma utilizza solonoperazioni. Se inseriscin=100.000vedrai che un programma è drasticamente più efficiente dell'altro.12n2nn = 100.000
Questo è solo un esempio di giocattolo, ma richiede già una comprensione di base della complessità per dire la differenza tra i due programmi, e se stai effettivamente cercando di eseguire il debug / ottimizzare un programma più complicato che ha questo errore ci vuole una comprensione ancora maggiore per trovare fuori dove si trova il bug. Perché un errore come rimuovere un elemento da un array in questo modo può essere nascosto molto bene dalle astrazioni nel codice.
Avere una buona comprensione della complessità aiuta anche a confrontare due approcci per risolvere un problema. Supponiamo che tu abbia escogitato due diversi approcci per risolvere il problema dei componenti collegati da solo: per decidere tra loro sarebbe molto utile se tu potessi (rapidamente) stimarne la complessità e scegliere quello migliore.