Перейти к содержанию

Структуры данных на практике: стеки, очереди и интуиция Big-O

Начало урока

Структуры данных на практике: стеки, очереди и интуиция Big-O

Выберите правильный контейнер для задачи - и код будет быстрым и понятным. Выберите неправильный - и ваш API начнёт задыхаться по мере роста данных.

Главная идея: структура данных - это просто согласованный способ организовать значения в памяти так, чтобы нужные вам операции были дешёвыми. Стек хорош, когда вы всегда работаете с самым свежим элементом, очередь - когда с самым старым, а хеш-таблица (в JavaScript это Map и Set) - когда нужно мгновенно найти что-то по ключу. Понимание стоимости каждой операции - её Big-O - позволяет предсказать поведение кода на 10 элементах и на 10 миллионах.
К концу вы сможете:
  • реализовать стек (LIFO) и применить его для истории отмен;
  • реализовать очередь (FIFO) и применить её для очереди задач, избежав ловушки shift();
  • использовать Set / Map для мгновенного поиска, удаления дубликатов и подсчёта;
  • читать нотацию Big-O и на интуиции различать O(1), O(n) и O(n^2);
  • заменить случайный цикл O(n^2) проходом O(n) через хеш-таблицу.

1. Стек - последним пришёл, первым вышел

Стек - это стопка. Вы добавляете наверх через push и убираете сверху через pop. Последнее, что вы положили, - это первое, что вы возьмёте: LIFO (Last In, First Out).

Аналогия. Представьте стопку тарелок. Чистую тарелку кладут наверх; следующая тарелка, которую вы возьмёте, - именно та, что вы только что положили. Из середины тарелку не вытаскивают.

Пример из жизни: история отмен. Каждый текстовый редактор хранит стек отмен. Каждая правка кладётся наверх. Когда вы нажимаете Ctrl+Z, редактор снимает (pop) самую последнюю правку и отменяет её. Поскольку новейшее изменение всегда сверху, отмена - это одна дешёвая операция pop.

В JavaScript обычный массив уже является стеком: arr.push(x) добавляет в конец, а arr.pop() убирает с конца, и обе операции - O(1), то есть постоянное время независимо от размера массива. Обёртка в маленький класс просто даёт операциям понятные имена:

class Stack {
  constructor() { this.items = []; }
  push(x)  { this.items.push(x); }
  pop()    { return this.items.pop(); }        // убрать + вернуть верхний
  peek()   { return this.items[this.items.length - 1]; }  // посмотреть, не убирая
  get size() { return this.items.length; }
}

Ключевая дисциплина: стек позволяет трогать только верхушку. Это ограничение - преимущество: оно держит структуру быстрой, а ваше намерение - очевидным.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя