Cach su dung hang doi uu tien priority queue khi khai thac stl trong c

WORD 2 0.144Mb

Cach su dung hang doi uu tien priority queue khi khai thac stl trong c là tài liệu môn Tin Học trong chương trình Lớp 9 được cungthi.vn tổng hợp và biên soạn. Tạo nguồn tài liệu giúp các bạn trong việc ôn tập

Những địa chỉ uy tín để bạn mua sách


Nội dung tóm tắt

ĐỀ TÀI: CÁCH SỬ DỤNG HÀNG ĐỢI ƯU TIÊN (PRIORITY QUEUE) TRONG THƯ VIỆN STL CỦA C++ Chuyên đề trình bày cách khai thác hàng đợi ưu tiên (priority queue) trong thư viện STL của C++ và áp dụng vào một số bài toán. Tôi viết chuyên đề này nhằm mục đích là tài liệu tham khảo cho một số trường đang trong giai đoạn chuyển dạy ngôn ngữ lập trình Free Pascal sang ngôn ngữ C++. 1. Giới thiệu priority_queue: Priority queue là một loại container adaptor, được thiết kế đặc biệt để phần tử ở đỉnh luôn luôn là phần tử có độ ưu tiên lớn nhất so với các phần tử khác. Nó giống như một heap, mà ở đây là heap max, tức là phần tử có độ ưu tiên lớn nhất có thể được lấy ra và các phần tử khác được chèn vào bất kì. Độ ưu tiên có thể sử dụng các phép toán trong thư viện functional hoặc có thể tự định nghĩa.Phép toán so sánh mặc định khi sử dụng priority queue là phép toán less. Một số phép toán so sánh của thư viện functional: Để sử dụng priority queue một cách hiệu quả, tùy vào từng bài toán ta viết hàm so sánh để sử dụng cho linh hoạt. 2. Khai báo priority_queue Trong C++ không có thư viện priority_queue, do đó, để sử dụng priority_queue,  ta cần khai báo thư viên queue: #include 2.1. Khai báo với phép toán mặc định là less priority_queue myPriorityQueue; Ta có thể tưởng tượng priority_queue tương tự như stack, do đó, phần tử có độ ưu tiên lớn nhất sẽ nằm về phía bên phải (Như hình ảnh ở phần giới thiệu priority_queue). Do đó, khi sử dụng phép toán less, phần tử độ ưu tiên cao nhất là phần tử có giá trị lớn nhất. 2.2. Khai báo với phép toán khác Ví dụ: Sử dụng phép toán greater của thư viện functional priority_queue ,greater> myPriorityQueue ; Khi sử dụng phép toán greater, phần tử độ ưu tiên cao nhất là phần tử có giá trị nhỏ nhất. 2.3. Khai báo sử dụng class so sánh tự định nghĩa Ta sử dụng một struct kết hợp với nạp chồng toán tử dấu ngoặc đơn như ví dụ bên dưới: 3. Các phương thức thành viên size() Trả về số lượng phần tử của priority_queue. Ví dụ: Tạo một priority_queue có 5 phần tử bất kì và in ra số lượng phần tử của priority_queue này. Lưu ý: Tương tự như stack, queue, ta không thể khai báo: để khai báo 5 phần tử rỗng tương tự như vector hay list vì priority_queue không cho phép ta khai báo phần tử rỗng. Tương tự, ta không thể khai báo: để khai báo 5 phần tử của priority_queue có giá trị 100. empty() Trả về true(1) nếu priority_queue rỗng, ngược lại là false (0) Ví dụ: Kiểm tra priority_queue có rỗng không và  in ra thông báo tương ứng. top() Truy xuất phần tử ở đỉnh priority_queue (phần tử có độ ưu tiên lớn nhất) Ví dụ 1: Tạo priority_queue có 5 phần tử có giá trị lần lượt là  5,3,2,4,1 với độ ưu tiên mặc định. Hãy in ra các phần tử theo thứ tự độ ưu tiên cao nhất đến thấp nhất. Nhận xét: Mặc dù thứ tự ta cho vào priorty_queue là 5,3,2,4,1 không được sắp xếp, tuy nhiên, khi in ra kết quả, ta có thứ tự giảm dần 5,4,3,2,1(Độ ưu tiên là in số lớn nhất, vì độ ưu tiên mặc định là less). Ví dụ 2: Tạo priority_queue có 5 phần tử có giá trị lần lượt là  5,3,2,4,1 với độ ưu tiên là greater. Hãy in ra các phần tử theo thứ tự độ ưu tiên cao nhất đến thấp nhất. Nhận xét:Kết quả in ra theo thứ tự tăng dần 1,2,3,4,5 vì độ ưu tiên là greater (lớn hơn). Ví dụ 2: Tạo priority_queue có 5 phần tử có giá trị lần lượt là  5,3,2,4,1 với độ ưu tiên được mô tả bởi phương thức so sánh : Hãy in ra các phần tử theo thứ tự độ ưu tiên cao nhất đến thấp nhất. push (const x) Thêm phần tử có giá trị x vào priority_queue. Kích thước priority_queue tăng thêm 1. Ví dụ: Viết chương trình cho người dùng nhập vào kích thước priorty_queue và nhập vào giá trị các phần tử. In các phần tử trong priority_queue. pop () Loại bỏ phần tử ở đình priority_queue (phần tử cuối cùng được thêm vào priority_queue). Kích thước priority_queue giảm đi 1. Ví dụ: Viết chương trình cho người dùng nhập vào kích thước priority_queue và nhập vào giá trị các phần tử. Sau đó, loại bỏ đi một nửa các phần tử ở đỉnh priority_queue.  4. Một số dạng bài tập có sử dụng priority_queue Bài1. Dijkstra - Tìm đường đi ngắn nhất trên đồ thị Mục đích: Từ một đỉnh S, ta muốn biết độ dài đường đi ngắn nhất từ S đến tất cả các đỉnh còn lại (trong đồ thị có hướng hoặc vô hướng). Độ phức tạp : O (n log n). Bài 2. Tìm cây khung nhỏ nhất của đồ thị bằng thuật toán Prim Độ phức tạp: O((n+m) log n). Mô tả int d[] d[u] là khoảng cách từ nút u đến cây khung đang xây dựng, d[u]=0 khi u đã được cho vào cây khung. vector a[] a[u] là danh sách kề của đỉnh u, kết thúc với số 0 vector b[] b[u][i] là trọng số của cạnh thứ i trong danh sách kề đỉnh u int prim() trả về trọng số của cây khung nhỏ nhất Tham khảo http://vn.spoj.com/problems/QBMST/ http://vi.wikipedia.org/wiki/Thu%E1%BA%ADt_to%C3%A1n_Prim Bài 3. Robot (Đề thi chọn đội tuyển quốc gia chuyên Trần Phú Hải Phòng 2014) HD vừa sáng tạo ra một trò chơi điều khiển robot mới cho 2 bé Bi, Bo chơi. Nội dung trò chơi như sau: Có N cây cột đánh số từ 1 đến N, cây cột thứ 𝑖 có chiều cao ℎ[𝑖](𝑚) Có M đường nhảy dạng ?