Подходит ли Dart для структур данных и алгоритмов?
Да. Он типизированный и построен на классах, по устройству близок к Java или C#, поэтому класс Node<T> с полем next, которое может быть null, выглядит ровно тем, чем является, а dart:collection покрывает больше, чем большинство стандартных библиотек. Стоит знать две вещи: в базовом SDK нет очереди с приоритетом, а литерал Map или Set создаёт LinkedHashMap или LinkedHashSet, который помнит порядок вставки; это удобно для вывода, но не то же обещание, что даёт отсортированный словарь.
Какие классы Dart каким структурам данных соответствуют?
List представляет собой динамический массив и ваш стек; Map и Set построены на хеш-таблицах и по умолчанию сохраняют порядок вставки; dart:collection добавляет Queue (это ListQueue, кольцевой буфер, если вы не выберете DoubleLinkedQueue), LinkedList для элементов, наследующих LinkedListEntry, а также SplayTreeMap и SplayTreeSet, самонастраивающиеся упорядоченные деревья. Кучу даёт PriorityQueue из package:collection от команды Dart. Префиксные деревья и графы вы пишете сами.
Есть ли в Dart очередь с приоритетом?
В базовом SDK нет. dart:collection ограничивается очередями, связными списками и splay-деревьями, а PriorityQueue находится в package:collection, пакете, который поддерживает команда Dart, но подключаете его вы сами. Поэтому на собеседовании по Dart вполне могут попросить написать кучу, и на втором шаге вы её пишете.
Что такое splay-дерево и когда использовать SplayTreeMap?
Splay-дерево представляет собой самонастраивающееся двоичное дерево поиска: каждое обращение перемещает затронутый узел в корень, поэтому к недавно использованным ключам снова добираться быстро, а операции стоят O(log n) амортизированно, без гарантии для каждого отдельного вызова. Используйте SplayTreeMap, когда нужны ключи в отсортированном порядке, наименьший или наибольший ключ или ближайший ключ с любой стороны от значения через firstKeyAfter и lastKeyBefore. АВЛ-дерево, которое вы пишете на втором шаге, использует другой подход: перебалансируется при каждом изменении, чтобы его высота оставалась строго ограниченной.
Какие курсы этого пути не преподаются на Dart?
Три: динамическое программирование и серия по интервью на Python преподаются на Python, а битовые операции на C++. Они перечислены после шагов, каждый со ссылкой, которая открывает курс на его собственном языке. Таблица мемоизации в Dart представляет собой List или Map, а toRadixString(2) выводит int в двоичном виде: это самый быстрый способ проверить, что на самом деле содержит маска.
Нужно ли знать Dart, прежде чем начинать этот путь?
Как минимум классы, дженерики, списки, словари и null safety. Если это для вас новое, курс Dart от Coddy сначала бесплатно доведёт вас до этого уровня, а этот путь начинается там, где он заканчивается.