Czy Rust nadaje się do nauki algorytmów i struktur danych?
Do korzystania z nich bardzo: standardowe kolekcje są szybkie i dobrze udokumentowane, sort jest stabilne, a bezpieczny Rust wyklucza wiszące wskaźniki i wyścigi danych już na etapie kompilacji, bez garbage collectora. Pisanie struktur opartych na wskaźnikach jest trudniejsze niż w C czy Javie, bo własność wyklucza współdzielone, mutowalne połączenia, chyba że świadomie sięgniesz po Rc i RefCell, a lista dwukierunkowa czy drzewo ze wskaźnikami do rodzica składają się właśnie z nich. Ta trudność jest też lekcją: gdy potrafisz je napisać w Rust, wiesz dokładnie, kto jest właścicielem czego.
Które kolekcje Rusta odpowiadają którym strukturom danych?
Vec<T> to tablica dynamiczna i twój stos, VecDeque<T> to bufor cykliczny i twoja kolejka, HashMap i HashSet to tablice mieszające (domyślnie SipHash, odporny na celowe kolizje kosztem pewnej szybkości), BTreeMap i BTreeSet to uporządkowane B-drzewa, BinaryHeap<T> to kopiec maksymalny, a LinkedList<T> to lista dwukierunkowa, którą rzadko wybierzesz zamiast Vec czy VecDeque. Nie ma typu drzewa trie ani grafu, te budujesz samodzielnie.
Dlaczego listę wiązaną tak trudno napisać w Rust?
Bo każda wartość ma dokładnie jednego właściciela. Lista jednokierunkowa pasuje do tej reguły: każdy węzeł jest właścicielem następnego przez Option<Box<Node>>. Lista dwukierunkowa albo drzewo z odnośnikami do rodzica już nie, bo do każdego węzła prowadzą dwa wskaźniki, więc sięgasz po Rc<RefCell<Node>> z Weak dla odnośników wstecznych albo trzymasz węzły w Vec i łączysz je indeksami. Learning Rust With Entirely Too Many Linked Lists powstał dlatego, że tak wiele osób utyka właśnie tutaj.
Jak uzyskać kopiec minimalny w Rust?
BinaryHeap<T> to kopiec maksymalny, więc opakuj każdy element w std::cmp::Reverse: wstaw Reverse(x), a najmniejsze x wyjdzie pierwsze. W algorytmie Dijkstry wstawiaj Reverse((distance, node)), a krotka porówna się najpierw po odległości. Gdy w kroku drugim samodzielnie napiszesz kopiec, odwrócenie jego porządku staje się oczywiste.
Które kursy z tej ścieżki nie są prowadzone w Rust?
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. Tablica memoizacji w Rust to Vec albo HashMap, a przepełnienie liczby całkowitej w kompilacji debug wywołuje panikę, więc sztuczka bitowa, która polega na zawijaniu, zapisuje to jawnie przez wrapping_add albo wrapping_mul.
Czy muszę znać Rusta, zanim zacznę tę ścieżkę?
Przynajmniej własność, pożyczanie, struktury, typy wyliczeniowe i Option. Box i traity pomagają. Jeśli to dla ciebie nowość, kurs Rusta w Coddy najpierw cię tam doprowadzi, za darmo, a ta ścieżka zaczyna się tam, gdzie on się kończy.