Bài giảng Cấu trúc dữ liệu và giải thuật - Bài 11: Hàng ưu tiên
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cấu trúc dữ liệu và giải thuật - Bài 11: Hàng ưu tiên", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_cau_truc_du_lieu_va_giai_thuat_bai_11_hang_uu_tien.pdf
Nội dung text: Bài giảng Cấu trúc dữ liệu và giải thuật - Bài 11: Hàng ưu tiên
- Bài 11: Hàng ưu tiên Giảng viên: Hoàng Thị Điệp Khoa Công nghệ Thông tin – Đại học Công Nghệ Cấu trúc dữ liệu và giải thuật HKI, 2013-2014
- Nội dung chính 1. KDLTT hàng ưu tiên 2. Các phương pháp cài đặt 3. Ứng dụng: xây dựng mã Huffman 2 diepht@vnu
- KDLTT hàng ưu tiên (priority queue) Là tập hợp trong đó mỗi removeMin() loại bỏ và trả phần tử là một cặp (giá trị về đối tượng có giá trị ưu ưu tiên, đối tượng) tiên nhỏ nhất. Thực hiện được nếu hàng không rỗng. ta có thể so sánh được các giá trị ưu tiên findMinKey() tìm giá trị ưu tiên nhỏ nhất .Thực hiện Các phép toán được nếu hàng không rỗng insert(k, o) xen vào hàng size() ưu tiên đối tượng o có giá isEmpty() trị ưu tiên k. findMin() tìm đối tượng có Ứng dụng giá trị ưu tiên nhỏ nhất. Quản lý băng thông Thực hiện được nếu hàng Sử dụng trong thiết kế các không rỗng thuật toán (Huffman ) 3 diepht@vnu
- Minh họa Phép toán Output Hàng ưu tiên insert(5,A) - {(5,A)} insert(9,C) - {(5,A), (9,C)} insert(3,B) - {(3,B), (5,A), (9,C)} insert(7,D) - {(3,B), (5,A), (7,D), (9,C)} findMin() B {(3,B), (5,A), (7,D), (9,C)} findMinKey() 3 {(3,B), (5,A), (7,D), (9,C)} removeMin() - {(5,A), (7,D), (9,C)} size() 3 {(5,A), (7,D), (9,C)} findMin () A {(5,A), (7,D), (9,C)} removeMin() - {(7,D), (9,C)} removeMin() - {(9,C)} removeMin() - {} removeMin() “error” {} isEmpty() true {} 4 diepht@vnu
- Wikipedia: priority queue 5 diepht@vnu
- NIST’s DADS: priority queue 6 diepht@vnu
- Standard Template Library 7 diepht@vnu
- Nội dung chính 1. KDLTT hàng ưu tiên 2. Các phương pháp cài đặt 3. Ứng dụng: xây dựng mã Huffman 8 diepht@vnu
- Các phương pháp cài đặt findMin insert removeMin Mảng được sắp ? ? ? Mảng không sắp ? ? ? DSLK được sắp ? ? ? DSLK không sắp ? ? ? Cây TKNP ? ? ? Cây thứ tự bộ phận ? ? ? (heap) 9 diepht@vnu
- Cài đặt hàng ưu tiên bởi mảng Ví dụ Minh họa mảng Mảng được Q = {(3,B), (5,A), (7,D), (9,C)} 9,C 7,D 5,A 3,B sắp findMin() 9,C 7,D 5,A 3,B insert(8, E) 9,C 8,E 7,D 5,A 3,B removeMin() 9,C 8,E 7,D 5,A Mảng không Q = {(7,D), (3,B), (9,C), (5,A)} 7,D 3,B 9,C 5,A sắp findMin() 7,D 3,B 9,C 5,A insert(8, E) 7,D 3,B 9,C 5,A 8,E removeMin() 7,D 9,C 5,A 8,E 10 diepht@vnu
- Cài đặt hàng ưu tiên bởi cây tìm kiếm nhị phân 1. hàng ưu tiên 7,D 2. findMin() 7,D 3,B 9,C 3,B 9,C 2,F 5,A 8,E 2,F 5,A 8,E 7,D 3. insert(4,G) 4. removeMin() 7,D 3,B 9,C 3,B 9,C 2,F 5,A 8,E 2,F 5,A 8,E 4,G 4,G 11 diepht@vnu
- Cây thứ tự bộ phận (heap) Cây nhị phân hoàn toàn có tất cả các mức của cây đều 0 2 không thiếu đỉnh nào, trừ mức thấp nhất được lấp đầy kể từ bên trái 1 5 2 3 Min heap là một cây nhị phân 5 hoàn toàn với tính chất 3 9 4 7 8 khóa của một đỉnh bất kỳ nhỏ hơn hoặc bằng khóa của các đỉnh con của nó 2 5 3 9 7 8 Max heap Cài đặt heap có thể dùng cấu trúc liên kết (con trỏ) có thể dùng mảng Độ cao của heap là log(n) 12 diepht@vnu
- Cài đặt hàng ưu tiên bởi heap findMin? 0 2,F insert? 1 5,A 2 3,B removeMin? 5 3 9,C 4 7,D 8,E 2,F 5,A 3,B 9,C 7,D 8,E 13 diepht@vnu
- Xen thêm vào heap Phép insert của hàng ưu tiên tương ứng với phép 2 xen thêm một phần tử có 5 z 6 khóa k vào heap z Thuật toán 9 7 Tìm tới vị trí z để đưa phần tử mới vào (là đỉnh cuối insertion node mới) 2 Lưu phần tử có khóa k vào z Khôi phục tính chất thứ tự 5 6 bộ phận của heap z z 9 7 1 14 diepht@vnu
- Thuật toán upheap Sau khi xen thêm một khóa k mới, heap có thể mất đi tính chất thứ tự bộ phận Thuật toán upheap khôi phục lại tính chất này bằng cách đảo chỗ k dọc theo đường đi từ đỉnh mới hướng tới gốc Upheap dừng lại khi k tiến tới gốc hoặc một đỉnh có khóa của cha ≤ k Vì heap có độ cao O(log n), upheap thực hiện trong thời gian O(log n) 2 1 5 1 5 2 z z 9 7 6 9 7 6 15 diepht@vnu
- Loại một phần tử khỏi heap Phép removeMin của hàng ưu tiên tương ứng 2 với phép loại gốc của 5 6 heap w Thuật toán 9 7 Thay thế gốc bằng đỉnh cuối cùng w đỉnh cuối Giải phóng đỉnh w 7 Khôi phục tính chất thứ tự bộ phận của heap 5 6 w 9 16 diepht@vnu
- Thuật toán downheap Sau khi thay thế đỉnh gốc với đỉnh cuối (có khóa k), heap có thể mất đi tính chất thứ tự bộ phận Thuật toán downheap khôi phục lại tính chất này bằng cách đảo chỗ đỉnh có khóa k dọc theo đường đi từ gốc xuống Downheap dừng khi k tiến tới một lá hay một đỉnh có các khóa con ≥ k Do heap có độ cao O(log n), downheap thực hiện trong thời gian O(log n) 7 5 5 6 7 6 w w 9 9 17 diepht@vnu
- Cập nhật con trỏ tới đỉnh cuối Dùng trong cài đặt heap bằng cấu trúc liên kết Có thể tìm chỗ cho đỉnh sẽ thêm vào bằng cách đi theo hành trình gồm O(log n) đỉnh Đi lên tới khi gặp một con trái hoặc gặp gốc Nếu gặp một con trái thì chuyển sang con phải Đi xuống tới khi gặp một lá Áp dụng thuật toán tương tự cho cập nhật con trỏ tới đỉnh cuối trong phép loại bỏ một đỉnh 18 diepht@vnu
- Minh họa cài đặt hàng ưu tiên last comp (4,C) (5,A) (6,Z) (15,K) (9,F) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) (18,W) 19 diepht@vnu
- insert(2,T) (4,C) (5,A) (6,Z) (15,K) (9,F) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) (18,W) 20 diepht@vnu
- insert(2,T) (4,C) (5,A) (6,Z) (15,K) (9,F) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) (18,W) (2,T) 21 diepht@vnu
- insert(2,T) (4,C) (5,A) (6,Z) Đảo (15,K) (9,F) (7,Q) (20,B) (2,T) và (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) (18,W) (2,T) 22 diepht@vnu
- insert(2,T) (4,C) Đảo (2,T) và (5,A) (6,Z) (6,Z) (15,K) (9,F) (7,Q) (2,T) (16,X) (25,J) (14,E) (12,H) (11,S) (18,W) (20,B) 23 diepht@vnu
- insert(2,T) Đảo (4,C) (2,T) và (4,C) (5,A) (2,T) (15,K) (9,F) (7,Q) (6,Z) (16,X) (25,J) (14,E) (12,H) (11,S) (18,W) (20,B) 24 diepht@vnu
- insert(2,T) (2,T) (5,A) (4,C) (15,K) (9,F) (7,Q) (6,Z) (16,X) (25,J) (14,E) (12,H) (11,S) (18,W) (20,B) Sau thời gian O (log n) thì cây lại thành một heap 25 diepht@vnu
- removeMin() (4,C) (5,A) (6,Z) (15,K) (9,F) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) (18,W) 26 diepht@vnu
- removeMin() (4,C) (5,A) (6,Z) (18,W) (15,K) (9,F) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) 27 diepht@vnu
- removeMin() Đảo (18,W) (18,W) và (5,A) (5,A) (6,Z) (15,K) (9,F) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) 28 diepht@vnu
- removeMin() (5,A) (18,W) Đảo (18,W) (6,Z) và (9,F) (15,K) (9,F) (7,Q) (20,B) (16,X) (25,J) (14,E) (12,H) (11,S) 29 diepht@vnu
- removeMin() (5,A) (9,F) (6,Z) (15,K) (18,W) Đảo (18,W) (7,Q) (20,B) và (12,H) (16,X) (25,J) (14,E) (12,H) (11,S) 30 diepht@vnu
- removeMin() Đỉnh cuối (5,A) (9,F) (6,Z) (15,K) (12,H) (7,Q) (20,B) (16,X) (25,J) (14,E) (18,W) (11,S) 31 diepht@vnu
- Độ phức tạp Độ phức tạp không gian Cài bằng cấu trúc liên kết (dùng con trỏ): O(n) Cài bằng cấu trúc vector (mảng): tỉ lệ với N (cỡ của mảng) Độ phức tạp thời gian Phép toán Thời gian size, isEmpty O (1) findMin, findMinKey O (1) insert O (log n) removeMin O (log n) 32 diepht@vnu
- Tổng kết findMin insert removeMin Mảng được sắp O(1) O(n) O(1) Mảng không sắp O(n) O(1) O(n) DSLK được sắp O(1) O(n) O(1) DSLK không sắp O(n) O(1) O(n) Cây TKNP O(h) O(h) O(h) Cây thứ tự bộ phận O(1) O(logn) O(logn) (heap) 33 diepht@vnu
- Nội dung chính 1. KDLTT hàng ưu tiên 2. Các phương pháp cài đặt 3. Ứng dụng: xây dựng mã Huffman 34 diepht@vnu
- Nén dữ liệu Giả sử cần nén một tệp dữ liệu Chữ cái a b c d e f chứa 100000 ký tự từ bảng 6 chữ (1) cái (từ a đến f). Từ mã 000 001 010 011 100 101 Mã độ dài giống nhau (1) Chữ cái a b c d e f . biểu diễn mỗi chữ cái bởi 3 bit Tần suất (K) 45 13 12 16 9 5 (thay vì 8 bit như thường lệ) (2) . tỉ lệ nén = 3/8 Từ mã 0 101 100 111 1101 1100 Mã độ dài khác nhau (2) . dùng khi ta biết tần suất của các . Chú ý: không có mã nào được làm chữ cái tiền tố của mã khác . gán mã ngắn nhất cho chữ cái xuất gọi là mã tiền tố (prefix code) hiện nhiều nhất o mục đích: phục vụ giải nén . kích thước file nén: o . (45×1 + 13×3 + 12×3 + 16×3 + 9×4 + 5×4) Bài toán: xây dựng mã tiền tố với tỉ × 1000 = 224 000 bits lệ nén thấp nhất . tỉ lệ nén = 0.28 o Lời giải: mã Huffman 35 diepht@vnu
- Mã Huffman 100 Biểu diễn mã tiền tố dưới dạng cây nhị phân 0 1 tại mỗi đỉnh, nhánh trái được 45 55 gắn nhãn là 0, nhánh bên (a) phải được gắn nhãn là 1 0 1 mỗi ký tự được lưu trong một đỉnh lá 25 30 từ mã của mỗi ký tự là xâu bit 0 1 0 1 tạo thành từ các nhãn trên đường đi từ gốc tới đỉnh lá 12 13 14 16 chứa ký tự đó (c) (b) (d) Thuật toán Huffman sử dụng 0 1 hàng ưu tiên để xây dựng mã tiền tố dưới dạng cây nhị phân 5 9 (f) (e) Mã sinh ra gọi là mã Huffman Chữ cái a b c d e f Tần suất (K) 45 13 12 16 9 5 Từ mã 0 101 100 111 1101 1100 36 diepht@vnu
- Thuật toán Huffman Với mỗi ký tự xuất hiện trong xâu Algorithm HuffmanCoding(S,F) nguồn, ta tạo ra một đỉnh chứa ký Input: Bảng chữ cái S và bảng các tần tự đó suất F Output: cây Huffman gắn với giá trị ưu tiên bằng tần suất Tạo ra một đỉnh cho mỗi ký tự trong S hởi tạo hàng ưu tiên P chứa K các đỉnh Từ tập các cây chỉ có một đỉnh, tại này mỗi bước ta kết hợp hai cây for i=0 to n-1 do thành một cây v1 P.removeMin() đỉnh cha sẽ gắn với giá trị ưu tiên v P.removeMin() bằng tổng độ ưu tiên các con 2 Tạo ra đỉnh v mới với ta cần chọn hai cây nhị phân có mức ưu tiên nhỏ nhất để kết hợp v.leftChild v1 thành một dùng hàng ưu tiên. v.rightChild v2 v.f v1.f + v2.f P.insert(v) 37 diepht@vnu
- 45 (a) 12 13 16 (c) (b) (d) 5 9 (f) (e) 38 diepht@vnu
- 45 (a) 12 13 14 16 (c) (b) (d) 0 1 5 9 (f) (e) 39 diepht@vnu
- 45 (a) 25 0 1 12 13 14 16 (c) (b) (d) 0 1 5 9 (f) (e) 40 diepht@vnu
- 45 (a) 25 30 0 1 0 1 12 13 14 16 (c) (b) (d) 0 1 5 9 (f) (e) 41 diepht@vnu
- 45 55 (a) 0 1 25 30 0 1 0 1 12 13 14 16 (c) (b) (d) 0 1 5 9 (f) (e) 42 diepht@vnu
- 100 0 1 45 55 (a) 0 1 25 30 0 1 0 1 12 13 14 16 (c) (b) (d) 0 1 5 9 (f) (e) 43 diepht@vnu
- Mục tiêu bài học 1. KDLTT hàng ưu tiên 2. Các phương pháp cài đặt 3. Ứng dụng: xây dựng mã Huffman 44 diepht@vnu
- Chuẩn bị tuần tới Lý thuyết: Đọc chương 16 giáo trình (Thiết kế thuật toán) Thực hành: Bảng băm 45 diepht@vnu