Quanto è importante imparare gli algoritmi per i programmatori linguistici di alto livello [duplicato]

8

Oggi ho imparato l'Algoritmo di ordinamento rapido. Dubito che applicherò mai la mia versione anche se C # ha il proprio metodo di ordinamento per liste e array.

Quanto è importante imparare gli algoritmi per i programmatori linguistici di alto livello? Nel mio esempio non ho ottenuto alcun vantaggio dalla conoscenza dell'algoritmo, ma forse il mio esempio era troppo banale per essere accurato?

    
posta Tom Squires 01.12.2011 - 10:20
fonte

12 risposte

8

Quale algoritmo di ordinamento hai imparato? Quicksort, heapsort, bucket sort, insertion sort, radix sort, bubble sort o un gruppo di possibili altri ? Quale algoritmo di ordinamento utilizza C #?

Quello che sto ottenendo è che ci sono molte possibili strategie per molti algoritmi e strutture dati (i contenitori sono un altro buon esempio) che ognuno ha i suoi vantaggi e svantaggi. Ogni singola implementazione "generica" avrà fatto una scelta specifica riguardo a quei vantaggi e svantaggi - e quella scelta potrebbe non essere ottimale per il tuo problema particolare .

Ora, potrebbe non essere un problema, visto che non vuoi comunque ottimizzarlo prematuramente, ma essere inconsapevole di queste scelte, inconvenienti e benefici ti lascia un vuoto punto cieco nel tuo well- arrotondatezza come sviluppatore.

    
risposta data 01.12.2011 - 10:32
fonte
29

Sai che non scriverai sempre codice banale, ad un certo punto dei tuoi progetti dovrai scrivere un algoritmo che risolve un problema difficile, ad esempio confrontando gli oggetti tra loro in base ad alcuni dati. E quando lo farai, avrai in mente la complessità di un algoritmo, quindi la soluzione che avresti avrà una prospettiva di un progettista di algoritmi.

    
risposta data 01.12.2011 - 10:25
fonte
6

I doubt I will ever implement my own version though as C# has its own built in Sort method for lists and arrays.

Supponiamo che tu abbia bisogno di un algoritmo mediano veloce. Poche librerie standard sono consapevole di avere una cosa così integrata. Ma se sai come funziona quicksort, è molto semplice modificarlo per ottenere un algoritmo per trovare la mediana nel tempo O (n). Il mio punto è: Algoritmi e strutture di dati spesso devono essere modificati per un problema specifico, e per essere in grado di farlo, è necessario conoscerli e capirli.

    
risposta data 01.12.2011 - 12:34
fonte
3

Penso che non dovresti essere ingannato dal fatto che vuoi programmare in un linguaggio di alto livello. Un linguaggio di alto livello ti offre molte astrazioni (tipi di dati, strutture di controllo, gestione della memoria, librerie standard, ecc.) Che ti semplificano alcune attività.

Di conseguenza, un'attività che una volta sembrava molto complessa (ad esempio l'invio di un'e-mail tramite smtp) ora può essere raggiunta eseguendo alcune chiamate ad alcune funzioni della libreria. Qual è la conseguenza di questo? Che è possibile costruire applicazioni che sono molto più complesse di prima.

Quindi, alla fine della giornata, avrai ancora a che fare con progetti software molto complessi perché i linguaggi di alto livello hanno solo portato la complessità del software a un livello diverso. Ciò che intendo è che, ad esempio, l'implementazione di un'applicazione aziendale in C #, Java o Scala può essere complessa quanto (o anche più complessa di) implementare un driver di periferica in C / assembly.

Quindi IMO, i linguaggi di programmazione di alto livello non ti proteggeranno dal dover affrontare problemi algoritmici o architetturali reali: hanno reso attività di programmazione specifiche più semplici, ma non hanno reso la programmazione meno difficile o impegnativo in generale.

    
risposta data 01.12.2011 - 19:34
fonte
2

Non useresti un C # costruito nel metodo Sort (o qualsiasi altra cosa per quello) senza sapere cosa fa e come funziona, in tutti i suoi dettagli - che non è semplicemente un programmatore. Però potresti essere un eccellente aiuto per la programmazione di un programmatore.

    
risposta data 01.12.2011 - 12:14
fonte
2

La conoscenza dell'algoritmo è assolutamente essenziale per i programmatori per i seguenti motivi:

  1. La programmazione è tutto sulla gestione di grandi quantità di dettagli. Dettagli che sono tutti collegati insieme a un sistema coerente. Gli algoritmi sono solo modelli di dettagli ben noti, in cui sono note le soluzioni. Il 99% dei casi i dettagli non sono strutturati come si aspettano modelli ben noti e gli algoritmi devono essere personalizzati per la particolare situazione: non è possibile scrivere alcun software significativo senza la conoscenza dell'algoritmo.
  2. Le strutture dati sono un altro aspetto dello stesso problema. La memoria del computer ci consente di memorizzare le informazioni. Ma decidere una corretta rappresentazione nella memoria del computer per quella informazione in ogni stato durante l'esecuzione dell'algoritmo è un problema significativo in sé. Se ci sono problemi con gli algoritmi di apprendimento, quindi l'apprendimento delle strutture dati è un modo più semplice per imparare la stessa cosa.
  3. Alla fine, si tratta di bit nella memoria del computer. È 0 o 1. Ci sono sequenze di bit come 010, e poi quelle sono inserite in scatole all'interno di tipi di dati. Durante la vita dei dati, il valore dei bit cambierà e il sistema passerà da uno stato a un altro ripetutamente, e infine una forma normale - il risultato del programma viene raggiunto e l'esecuzione si interrompe finché non viene nuovamente attivata da un evento esterno.
  4. Queste sequenze di esecuzione nel programma dall'attivazione dell'esecuzione alla forma normale possono diventare molto complesse. Gestire questa complessità insieme alle modifiche dei dati è ciò che gli algoritmi sono tutti.
