Czy Ruby nadaje się do nauki algorytmów i struktur danych?
Tak, do nauki i na rozmowy w firmach pracujących z Rails: kod jest tak krótki jak w Pythonie, a bloki sprawiają, że przejścia po strukturach wyglądają jak sam algorytm. Warto znać dwie luki. Biblioteka standardowa nie ma kopca, kolejki priorytetowej, listy wiązanej ani drzewa, więc piszesz je samodzielnie. Poza tym Array#sort nie obiecuje stabilności, więc gdy równe elementy muszą zachować kolejność, sortuj po parze: sort_by.with_index { |x, i| [x, i] }.
Które klasy Ruby odpowiadają którym strukturom danych?
Array to tablica dynamiczna, która służy jako stos (push, pop) i kolejka (push, shift). Hash to tablica mieszająca pamiętająca kolejność wstawiania, a Set z biblioteki standardowej to zbiór oparty na haszowaniu. I to cała lista. Nie ma kopca, kolejki priorytetowej, listy wiązanej, drzewa, drzewa trie ani grafu, więc te budujesz samodzielnie, w krokach pierwszym i drugim.
Jak napisać kolejkę priorytetową w Ruby?
Ruby nigdy jej nie dostarczył, więc są trzy uczciwe odpowiedzi: sortować tablicę po każdym wstawieniu, O(n log n) za każde dodanie; utrzymywać ją posortowaną przez bsearch_index i insert, O(n) za każde dodanie; albo napisać kopiec binarny na Array, O(log n) zarówno dla dodania, jak i zdjęcia. Trzeciej odpowiedzi szuka rekruter, a w kroku drugim ją budujesz.
Dlaczego kolejność wstawiania w Hash w Ruby ma znaczenie dla algorytmów?
Bo zamienia niektóre klasyczne projekty w kilka linijek. Pamięć podręczna LRU, ulubione zadanie rekrutacyjne, to Hash, w którym odczyt usuwa klucz i wstawia go ponownie, żeby przenieść go na koniec, a usuwanie najstarszego wpisu to shift. W większości języków wymaga to tablicy mieszającej i listy dwukierunkowej, czyli struktur, które budujesz w krokach pierwszym i drugim, więc potrafisz wyjaśnić, co Ruby robi za ciebie.
Które kursy z tej ścieżki nie są prowadzone w Ruby?
Trzy: programowanie dynamiczne i seria rekrutacyjna w Pythonie, prowadzone w Pythonie, oraz operacje na bitach, prowadzone w C++. Są wymienione po krokach, każdy z linkiem, który otwiera go w jego własnym języku. Memoizacja w Ruby może być Hash z domyślnym blokiem, jak w Hash.new { |h, n| h[n] = n < 2 ? n : h[n - 1] + h[n - 2] }, a n[i] odczytuje bit i liczby całkowitej bezpośrednio, tam gdzie C++ pisze (n >> i) & 1.
Czy muszę znać Ruby, zanim zacznę tę ścieżkę?
Przynajmniej metody, bloki, tablice, hashe i klasy. Jeśli to dla ciebie nowość, kurs Ruby w Coddy najpierw cię tam doprowadzi, za darmo, a ta ścieżka zaczyna się tam, gdzie on się kończy.