Задачи
December 4, 2023
Дизайн системы по бронированиею мест
Необходимо реализовать систему, которая управляет состоянием бронирования N мест (от 1 до N).
- SeatReserver(int n) инициализирует объект SeatReserver, который будет управлять n местами, пронумерованными от 1 до n. Изначально все места свободны.
- int Reserve() находит наименьшее по номеру незарезервированное место, резервирует его и возвращает его номер.
- void Unreserve(int num) снимает резерв с места с заданным номером.
Разбор
Для реализации такой системы мы можем воспользоваться такой структурой данных как куча, в данном случае MinHeap. То есть, чтобы получить наименьшее свободное место, нужно вытащить первый элемент из кучи.
Данная структура данных позволяет выполнять операции за O(log n).
Алгоритм
- В C# есть тип кучи называемой приоритетная очередь, для каждого элемента заранее установлен приоритет. При извлечении элемента удаляется элемент с наименьшим приоритетом.
- В конструкторе инициализируем приоритетную очередь availableSeats элементами от 1 до N, с такими же значениями приоритета.
- При операции Reserve мы просто извлекаем элемент из availableSeats и возвращаем его значение. Таким образом это место больше не доступно для бронирования.
- При операции Unreserve мы добавляем место num снова в availableSeats с таким же приоритетом. То есть мы делаем это место снова доступным для бронирования.
Реализация
https://gist.github.com/unilecs/a3ad79b5152a954b222fbf8fe0fe55fd