Перейти к основному содержимому

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 другому разработчику?