risposta data 01.12.2011 - 18:01
fonte
1

Gli algoritmi di apprendimento (e, ultimo ma non meno importante, le strutture dati) sono i più importanti. Anche se ovviamente dovresti usare la funzione di ordinamento della libreria della tua lingua, allora sai che l'ordinamento non è un'operazione a buon mercato, quindi scriverai il tuo codice in modo che l'ordinamento avvenga nel momento giusto.

    
risposta data 01.12.2011 - 11:37
fonte
1

Non devi sapere molto su come funziona una macchina per guidarla, ma quasi sicuramente, nel migliore dei casi, sarai solo un pilota relativamente medio. Più conosci le auto, meglio puoi guidarle. Per essere un pilota d'élite, saprai il più possibile su ogni dettaglio della tua auto, il suo motore, anche la tua fisiologia e l'ergo-dinamica del cockpit. Quindi non importa molto quale macchina guidi, sarai in grado di valutare rapidamente le sue capacità e guidarla in modo efficace.

O, semplicemente, come con qualsiasi cosa, più sai, meglio sarà la professione che occuperai.

    
risposta data 01.12.2011 - 15:24
fonte
1

Ogni programma è un algoritmo. Gli algoritmi di apprendimento riguardano l'apprendimento dei modelli più generici e dei concetti coinvolti. Non ho mai bisogno di un algoritmo di ordinamento da solo, ma ho bisogno di un ordinamento più un albero più una serie unica di passaggi per risolvere un problema. Finisco con un algoritmo unico per questo problema.

Se non sono a conoscenza della progettazione degli algoritmi, come risolverò il mio problema? Probabilmente non scriverà un nuovo tipo, ma la citazione classica "Strutture dati + algoritmi = programma" è vera per ogni programma. Devi sapere quale algoritmo utilizzare dove e come crearne uno.

Lascio da parte completamente il fatto che gli algoritmi sono inutili in un vuoto di dati.

    
risposta data 01.12.2011 - 17:37
fonte
0

Ci sono dozzine di domande su Programmers.SE del modulo "Devo sapere che X è un programmatore di successo?". La programmazione è un'enorme arena con migliaia di diversi tipi di lavoro, quindi non importa quale sia la 'X', la risposta è 'No', perché è possibile trovare alcuni sottoinsiemi di lavori di programmazione che non richiedono 'X'.

Sfortunatamente, ciò che di solito non viene detto è che ogni volta che decidi di "cavartela" e fai fuori qualcosa, stai implicitamente facendo delle scelte sui tipi di lavori di programmazione che dovrai intraprendere in futuro. Nessuno di noi può sapere tutto, quindi queste scelte devono essere fatte, ma dovrebbero essere fatte con qualche pensiero per il futuro della tua carriera, non solo per evitare alcuni inconvenienti o sforzi attuali.

Sì, ci sono molti lavori di programmazione in cui una conoscenza formale degli algoritmi andrebbe sprecata. La domanda è: sono quei tipi di lavoro che vuoi lavorare tra dieci anni? Altrimenti, dovresti iniziare a gettare le basi per qualificarti per altri lavori in futuro.

    
risposta data 01.12.2011 - 19:04
fonte
0

Funzionalità linguistiche e funzioni di libreria incorporate, come la funzione di ordinamento sono astrazioni. E quando una di quelle astrazioni perde , come fanno invariabilmente, non saprai cosa ti colpisce, se non lo fai capisco la complessità degli algoritmi.

    
risposta data 01.12.2011 - 19:55
fonte
-2

Non penso che per un algoritmo di apprendimento dei programmatori linguistici di alto livello sia importante essere produttivi. È come sapere come funziona il compilatore, come funziona il garbage collector, come funziona una macchina a stati finiti, perché le operazioni in virgola mobile possono portare a risultati di calcolo errati, come ASCII è diverso da UTF-8 e così via.

I linguaggi di alto livello, che nascondono deliberatamente elementi di basso livello dal programmatore, vogliono darti la possibilità di concentrarti sulle regole di business. Ho visto molti programmatori sprovvisti di conoscenze "di basso livello" e comunque lavorano correttamente.

Come un meccanico può ottenere il massimo dalla sua auto rispetto a un normale guidatore di auto, un programmatore con (almeno alcune) conoscenze "di basso livello" prenderà decisioni migliori. Per algoritmi di ordinamento questo significa ad esempio: Se sai che i dati sono in parte ordinati, probabilmente scegli Bubble sort. Il programmatore accanto a te, che non lo sa, potrebbe scegliere un algoritmo più lento. Farà il suo lavoro fatto: sì. Sarà in grado di spiegare agli stakeholder se può rendere l'ordinamento più veloce? Forse no.

Tuttavia: ha importanza? Per la maggior parte delle applicazioni che sono programmate con un linguaggio di programmazione di alto livello, raramente conta. Ma in quei rari casi, le decisioni sbagliate possono avere conseguenze devastanti. L'algoritmo di ordinamento errato renderà il tuo programma lento, la decisione sbagliata sulla codifica dei caratteri renderà impossibile l'internazionalizzazione e il tipo di numero sbagliato porterà a risultati di calcolo errati.

Quindi spetta a te: vuoi essere produttivo o vuoi prendere le decisioni giuste?

    
risposta data 01.12.2011 - 11:25
fonte

Leggi altre domande sui tag