btvn.vn
Tìm kiếm Đăng nhập

Phối hợp hai hàng đợi với một ngăn xếp

Lưu trên thiết bị này
Chuyên đề lựa chọn CS: Ngăn xếp và hàng đợi · Chọn bài khác

Mỗi cấu trúc giữ một thứ tự

Dữ liệu dưới đây là ví dụ giả định. Mỗi người có mã riêng và đăng kí một trong hai loại suất `ga`, `bo`. Người chọn cùng loại xếp vào cùng hàng theo thứ tự đăng kí. Suất ăn được đặt lên ngăn xếp theo thứ tự chuẩn bị; suất đặt cuối nằm trên cùng và được lấy trước. Mỗi lượt lấy một suất ở đỉnh. Nếu hàng đăng kí loại đó còn người, phục vụ người đầu hàng ấy. Nếu hàng ấy hết, phục vụ người đầu hàng còn lại và ghi mã người phải đổi loại. Giả định chỉ có hai nhãn ga/bo, tổng số suất bằng tổng số người, mỗi mã xuất hiện một lần.

Dữ liệu và thứ tự phục vụ

|Thứ tự đăng kí|Mã|Loại| |---|---|---| |1|01|ga| |2|02|bo| |3|03|ga| |4|04|ga| |5|05|bo| |6|06|ga| Hàng ga là [01,03,04,06], hàng bo là [02,05]. Ngăn xếp suất ăn từ đáy đến đỉnh là `[bo,ga,bo,ga,bo,ga]`. |Lượt|Suất lấy ở đỉnh|Mã nhận|Đổi loại?| |---|---|---|---| |1|ga|01|Không| |2|bo|02|Không| |3|ga|03|Không| |4|bo|05|Không| |5|ga|04|Không| |6|bo|06|Có| Thứ tự phục vụ là 01,02,03,05,04,06; chỉ 06 đổi suất. Hai hàng được giữ FIFO riêng nên không nhất thiết phục vụ theo thứ tự của toàn bộ danh sách đăng kí.

Lấy suất trước, chọn hàng tương ứng

Dùng các hàm ngăn xếp và hàng đợi đã học. Hàm sao chép danh sách suất để không làm mất dữ liệu đầu vào; trả về thứ tự phục vụ và danh sách mã đổi suất. ```python def serve_two_lines(orders, meals): ga, bo = Queue(), Queue() for code, choice in orders: if choice == 'ga': enqueue(ga, code) else: enqueue(bo, code) S = meals.copy() changed, served = [], [] while not isEmptyStack(S): meal = pop(S) preferred = ga if meal == 'ga' else bo other = bo if meal == 'ga' else ga if not isEmptyQueue(preferred): code = dequeue(preferred) else: code = dequeue(other) changed.append(code) served.append(code) return served, changed ```

Nêu rõ đang tính khoảng thời gian nào

Nếu mọi người bắt đầu chờ ở giây 0, mỗi lượt phục vụ mất đúng một giây và không có khoảng nghỉ, thời điểm hoàn tất sáu lượt là 1,2,3,4,5,6 giây. Trung bình từ lúc bắt đầu chờ đến khi nhận xong là (1+2+3+4+5+6)/6 = **3,5 giây**. Nếu chỉ tính thời gian chờ trước khi bắt đầu được phục vụ, các giá trị là 0,1,2,3,4,5 giây, trung bình 2,5 giây. Cần xác định cách tính trước khi diễn giải kết quả; hai đại lượng không cùng ý nghĩa.

Bài luyện

Vì sao lượt 4 phục vụ mã 05 trước mã 04?
Chọn một đáp án

Bài luyện

Theo dữ liệu mẫu, mã nào phải nhận khác loại đã đăng kí?
Chọn một đáp án

Bài luyện

Mọi người chờ từ giây 0; sáu lượt mất một giây mỗi lượt. Trung bình thời gian đến khi nhận xong là bao nhiêu?
Chọn một đáp án

Đang học