− Tuy nhiên, cây nhị phân tìm kiếm quá phức tạp cho yêu cầu đơn giản hơn của hàng đợi ưu tiên. • Đống nhị phân (binary heap)[r]
Trang 1Hàng đợi ưu tiên (Priority Queues)
Nguyễn Mạnh Hiển
hiennm@tlu.edu.vn
Trang 2Hàng đợi ưu tiên
• Chèn (insert)
− Thời gian O(log N)
• Xóa phần tử nhỏ nhất (deleteMin)
− Thời gian O(log N)
Trang 3Cài đặt hàng đợi ưu tiên
• Dùng danh sách liên kết:
− insert mất thời gian O(1)
− deleteMin mất thời gian O(N)
• Dùng cây nhị phân tìm kiếm:
− insert và deleteMin mất thời gian O(log N)
− Tuy nhiên, cây nhị phân tìm kiếm quá phức tạp cho yêu cầu đơn giản hơn của hàng đợi ưu tiên
• Đống nhị phân (binary heap)
− Là cách cài đặt phổ biến của hàng đợi ưu tiên
− insert và deleteMin mất thời gian O(log N)
Trang 4Đống nhị phân
• Gọi tắt là đống
• Thỏa mãn hai tính chất:
1 Là cây nhị phân đầy đủ
2 Tính chất thứ tự đống
Trang 5Cây nhị phân đầy đủ
• Là cây nhị phân với tất cả các mức (trừ mức dưới cùng) đã được lấp đầy các nút từ trái sang phải
• Số nút N 20 + 21 + + 2h–1 + 1 = 2h h log N
Mức 0 có 20 nút
Mức 1 có 21 nút
Mức 2 có 22 nút
Mức h có ít nhất 1 nút (h là chiều cao của cây)
Trang 6Cài đặt cây nhị phân đầy đủ
Lưu trữ các phần tử lần lượt từng mức vào vector v
• Cha của v[k] = v[k/2]
• Con trái của v[k] = v[2k]
• Con phải của v[k] = v[2k + 1]
vector v
Trang 7Tính chất thứ tự đống
• Với mọi nút X trên đống (trừ nút gốc), giá trị trong nút cha của X nhỏ hơn hoặc bằng giá trị trong nút X
• Suy ra:
− Phần tử nhỏ nhất trên đống nằm ở gốc
− Không có thứ tự nào giữa các nút con của cùng một nút
0
4 5
Trang 8Cây nào là đống?
Trang 9Cài đặt hàng đợi ưu tiên trong C++
template <typename T> // T là kiểu phần tử
class BinaryHeap {
public:
BinaryHeap(int capacity = 100);
BinaryHeap(const vector<T> & elems);
const T & findMin(); // tìm phần tử nhỏ nhất (ở gốc) void insert(const T & x); // chèn x vào đống
void deleteMin(); // xóa phần tử nhỏ nhất (ở gốc) private:
int currentSize; // số phần tử hiện có
vector<T> array; // vector chứa các phần tử
void buildHeap(); // xem các slide phía sau
void percolateDown(int hole); // xem các slide phía sau };
Trang 10Chèn vào đống: insert(14)