− 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
2
0+ 2
1+ + 2
h–1+ = 2
h
h
log N
Mức có 2
0nút
Mức có 2
1nút
Mức có 2
2nú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)