В стандартной библиотеке Rust есть большинство структур (Vec, VecDeque, HashMap, BTreeMap, BinaryHeap), а у borrow checker есть своё мнение о тех, что вы пишете сами: односвязный список имеет вид Option<Box<Node>>, а дереву со ссылками на родителя нужны Rc, RefCell и Weak. На этом пути вы пишете каждую структуру на Rust, затем с их помощью сортируете, применяете рекурсию и обходите графы, а завершаете задачами с собеседований, проверяемыми тестами. Бесплатно, в браузере, с сертификатом за большинство курсов.
Каждый шаг состоит из уже существующих курсов Coddy, и каждая кнопка «Начать» открывает их на Rust. Три курса, которых пока нет на Rust, перечислены после шагов.
1
Шаг 1
Серия по структурам данных, часть первая
Начать этот шагНачатьСтек, очередь, двоичное дерево, хеш-таблица и связный список: каждую структуру вы пишете на Rust с нуля, а затем применяете для решения задач. В Rust узел, который владеет следующим, имеет вид Option<Box<Node>>, поэтому именно здесь владение начинает казаться естественным, а после этого шага вы знаете, что делают за вас Vec, VecDeque и HashMap.Начать
Начать этот шагНачатьДвусвязный список, кучи и очереди с приоритетом, префиксные деревья, графы и самобалансирующееся АВЛ-дерево. В Rust самым трудным оказывается двусвязный список, поскольку к каждому узлу ведут две ссылки; после этого шага BinaryHeap становится для вас кучей, которую вы уже писали (по умолчанию она отдаёт максимум первым), а в BTreeMap вы видите упорядоченное дерево, которое понимаете.Начать
Начать этот шагНачатьПузырьковая, выбором, вставками, слиянием, быстрая, пирамидальная, подсчётом и поразрядная сортировки: вы пишете их на Rust и наблюдаете в визуализаторе. sort сортирует устойчиво, а sort_unstable обычно быстрее; после этого шага вы можете сказать, чего стоит устойчивость и когда от неё стоит отказаться.Начать
Начать этот шагНачатьЗадачи на рекурсию на Rust. Рекурсивному типу нужен Box, иначе компилятор не сможет определить его размер, а рекурсивная функция над ним разбирает каждый случай, Some или None, так же, как разделяются базовый и рекурсивный случаи. Rust не обещает оптимизацию хвостовых вызовов, поэтому достаточно глубокая рекурсия переполняет стек и аварийно завершает программу. Динамическое программирование и битовые операции перечислены после шагов, так как они преподаются на Python и C++.НачатьСвоя страница15 уроков15 задачи
5
Шаг 5
Алгоритмы на графах
Начать этот шагНачатьПоиск в ширину и в глубину, Дейкстра, Беллман-Форд, топологическая сортировка, Крускал и Прим на Rust, поверх графа, который вы построили на втором шаге. В алгоритме Дейкстры роль очереди с приоритетом в Rust играет BinaryHeap из элементов Reverse((distance, node)): куча со второго шага, превращённая в min-кучу.Начать
Начать этот шагНачатьДесять наборов задач с собеседований и два банка задач по программированию на Rust с проверкой по тестам: незнакомые задачи, которые вы решаете без туториалов и проводите через borrow checker, а это само по себе своего рода доказательство.Начать
Всё, что вам нужно, чтобы научиться программировать
Учитесь на практике
Пишите реальный код, работайте с базами данных, создавайте сайты и осваивайте ИИ-промпты. Наши интерактивные уроки охватывают все навыки, необходимые современным разработчикам.
playground.js
Редактор кода
1const greeting ="Hello, Coddy!"
2function sayHi(name) {
3return greeting +" "+ name
4}
5
Тест №1
Тест №2
Тест №3
Ввод
"Alex"
Вывод
"Hello, Coddy! Alex"
Создайте свою серию
Будьте последовательны и наблюдайте за своим прогрессом! Отслеживайте ежедневную привычку программирования, защищайте свою серию с помощью дней заморозки и получайте награды за каждый день.
12 дней подряд
Возвращайтесь завтра, чтобы сохранить серию!
January 2026
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
21
22
23
24
25
26
27
28
29
30
Всё или ничего
День 5 из 7
Заморозка серии
2 left
Код где угодно
Возьмите свое путешествие по программированию с собой! Без настройки, без загрузок: просто откройте и начните программировать. Доступно на iOS, Android и Web с рейтингом 4.9 звезд.
Соревнуйтесь в глобальных рейтингах, приглашайте друзей, чтобы получать награды, и празднуйте успехи друг друга. Программировать веселее с друзьями!
Лига ПретендентовТоп 7 продвигаются
1
Alex7+ Days
2840
2
Jordan7+ Days
2650
3
Sam7+ Days
2420
4
Casey
2180
5
Morgan7+ Days
1950
Зона продвижения
Учитесь как угодно
Читайте, слушайте, проверяйте себя, спрашивайте у ИИ или ищите то, что уже изучили. Каждый урок подстраивается под вас.
Введение в переменные
Аудио
Переменная - это именованный контейнер, который хранит значение для последующего использования.
В Python вы создаёте её, написав имя, знак равенства и значение, которое нужно сохранить.
Значение может меняться. Переприсваивание просто направляет имя на новое значение.
1xSarah
Ваш сертификат
Получайте сертификаты за каждый завершенный курс. Добавьте их в свой профиль LinkedIn и резюме, чтобы продемонстрировать работодателям свои навыки программирования.
Владение там, где оно сложнее всего. Именно на связных списках и деревьях правила Rust впервые дают о себе знать: у каждого значения один владелец, а этим структурам нужны узлы, которые указывают друг на друга. Когда вы их пишете, Box, Option::take, Rc<RefCell<T>> и Weak перестают быть синтаксисом и становятся решениями, поэтому известное руководство по языку и называется Learning Rust With Entirely Too Many Linked Lists.
Коллекции с понятной стоимостью. Vec<T> служит вам стеком, VecDeque<T> устроен как кольцевой буфер и служит очередью, HashMap представляет собой хеш-таблицу, защищённую от намеренных коллизий случайным начальным значением, BTreeMap хранит ключи в упорядоченном B-дереве, а BinaryHeap<T> реализует max-кучу. Напишите структуры один раз, и вы будете знать, какая из них нужна задаче и почему алгоритм Дейкстры оборачивает свои элементы в Reverse.
Почти весь путь на Rust. Все структуры данных, сортировки, алгоритмы на графах, задачи на рекурсию и наборы задач с собеседований преподаются на Rust. Три курса преподаются на других языках и перечислены после шагов, у каждого своя ссылка: динамическое программирование и серия по интервью на Python (Python), а также битовые операции (C++). Битовые операции переносятся с одним изменением в записи: в Rust NOT записывается как !x, а установленные биты считает count_ones().
Проверка как на собеседовании. Каждый урок заканчивается задачей на Rust с автопроверкой по тестам, а когда решение не проходит или не компилируется, Bugsy читает ваш код и подталкивает к исправлению, не выдавая ответ. Бесплатный сертификат за большинство курсов, каждый с проверкой по собственной ссылке.
Частые вопросы о DSA на Rust
Подходит ли Rust для структур данных и алгоритмов?
Чтобы пользоваться ими, очень: стандартные коллекции быстрые и хорошо документированы, sort сортирует устойчиво, а безопасный Rust исключает висячие указатели и гонки данных ещё на этапе компиляции, без сборщика мусора. Писать структуры на указателях в нём сложнее, чем на C или Java, потому что владение не допускает общих изменяемых ссылок, если вы явно не выберете Rc и RefCell, а двусвязный список или дерево со ссылками на родителя состоят как раз из таких ссылок. Эта сложность и есть урок: когда вы умеете писать их на Rust, вы точно знаете, кто чем владеет.
Какие коллекции Rust каким структурам данных соответствуют?
Vec<T> представляет собой динамический массив и ваш стек, VecDeque<T> устроен как кольцевой буфер и служит очередью, HashMap и HashSet построены на хеш-таблицах (по умолчанию с SipHash, который защищает от намеренных коллизий ценой некоторой потери скорости), BTreeMap и BTreeSet устроены как упорядоченные B-деревья, BinaryHeap<T> реализует max-кучу, а LinkedList<T> представляет собой двусвязный список, который вам редко понадобится вместо Vec или VecDeque. Типа для префиксного дерева или графа нет: их вы пишете сами.
Почему связный список так сложно написать на Rust?
Потому что у каждого значения ровно один владелец. Односвязный список вписывается в это правило: каждый узел владеет следующим через Option<Box<Node>>. Двусвязный список или дерево со ссылками на родителя не вписываются, поскольку к каждому узлу ведут два указателя, поэтому вы берёте Rc<RefCell<Node>> с Weak для обратных ссылок или храните узлы в Vec и связываете их по индексам. Руководство Learning Rust With Entirely Too Many Linked Lists появилось именно потому, что очень многие застревают на этом месте.
Как получить min-кучу в Rust?
BinaryHeap<T> реализует max-кучу, поэтому оборачивайте каждый элемент в std::cmp::Reverse: добавьте Reverse(x), и первым выйдет наименьший x. Для алгоритма Дейкстры добавляйте Reverse((distance, node)), и кортеж будет сравниваться сначала по расстоянию. Когда вы сами напишете кучу на втором шаге, развернуть её порядок станет очевидным делом.
Какие курсы этого пути не преподаются на Rust?
Три: динамическое программирование и серия по интервью на Python преподаются на Python, а битовые операции на C++. Они перечислены после шагов, каждый со ссылкой, которая открывает курс на его собственном языке. Таблица мемоизации в Rust представляет собой Vec или HashMap, а переполнение целого числа в отладочной сборке вызывает панику, поэтому битовый трюк, который рассчитывает на циклическое переполнение, прописывает это явно через wrapping_add или wrapping_mul.
Нужно ли знать Rust, прежде чем начинать этот путь?
Как минимум владение, заимствование, структуры, перечисления и Option; Box и трейты пригодятся. Если это для вас новое, курс Rust от Coddy сначала бесплатно доведёт вас до этого уровня, а этот путь начинается там, где он заканчивается.
Будет ли сертификат за путь Структуры и алгоритмы?
Да. Пройдите все шаги и получите один бесплатный сертификат за весь путь Структуры и алгоритмы. В нём перечислены все курсы, пройденные по пути, а также ссылки на сертификат каждого курса, чтобы любой мог проверить каждый указанный навык. Его можно добавить в профиль LinkedIn. Это сертификат о завершении от Coddy, а не аккредитованная квалификация.
Другие пути обучения
Те же курсы, выстроенные под другую роль. Прогресс сохраняется: курс, пройденный на одном пути, засчитывается на каждом пути, куда он входит.