Quanto è importante per un programmatore sapere come implementare un algoritmo QuickSort / MergeSort dalla memoria? [chiuso]


58

Stavo rivedendo le mie note e mi sono imbattuto nell'implementazione di diversi algoritmi di ordinamento.

Mentre tentavo di dare un senso all'implementazione di QuickSort e MergeSort, mi è venuto in mente che sebbene io programmi da vivere e mi ritenga decente in quello che faccio, non ho né la memoria fotografica né la pura capacità di cervello per implementare quegli algoritmi senza basandomi sulle mie note. Tutto quello che ho ricordato è che alcuni di quegli algoritmi sono stabili e altri no. Alcuni richiedono il tempo O (nlog (n)) o O (n ^ 2) per il completamento. Alcuni usano più memoria di altri ...

Mi sento come se non meritassi questo tipo di lavoro se non fosse perché la mia posizione non richiede che io usi nessun algoritmo di ordinamento diverso da quelli trovati nelle API standard. Voglio dire, quanti di voi hanno una posizione di programmazione in cui è davvero essenziale ricordare o inventare questo tipo di cose da soli?


13
Devi ricordare che esiste una soluzione e quando usarla. Quindi vai alla documentazione e implementala. Se non avessi saputo di quicksort o mergesort, avresti comunque usato Bollicort e guardato il tuo programma andare a gattonare e trovare soluzioni scadenti quando i dati aumentano.
Pieter B,

1
A parte le buone risposte menzionate di seguito, si noti che molte aziende richiedono (1) di conoscere la complessità di tali algoritmi, (2) essere fluenti nell'attuazione su una lavagna.
sakisk,

3
Sono sicuro che è importante memorizzare questi algos per la frequente presenza di Google offline. : o
Lee James,

Devi conoscere le loro prestazioni, i casi d'uso, ecc. Sapere come implementarli a memoria è qualcosa che è richiesto solo dalle aziende tecnologiche nelle interviste.
sakisk,

@PieterB, non sono d'accordo. Non è necessario conoscere "mergesort" e "quicksort" con l'algoritmo di ordinamento più performante di Google
hyankov,

Risposte:


117

Chiediamo ad Albert e vediamo cosa ha da dire sull'argomento:

"Non ho bisogno di sapere tutto, ho solo bisogno di sapere dove trovarlo, quando ne ho bisogno"

- Albert Einstein , parafrasato

Amen, fratello Albert, Amen.

Una volta che hai fatto un buon sondaggio degli algoritmi essenziali in una particolare disciplina (ordinamento, ricerca, qualunque cosa), puoi quindi dimenticare i dettagli di implementazione fino a quando non hai effettivamente bisogno dell'algo, nel qual caso vai a cercarlo o utilizzare un lib preesistente 25 anni fa ho costruito un importante sistema di ricerca usando B * -trees, ma oggi avrei bisogno di RTFM per usarli bene.



9
Come risponde alla domanda? Ha detto "Non ho bisogno di sapere tutto", non ha detto "Non ho bisogno di sapere nulla". Alcune abilità sono fondamentali e l'intera domanda riguardava se una particolare informazione appartenesse o meno alla categoria delle abilità fondamentali.
Konrad Rudolph,

1
Pensare che l'obiettivo è quello di memorizzare quicksort è perdere il punto della domanda. Ovviamente, nel mondo reale, se avessi bisogno di un quicksort generico, utilizzeresti la routine della libreria o cercheresti il ​​codice e lo copierei. Il test è vedere se capisci la ricorsione, invarianti di loop, ecc. E chiederti di annotare rapidamente un algoritmo di ordinamento è solo una dimostrazione molto semplice di quella conoscenza. Se non sei in grado di ricavare sul posto un quicksort di 20 righe, quante cose stai facendo abitualmente in modo inefficiente o errato senza nemmeno saperlo?
Larry Gritz,

