Algorithms And Data Structures
Algorithms and data structures - это базовые идеи, которые помогают разработчику понимать, почему код работает, почему он становится медленным и как выбрать решение лучше.
Цель не в том, чтобы решать абстрактные задачки ради задачек. Цель в том, чтобы узнавать типовые формы проблем в реальной продуктовой разработке и принимать разумные инженерные решения.
Как думать
Важно не просто помнить определения, а понимать:
- какие данные нужно хранить
- как часто данные меняются
- как часто данные ищутся или преобразуются
- как решение ведет себя при росте входных данных
- какой tradeoff допустим для текущей продуктовой задачи
Основные темы
Алгоритмы
Алгоритмы - это повторяемые шаги для решения задачи.
Примеры:
- поиск
- сортировка
- фильтрация
- группировка
- обход
- валидация
Структуры данных
Структуры данных определяют, как данные организованы и как к ним получать доступ.
Примеры:
- array / list
- map / dictionary
- set
- queue
- stack
- tree
- graph
Сложность
Сложность помогает оценивать, как решение растет при увеличении количества данных.
Примеры:
- constant time
- linear growth
- вложенные циклы
- использование памяти
- дорогая повторная работа
Практика
Базовый уровень
-
Поиск в списке
Найти элемент по id, имени или статусу и обработать ситуацию, когда ничего не найдено. -
Группировка данных
Сгруппировать список элементов по категории, дате, владельцу или статусу. -
Удаление дубликатов
Очистить список, сохранив предсказуемый порядок элементов.
Продвинутый уровень
-
Оптимизация повторной работы
Найти место, где одно и то же вычисление выполняется слишком часто, и закешировать или перестроить его. -
Выбор структуры данных
Заменить медленный поиск по списку на map или set, когда важна скорость доступа. -
Обработка дерева
Поработать с вложенными данными: комментариями, категориями, меню или маршрутами.
Вопросы для размышления
- Как ты обычно решаешь, что простого цикла достаточно?
- Когда list перестает быть удобным и лучше использовать map или set?
- Какие признаки показывают, что код делает одну и ту же работу слишком много раз?
- Как ты проверяешь, что решение выдержит значительно больший объем данных?
- Когда лучше оставить более медленное, но простое решение?
- Как ты объясняешь алгоритмический tradeoff другому разработчику?