Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมจัดการการจองที่นั่ง (Seat Reservation Manager) ใน Python

ปัญหา

ออกแบบระบบจองที่นั่ง n ที่นั่ง (1 ถึง n) เริ่มต้นว่าทุกที่ รองรับ: Reserve() → ที่นั่งว่างเลขน้อยที่สุด, Unreserve(seatNumber) → ยกเลิกการจอง

ตัวอย่าง

SeatReserveManager(7)

reserve() → 1, reserve() → 2, reserve() → 3

unreserve(2), unreserve(5) (5 ยังไม่จอง)

reserve() → 2, reserve() → 5

อัลกอริทึม (Min-Heap / Sorted Set)

  1. เก็บ Available Seats ใน Min-Heap (Priority Queue)
  2. Current Pointer สำหรับที่นั่งใหม่ที่ยังไม่เคยจอง
  3. Reserve: ถ้า Heap ไม่ว่าง → Pop Min, Else → Current++
  4. Unreserve: Push เข้า Heap

ตัวอย่างโค้ด

import heapq

class SeatReserveManager:
    def __init__(self, n):
        self.current_seat = 0
        self.empty_seats = []  # Min-heap
    
    def reserve(self):
        if self.empty_seats:
            return heapq.heappop(self.empty_seats)
        self.current_seat += 1
        return self.current_seat
    
    def unreserve(self, seatNumber):
        heapq.heappush(self.empty_seats, seatNumber)

# Test
obj = SeatReserveManager(7)
print(obj.reserve())  # 1
print(obj.reserve())  # 2
print(obj.reserve())  # 3
obj.unreserve(2)
obj.unreserve(5)
print(obj.reserve())  # 2
print(obj.reserve())  # 5

ความซับซ้อน

  • Reserve: O(log k) k = จำนวนที่นั่งว่างใน Heap
  • Unreserve: O(log k)
  • Space: O(k)

ปรับปรุงจากต้นฉบับ: ใช้ Heap แทน List + min() + remove() เพื่อ O(log n) แทน O(n)