Ruby va bene per algoritmi e strutture dati?
Sì, per imparare e per i colloqui nelle aziende che usano Rails: il codice è breve quanto quello di Python, e i blocchi fanno sì che le visite si leggano come l'algoritmo. Vale la pena conoscere due lacune. La libreria standard non ha heap, coda di priorità, lista concatenata o albero, quindi li scrivi tu; e Array#sort non garantisce la stabilità, quindi quando gli elementi uguali devono mantenere il loro ordine, ordina per coppie: sort_by.with_index { |x, i| [x, i] }.
Quali classi di Ruby corrispondono a quali strutture dati?
Array è un array dinamico che fa da pila (push, pop) e da coda (push, shift); Hash è una tabella hash che ricorda l'ordine di inserimento; e Set, nella libreria standard, è un insieme basato su hash. L'elenco finisce qui. Non esistono heap, coda di priorità, lista concatenata, albero, trie o grafo, quindi quelli li costruisci tu, nel primo e nel secondo passaggio.
Come si scrive una coda di priorità in Ruby?
Ruby non ne ha mai inclusa una, quindi ci sono tre risposte oneste: ordinare l'array dopo ogni inserimento, O(n log n) per ogni push; mantenerlo ordinato con bsearch_index e insert, O(n) per ogni push; oppure scrivere un heap binario su un Array, O(log n) sia per il push sia per il pop. La terza è quella che cerca chi ti fa il colloquio, e nel secondo passaggio la costruisci.
Perché l'ordine di inserimento in un Hash di Ruby conta per gli algoritmi?
Perché trasforma alcuni schemi classici in poche righe. Una cache LRU, un problema da colloquio molto amato, è un Hash in cui una lettura cancella e reinserisce la chiave per spostarla in fondo, e l'espulsione è shift, che rimuove la voce più vecchia. Nella maggior parte dei linguaggi servono una tabella hash più una lista doppiamente concatenata, le strutture che costruisci nel primo e nel secondo passaggio, così sai spiegare cosa fa Ruby per te.
Quali corsi di questo percorso non sono insegnati in Ruby?
Tre: la programmazione dinamica e la serie di colloqui in Python, insegnate in Python, e la manipolazione dei bit, insegnata in C++. Sono elencati dopo i passaggi, ognuno con un link che lo apre nel suo linguaggio. Una memoizzazione in Ruby può essere un Hash con un blocco predefinito, come in Hash.new { |h, n| h[n] = n < 2 ? n : h[n - 1] + h[n - 2] }, e n[i] legge direttamente il bit i di un intero, dove il C++ scrive (n >> i) & 1.
Devo conoscere Ruby prima di iniziare questo percorso?
Almeno metodi, blocchi, array, hash e classi. Se sono argomenti nuovi, il corso di Ruby di Coddy ti porta prima a quel punto, gratis, e questo percorso riprende da dove finisce.