3
@Larry: Penso di aver dimenticato più di quanto molti programmatori conoscano i dettagli degli algoritmi- e l'ordinamento rapido da zero è uno di questi - per un'ottima ragione - ho scelto di leggere cose di alto livello e usare piuttosto linguaggi di alto livello di stare giù in ciotole con dettagli di implementazione di basso livello. Francamente - non mi importa quale tipo di routine di libreria sto usando - può usare pixy polvere e fate per quanto mi riguarda. I documenti diranno a O () per il dimensionamento, questo è tutto ciò che devo sapere.
mattnz,

2
@mattnz: un seguito un po 'tardivo al tuo "dimensionamento O ()". Una cosa che ho imparato nel modo più duro è che con un grande set di dati una cattiva località di riferimento può sopraffare completamente O (). Potresti avere un algo che lo è O(n log n), ma se ricevi molti errori di cache o (Dio non voglia) colpisci il disco, allora n log nsarà solo un bel ricordo.
Peter Rowell,

49
  1. Non è davvero una questione di memorizzazione. Si tratta di comprendere a fondo le classi generali di algoritmi come divide e conquistare. Se capisci davvero la divisione e la conquista, non è necessario memorizzare quicksort. Puoi recuperarlo sul posto, se necessario. Inoltre, il vero vantaggio non è nemmeno quello di essere in grado di ottenere da soli il quicksort, è che puoi riconoscere quando un nuovo problema è suscettibile di una soluzione di divisione e conquista.

  2. Non tutti i lavori di programmazione sono uguali. Alcuni lavori necessitano di una profonda conoscenza degli algoritmi, altri hanno bisogno di persone che capiscono la teoria dei tipi, e altri hanno solo bisogno di persone che possono acquisire dati da un modulo Web e spostarli in un database. Alcuni lavori richiedono anche tutte quelle abilità contemporaneamente. In che tipo di lavoro vuoi lavorare?


5
Non credo sia possibile comprendere QuickSort senza ricordare QuickSort. Non è una cosa complicata e arcana, sono solo due idee generiche combinate. La stessa cosa vale per merge-sort, ma lì hai solo un'idea: P
drxzcl

Non sono d'accordo con il 2 ° punto. tutti i lavori sono uguali, cambiano solo gli intervistatori. questo conosce l'ordinamento molto bene e pensa che ogni buon programmatore debba conoscere l'ordinamento, perché questo è tutto ciò che sa e che gli interessa.
IAdapter,

2
@Adapter, sicuramente scherzi! So per esperienza personale che le conoscenze e le competenze di cui avevo bisogno per il mio primo lavoro di scrittura di macro TROFF per un'azienda di software termoretraibile sono molto diverse da quelle di cui ho bisogno per il mio attuale lavoro in un laboratorio di biologia computazionale.
Charles E. Grant,

@ CharlesE.Grant il più delle volte l'intervistatore non verifica se hai le competenze necessarie per svolgere il tuo lavoro (non ricordo l'ultima domanda javascript / css che mi è stata posta e faccio webapps).
IAdapter,

10

Penso che l'unica volta che è necessario ricordare sia quando si richiede un lavoro quando si devono trovare risposte sul posto e non avere risorse esterne.

Ho avuto colleghi che riscrivono quicksort e quant'altro, ma continuo a dire loro di tornare a usare le funzioni di ordinamento integrate che sono nella lingua. So che, a seconda del tipo di progetti su cui lavoriamo, dobbiamo ricordare altri algoritmi poiché di solito non sono inclusi nelle librerie standard, ma l'ordinamento non è uno che viene fuori dal momento che di solito è incorporato nel linguaggio.

Quando dobbiamo ricordare quegli algoritmi, di solito ci rivolgiamo a google o a un libro, e di solito non è alla ricerca di un'implementazione specifica, ma quale sarebbe la migliore implementazione per il nostro problema.


6

