Задачи
December 4, 2023

Дизайн системы по бронированиею мест

Необходимо реализовать систему, которая управляет состоянием бронирования N мест (от 1 до N).

Class SeatReserver:

  • SeatReserver(int n) инициализирует объект SeatReserver, который будет управлять n местами, пронумерованными от 1 до n. Изначально все места свободны.
  • int Reserve() находит наименьшее по номеру незарезервированное место, резервирует его и возвращает его номер.
  • void Unreserve(int num) снимает резерв с места с заданным номером.

Разбор

Для реализации такой системы мы можем воспользоваться такой структурой данных как куча, в данном случае MinHeap. То есть, чтобы получить наименьшее свободное место, нужно вытащить первый элемент из кучи.
Данная структура данных позволяет выполнять операции за O(log n).

Алгоритм

  1. В C# есть тип кучи называемой приоритетная очередь, для каждого элемента заранее установлен приоритет. При извлечении элемента удаляется элемент с наименьшим приоритетом.
  2. В конструкторе инициализируем приоритетную очередь availableSeats элементами от 1 до N, с такими же значениями приоритета.
  3. При операции Reserve мы просто извлекаем элемент из availableSeats и возвращаем его значение. Таким образом это место больше не доступно для бронирования.
  4. При операции Unreserve мы добавляем место num снова в availableSeats с таким же приоритетом. То есть мы делаем это место снова доступным для бронирования.

Реализация

https://gist.github.com/unilecs/a3ad79b5152a954b222fbf8fe0fe55fd

Play-test

https://dotnetfiddle.net/aPqKqP