Devo continuare a investire in strutture di dati e algoritmi? [chiuso]


28

In questi giorni, sto investendo molto in strutture di dati e algoritmi e sto cercando di risolvere alcuni enigmi di programmazione.
Sto provando a programmare e risolvere con Java e Clojure.

Sto sprecando il mio tempo? dovrei investire di più in tecnologie e framework che già conosco per acquisire conoscenze più approfondite (dettagli interni ed esterni) ed essere in grado di codificare con loro più rapidamente?

Studiando strutture di dati e algoritmi, diventerò un programmatore migliore o quelle materie sono importanti solo durante gli anni del college?


5
Con quali strutture di dati e algoritmi stai lavorando? Su quali puzzle di programmazione li stai usando?
oosterwal,

Sto lavorando / ancora a lavorare su tabelle hash, mappe, heap, grafici, alberi e gli algoritmi di accompagnamento (attraversamento, hash, ricerca, inserimento, eliminazione e alcuni algoritmi di ordinamento). I puzzle provengono dalle competizioni TopCoder e Google Code Jam.
Chirone,

Risposte:


24

È del tutto possibile trascorrere gran parte della tua carriera facendo un lavoro utile e significativo, con una conoscenza minima di algoritmi e strutture di dati.

Il livello minimo di conoscenza di algoritmi e strutture dati, per avere successo, richiederà di:

  • essere consapevoli della maggior parte di essi (inclusa la lettura di quelli nuovi occasionalmente quando escono)
  • sapere dove trovare implementazioni valide, testate e funzionanti
  • essere in grado di confrontare gli algoritmi e la loro utilità
  • essere in grado di copiarne correttamente uno da un esempio open source nel proprio ambiente specifico, con un piccolo ritocco

Non esiste * massimo * . Se lo desideri, puoi portare il tuo studio a livello di dottorato e oltre. La sua utilità è direttamente correlata al tipo di lavoro che ti interessa svolgere e al tipo di lavoro che ritieni più interessante e gratificante.

Detto questo, come una linea guida approssimativa (ma non assoluta), più basso livello, più dispendioso in termini di risorse e meno automatizzato della lingua, della struttura e dell'applicazione su cui stai lavorando, maggiore sarà il livello di abilità richiesto quando arriverà agli algoritmi e alle strutture dati. Ad esempio, l'implementazione dell'algoritmo di Ukkonen in assembly probabilmente, ma non necessariamente, significa che vorrai una comprensione a livello di master dell'algoritmo e delle strutture dati coinvolte.

Nella tua situazione specifica, passando da un background di sviluppo Java a lavorare sugli iO, a parità di condizioni, ti aspetti una domanda leggermente più alta sulla tua comprensione generale di algoritmi e strutture di dati. Ti consigliamo di essere in grado di funzionare in modo efficiente su un dispositivo con meno risorse disponibili. Inoltre, aspettati di aggiungere un paio di nuove categorie al tuo arsenale - in particolare, vorrai saperne di più sulla gestione della memoria.


2
Sono assolutamente d'accordo. Non ho quasi mai a che fare direttamente con gli algoritmi poiché la stragrande maggioranza di quelli necessari sono già inclusi nelle librerie di base. Ma sarei nei guai se non capissi abbastanza le caratteristiche prestazionali da scegliere l'algoritmo o la struttura appropriati per un particolare caso d'uso. OP, a meno che tu non voglia lavorare con algoritmi, puoi ottenere un ritorno sugli investimenti molto, molto , molto migliore per il tempo dedicato all'apprendimento di altre librerie, strumenti e tecniche.
Quentin-starin,

1
Ugh, scrivere l'algoritmo di Ukkonen in Python è abbastanza difficile, posso persino immaginare di farlo in assemblea.
rjzii,

2
Questo rientra nel punto degli "algoritmi di confronto", ma volevo solo chiarire che dovresti conoscere il compromesso tra spazio e complessità temporale. Molti algoritmi comunemente utilizzati sui desktop a causa della loro velocità potrebbero non essere fattibili su iOS perché richiedono strutture di dati di grandi dimensioni.
Karl Bielefeldt,

3
Non sono d'accordo. La semplice ragione è quando qualcuno passa il tempo ad imparare algoritmi o progettazione o architettura non si tratta solo di quando / dove lo userà. Rende solo la persona più intelligente e potrebbe usare l'apprendimento mentre risolve altri problemi. Incoraggia anche il senso di fare le cose in modo ottimale. Per es. potrebbe non esserci un algoritmo fatto a mano per tutto, ma dal momento che conosci molte cose potresti venire con qualcosa di eccezionale da solo.
Geek,

14

Nah. Se hai appena iniziato, cerca di entrare in immagini di grandi dimensioni come la programmazione dell'interfaccia utente e tali ti trattengono. Alla fine devi andare lì e imparare quadri più grandi ... come usare le strutture dati e gli algoritmi che ALTRE persone hanno scritto. Quando hai appena iniziato, è bene attenersi a problemi di portata limitata.

Gli algoritmi e le strutture dati sono fondamentalmente alla base di tutto, anche se probabilmente non ne scriverai mai uno dopo aver superato la fase per principianti. Conoscerli, o almeno averli conosciuti, alla fine ti renderà uno sviluppatore migliore. Saprai quando e perché usarli perché saprai come funzionano. Inoltre, rendere generici i tuoi algoritmi e le strutture di dati in modo che possano funzionare con qualsiasi tipo o tipo con l'interfaccia X È davvero qualcosa che utilizzerai per il resto della tua carriera.

Vedo troppe persone saltare in cose come Qt che finiscono per porre domande che mostrano una conoscenza zero del C ++ (per esempio). Stanno cercando di saltare troppi passaggi e alla fine impiegano più tempo per imparare. Direi che sei sulla buona strada.


Faccio la programmazione Java professionalmente (essendo impiegato, intendo) dal 2007. Ora vado (almeno spero) a fare un po 'di sviluppo iOS.
Chirone,

9

Non stai perdendo tempo.

Se, nel corso del tuo lavoro, devi utilizzare uno strumento o un framework che non hai mai usato in precedenza, lo imparerai e lo userai.

Tuttavia, se devi utilizzare una struttura di dati o un algoritmo che non hai mai usato in precedenza, è probabile che non saprai nemmeno che esiste e risolverai il tuo problema utilizzando una tecnica orribilmente subottimale che richiede un sacco di più sforzo e scala terribilmente.

Quello che sto cercando di dire è che questo è il genere di cose che non imparerai semplicemente facendo, devi impararlo imparando , in una situazione accademica, o attraverso un investimento personale di sforzo, come sei facendo ora.


6

In pratica, sii consapevole di quali sono le strutture di dati disponibili, quali sono le loro caratteristiche di complessità, dove ottenerne buone implementazioni e dove conservi la tua copia di Introduzione agli algoritmi per consultare i dettagli in seguito.


1

Se questo è ciò che ti rende felice, allora dovresti assolutamente attenerci. Se sei preoccupato di non applicare abbastanza teoria, considera un progetto pesante per la teoria. Crea da zero un piccolo linguaggio di programmazione, come Pozione . Un'implementazione completa utilizzerà tabelle hash, grafici, alberi e una vasta gamma di algoritmi. Se sembra interessante, puoi approfondire l'ottimizzazione, la generazione di codice nativo o l'estensibilità dell'utente.

Diventerai un programmatore migliore quando rimani interessato e concentrato, non quando lavori su progetti che sembrano pratici ma un po 'noiosi.

Nella tana del coniglio, Dorothy!


1

Ho trascorso molto tempo a fare hacking in C / C ++ con OpenGL. Conosco abbastanza bene le lingue e le API ... e sono diventato uno sviluppatore e programmatore ragionevole grazie a quell'esperienza. Detto questo, l'effettiva conoscenza algoritmica richiesta per risolvere i vari problemi riscontrati sono stata in grado di comprendere.

Parlando per esperienza personale, concentrarsi sulla costruzione di applicazioni sarà uno spreco di tempo se non si conosce la teoria alla base dei domini problematici che riguardano ciò che si sta cercando di costruire.

Per molti diversi tipi di software, questi domini deriveranno dai fondamenti che apprendi dallo studio degli algoritmi, oltre alla loro specifica teoria basata sulla nicchia (ad esempio, algebra lineare in computer grafica, teoria dei numeri / informazioni nella crittografia, ecc.).

Non devi necessariamente diventare un mago computazionale dietro ogni cosa, ma fare quello che stavi facendo al momento di questo post è un percorso molto, molto necessario per scendere almeno una volta nel tuo viaggio di programmazione - indipendentemente dal fatto che o non sono autodidatti.


0

Immagino che se non li conosci bene non troverai motivi per usarli. Mi sembra di trovare sempre degli usi per loro. Ma devo ammettere che con i miglioramenti dei farmaci generici nell'ultima mezza dozzina di anni circa, la necessità di realizzare il tuo si verifica sempre meno frequentemente. Ciò non toglie ancora i vantaggi di sapere come e quando usarli e possono semplificare notevolmente il codice altrimenti complicato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.