Basta ricordare quale algoritmo è utile in quali scenari, sarebbe più che sufficiente per aiutarti durante il tuo lavoro. In effetti, la maggior parte dei lavori di programmazione non richiede la memorizzazione dell'approccio, ma sono interessati al modo in cui si riconosce il modello algoritmico di fronte al problema .

È un dato di fatto, ci sono molte informazioni nella maggior parte dei blog / articoli di programmazione su argomenti di algoritmo. Pertanto, la memorizzazione dell'esatta implementazione non ha importanza. La maggior parte delle informazioni preziose sarebbe avere un'idea di base su quale tipo di algoritmo è disponibile e quale problema specifico sono bravi a risolvere . Cercare un'implementazione esatta una volta che sai cosa stai cercando è piuttosto veloce.

In sintesi, è sempre meglio sapere cosa cerchi e dove sono i riferimenti - che ti guideranno alla fonte.


5

L'implementazione esatta non è molto importante. Ma i principi alla base di mergesort / quicksort - ricorsione, partizionamento ecc. Sono molto basilari e tutti i programmatori dovrebbero capire. Questi algoritmi sono in realtà molto semplici da descrivere a parole una volta che hai capito.

Non è davvero un problema se puoi cercarlo o se puoi cercarlo su Google, è se il programmatore capisce queste tecniche di risoluzione dei problemi e può applicarsi ad altre situazioni.


3

Sono di due menti su questo argomento. Conosco molti programmatori che non sanno cos'è un algoritmo di ordinamento, ma fanno abbastanza bene il loro lavoro. Credo anche nella comprensione dei principi per comprendere veramente il dominio.

È difficile per me avere una risposta imparziale su questo argomento poiché sto programmando da così tanto tempo che probabilmente ho dimenticato più algoritmi che conosco attualmente - ma conosco ancora quelli di ordinamento menzionati in questa domanda. Penso che i leader del pensiero di Agile (ad es. Ron Jeffries, Alistair Cockburn) abbiano delle buone idee vicino a questa idea (ad es. Shu-Ha-Ri).

In sintesi a questa risposta sconclusionata: utilizzare sicuramente l'API (NIH è un segno di immaturità dello sviluppatore), ma comprendere sempre i principi sottostanti. Spero che questo possa essere d'aiuto.


2

L'ordinamento e la ricerca sono incredibilmente importanti, che tu sia un fan di Donald Knuth o desideri essere la prossima Larry Page. A seconda del settore in cui ti trovi e del livello di concorrenza che puoi comandare tra i tuoi candidati, ti consiglio di includere alcuni dei seguenti concetti nell'intervista.

Ordinamento

  • Schizzo di una sorta di algoritmo di ordinamento.
  • Elenca alcuni esempi di algoritmi di ordinamento.
  • Confronta / contrapponi due tipi con caratteristiche prestazionali diverse.
  • Se non menzionano l'uso della memoria, chiedilo.

ricerca

  • Nomina quanti più algoritmi di ricerca puoi.
  • Confronta / contrapponi due algoritmi di ricerca.
  • Disegna qualsiasi ricerca diversa dalla ricerca lineare.

Alcuni potrebbero dire che richiedere il codice per questi algoritmi è eccessivo a meno che il lavoro non si trovi su un'isola deserta senza connessione a Internet. Un'altra considerazione è che se hai 30 minuti e vuoi chiedere qualcos'altro, per molti candidati, implementare questo tipo potrebbe richiedere molto tempo.


Pensavo che chiedere alle persone di programmare le interviste fosse sciocco, ma non crederesti al numero di persone con curriculum apparentemente fantastici e che rispondono alle domande "sociali" a pieni voti, ma che, per la loro vita, non possono annotare una corretta implementazione di 'strcat' o qualche altra semplice funzione. Diverse volte questo mi ha salvato dall'assumere qualcuno che, se non fosse stato per la domanda stupida sul codice, avrebbe potuto causare un dolore senza fine e trascinare la squadra giù con incompetenza.
Larry Gritz,
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.