− 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]
(1)Hàng đợi ưu tiên (Priority Queues)
Nguyễn Mạnh Hiển
(2)Hàng đợi ưu tiên
• Chèn (insert)
− Thời gian O(log N)
(3)Cài đặt hàng đợi ưu tiên
• Dùng danh sách liên kết: − insert thời gian O(1)
− deleteMin thời gian O(N) • Dùng nhị phân tìm kiếm:
− insert deleteMin thời gian O(log N)
− Tuy nhiên, nhị phân tìm kiếm phức tạp cho yêu cầu đơn giản hàng đợi ưu tiên
• Đống nhị phân (binary heap)
(4)Đống nhị phân
• Gọi tắt đống
(5)Cây nhị phân đầy đủ
• Là nhị phân với tất mức (trừ mức cùng) lấp đầy nút từ trái sang phải
• Số nút N 20 + 21 + + 2h–1 + = 2h h log N
Mức có 20 nút
Mức có 21 nút
Mức có 22 nút
(6)Cài đặt nhị phân đầy đủ
Lưu trữ phần tử mức vào vector v • Cha v[k] = v[k/2]
• Con trái v[k] = v[2k]
• Con phải v[k] = v[2k + 1]
(7)Tính chất thứ tự đống
• Với nút X đống (trừ nút gốc), giá trị nút cha X nhỏ giá trị nút X • Suy ra:
− Phần tử nhỏ đống nằm gốc
− Khơng có thứ tự nút một nút
0
3 2
(8)(9)Cài đặt hàng đợi ưu tiên C++
template <typename T> // T 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ỏ (ở gốc) void insert(const T & x); // chèn x vào đống
void deleteMin(); // xóa phần tử nhỏ (ở gốc) private:
int currentSize; // số phần tử có
vector<T> array; // vector chứa phần tử void buildHeap(); // xem slide phía sau
(10)