HÀNG ĐỢI ƯU TIÊN
Một số ứng dụng kiểu hàng đợi thông thường không thể giải quyết được như
- Sắp hàng mua vé: thường sẽ ưu tiên cho người già, phụ nữ có thai, người tàn tật
- Trạm thu phí: thường ưu tiên sẽ cứu thương, xe cứu hỏa
Hàng đợi ưu tiênHàng đợi ưu tiên (priority queue) là một hàng đợi trong đó mỗi phần tử được gắn với một con số được gọi là độ ưu tiên
- Độ ưu tiên sẽ do ứng dụng xác định
- Việc lấy một phần tử ra khỏi hàng đợi sẽ được dựa trên độ ưu tiên và quy tắc FIFO. Nghĩa là phần tử nào có độ ưu tiên cao nhất sẽ được lấy ra trước nhất. Trong trường hợp có nhiều phần tử có cùng độ ưu tiên thì sử dụng quy tắc FIFO
Các thao tác cơ bản của hàng đợi ưu tiên
Các thao tác đối với hàng đợi ưu tiên giống với hàng đợi bình thường
- Khởi tạo hàng đợi rỗng
- Xóa hàng đợi
- Thêm phần tử vào hàng đợi (enqueue)
- Lấy phần tử ở đỉnh ra khỏi hàng đợi (dequeue)
- Lấy thông tin phần tử ở đỉnh của hàng đợi (top)
Hàng đợi ưu tiên có thể cài đặt
- Bằng mảng
- Bằng cây heap
Cấu trúc dữ liệu cây heap
Định nghĩa 2
- Cấu trúc dữ liệu cây heap (heap tree) là cây có thứ tự bộ phận. Trong phạm vi môn học chúng ta sẽ xét cây heap nhị phân
- Cây max heap nhị phân là một cây nhị phân hoàn chỉnh sao cho giá trị khóa tại một nút bất kỳ p không nhỏ hơn khóa của cây con trái và cây con phải của nó

- Cây min heap nhị phân là một cây nhị phân hoàn chỉnh sao cho giá trị khóa tại một nút bất kỳ p không lớn hơn khóa của cây con trái và cây con phải của nó

Hình 1: Thứ tự của các phần tử trong một cây heap

Hình 2: Cây max heap
Thao tác thêm phần tửThao tác thêm một phần tử vào hàng đợi ưu tiên được cài đặt bằng cây max heap như sau
- Chèn phần tử với độ ưu tiên (khóa) v vào cuối heap
- Nếu độ ưu tiên (khóa) của nó cao hơn nút cha thì hoán đổi hai nút với nhau và lặp lại
Chèn một phần tử có độ ưu tiên là 66 vào hàng đợi ưu tiên được biểu diễn bằng cây max heap dưới

Hình 3: Cây max heap

Hình 4: Thêm phần tử 66

Hình 5: 66 hoán đổi với 26

Hình 6: Hoán đổi 66 với 65
Thao tác lấy phần tử
Thao tác lấy một phần tử ra khỏi hàng đợi được cài đặt bằng cây heap như sau
- Xóa phần tử gốc của cây heap ra khỏi cây
- Thay thế bằng phần tử gốc bằng phần tử cuối của cây
- Nếu độ ưu tiên của nó bằng hay thấp hơn của nút con thì hoán đổi nó với nút con có độ ưu tiên cao hơn
Minh họa thao tác lấy phần tử
Lấy phần tử gốc có độ ưu tiên cao nhất 68 khỏi cây max heap

Hình 7: Cây max heap

Hình 8: Xóa phần tử 68

Hình 9: Thay thế bằng phần tử 13

Hình 10: Hoán đổi 13 và 65

Hình 11: Hoán đổi 13 và 31

Hình 12: Hoán đổi 13 và 20