intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Cấu trúc dữ liệu và giải thuật: Hàng đợi ưu tiên - Phan Mạnh Hiển (2020)

Chia sẻ: Minh Nhân | Ngày: | Loại File: PDF | Số trang:24

32
lượt xem
4
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài giảng "Cấu trúc dữ liệu và giải thuật: Hàng đợi ưu tiên" cung cấp cho người học các kiến thức: Hàng đợi ưu tiên, cài đặt hàng đợi ưu tiên, đống nhị phân, cây nhị phân đầy đủ, cài đặt cây nhị phân đầy đủ,... Mời các bạn cùng tham khảo nội dung chi tiết.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Cấu trúc dữ liệu và giải thuật: Hàng đợi ưu tiên - Phan Mạnh Hiển (2020)

  1. Hàng đợi ưu tiên (Priority Queues) Nguyễn Mạnh Hiển hiennm@tlu.edu.vn
  2. Hà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)
  3. Cà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)
  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
  5. Câ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)
  6. Cà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
  7. Tí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 3 2 4 5
  8. Cây nào là đống?
  9. Cài đặt hàng đợi ưu tiên trong C++ template // T là kiểu phần tử class BinaryHeap { public: BinaryHeap(int capacity = 100); BinaryHeap(const vector & 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 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 };
  10. Chèn vào đống: insert(14)
  11. Chèn vào đống: insert(x) • Tạo lỗ trống (hole) ở vị trí có sẵn tiếp theo trong đống • Lặp lại: − Nếu x nhỏ hơn giá trị ở nút cha của lỗ trống: + Đổi chỗ lỗ trống và nút cha − Ngược lại: + Dừng lặp • Đặt x vào lỗ trống Quá trình lỗ trống nổi dần lên trên được gọi là thẩm thấu ngược (percolate up)
  12. Chèn vào đống: Lập trình void insert(const T & x ) { // Tăng kích thước 2 lần nếu vector đầy if (currentSize == array.size() - 1) array.resize(array.size() * 2); // Thẩm thấu ngược currentSize++; int hole = currentSize; while (hole > 1 && x < array[hole / 2]) { array[hole] = array[hole / 2]; hole = hole / 2; } array[hole] = x; }
  13. Xóa khỏi đống: Ví dụ Tạo lỗ trống ở gốc; Xóa phần tử cuối cùng (x = 31)
  14. Xóa khỏi đống: Ví dụ (tiếp)
  15. Xóa khỏi đống: Thuật toán • Tạo lỗ trống ở nút gốc • Gọi x là giá trị ở nút cuối cùng • Xóa nút cuối cùng • Lặp lại: − Xác định nút con nhỏ hơn của lỗ trống − Nếu x lớn hơn giá trị ở nút con nhỏ hơn + Đổi chỗ lỗ trống và nút con nhỏ hơn (thẩm thấu xuôi – percolate down) − Ngược lại: + Dừng lặp • Đặt x vào lỗ trống
  16. Xóa khỏi đống: Lập trình void deleteMin() { array[1] = array[currentSize]; currentSize--; // Thẩm thấu xuôi (xem slide sau) percolateDown(1); }
  17. Thẩm thấu xuôi void percolateDown(int hole) { T x = array[hole]; int child; while (hole * 2 array[child]) { array[hole] = array[child]; hole = child; } else break; } array[hole] = x; }
  18. Thời gian chạy của chèn và xóa • Số phép so sánh (số đoạn đứt nét) trong quá trình thẩm thấu ngược (chèn) hoặc xuôi (xóa) không quá chiều cao của cây • Ta đã biết chiều cao của cây h  log N • Suy ra, thời gian chạy của các thao tác chèn và xóa là O(log N)
  19. Hàm tạo • Xây dựng đống từ một tập phần tử đã có: BinaryHeap(const vector & elems); • Các bước: − Chèn lần lượt các phần tử vào cây mà không quan tâm tính chất thứ tự đống − Duyệt qua các nút từ dưới lên trên, từ phải sang trái: + Tại mỗi nút, dùng phép thẩm thấu xuôi để nút đó thỏa mãn tính chất thứ tự đống • Thời gian chạy là O(N) (sẽ phân tích sau)
  20. Hàm tạo: Lập trình BinaryHeap(const vector & elems) { array.resize(elems.size() + 10); currentSize = elems.size(); for (int i = 0; i < elems.size(); i++) // O(N) array[i + 1] = elems[i]; buildHead(); // O(N), sẽ phân tích sau } // Thiết lập tính chất thứ tự đống void buildHead() { for (int i = currentSize / 2; i > 0; i--) percolateDown(i); }
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
4=>1