GIẢI THUẬT NÉN HUFFMAN

28 294 0
GIẢI THUẬT NÉN HUFFMAN

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Giải thuật nén Huffman Nén tĩnh (Static Huffman) Nén động (Adaptive Huffman) Nén tĩnh (Static Huffman) Giới thiệu • Mã hóa Huffman (David A Huffman)là thuật tốn mã hóa dùng để nén liệu • Dựa bảng tần suất xuất kí tự cần mã hóa để xây dựng mã nhị phân cho kí tự cho dung lượng (số bit) sau mã hóa nhỏ Trong mã ASCII, ký tự biểu diễn chuỗi bit Ý tưởng Giảm số bit để biểu diễn ký tự Dùng chuỗi bit ngắn để biểu diễn ký tự xuất nhiều Sử dụng mã tiền tố để phân cách ký tự Ký tự A B C D E Mã bit 000 001 010 011 100 Ký tự A B C D E Tần suất 15 10 Ký tự A B C D E Mã bit 000 01 011 100 Ký tự A B C D E Ký tự A B C D E Mã bit 01000001 01000010 01000011 01000100 01000101 Mã tiền tố 00 11 01 100 101 Cây Huffman Là nhị phân, nút chứa ký tự trọng số (tần suất ký tự đó) Mỗi ký tự biểu diễn nút (tính tiền tố) Nút cha có tổng ký tự, tổng trọng số nút Các nút có trọng số, ký tự tăng dần từ trái sang phải Các nút có trọng số lớn nằm gần nút gốc Các nút có trọng số nhỏ nằm xa nút gốc Mã Huffman Là chuỗi nhị phân sinh dựa HuffmanHuffman ký tự đường dẫn từ nút gốc đến nút • Sang trái ta bit • Sang phải ta bit Có độ dài biến đổi (tối ưu bảng mã) • Các ký tự có tần suất lớn có độ dài ngắn • Các ký tự có tần suất nhỏ có độ dài dài Thuật toán nén tĩnh (Static Huffman) B1: Duyệt file, lập bảng thống kê tuần suất xuất ký tự B1 B2: Xây dựng Huffman dựa vào bảng thống kê B2 B3: Sinh mã Huffman cho ký tự dựa vào Huffman B3 B4: Duyệt file, thay toàn ký tự mã Huffman tương ứng B4 B5: Lưu lại Huffman (bảng mã) dùng cho việc giải nén Xuất file nén B5 Chuỗi ký tự cần nén F = “ABABBCBBDEEEABABBAEEDDCCABBBCDEEDCBCCCCDBBBCAAA” Bảng tần suất xuất Ký tự A B C D E Tần suất 15 10 N = 47 Xây dựng Huffman Thuật toán tham lam B1: Tạo N cây, có nút gốc, nút gốc chứa kí tự trọng số (tần suất ký tự đó) (N = số ký tự) B2: Lặp lại thao tác sau nhất: + Ghép có trọng số gốc nhỏ thành nút cha, có tổng ký tự, tổng trọng số trọng số nút + Xóa duyệt + Điều chỉnh lại vi phạm tính chất Xây dựng Huffman Ký tự B C A E D Tần suất 15 10 Ký tự B DE C A Tần suất 15 13 10 DE | 13 D|6 Ký tự AC B DE E|7 Tần suất 19 15 13 Ký tự Tần suất BDE 28 AC 19 Ký tự Tần suất ABCDE 47 Bài tập: Nén chuỗi sau giải thuật nén tĩnh – Static Huffman F= “CNTT10110CLCCNNTTT10000CCCCLLLLCCCTTTT11000 NTNNN000TNT” N = 54 Ký tự Tần suất 12 Ký tự Mã Huffman 01 1111 C 11 C 00 L L 1110 N N 110 T 12 T 10 Kết FOutput = “001101010111101111111110100111000001101101010101111010101010000000011 101110111011100000001010101011111111010101110101101101100101011011010” Ưu - Nhược điểm Ưu điểm Nhược điểm • Hệ số nén tương đối cao • Phương pháp thực tương đối đơn giản • Đòi hỏi nhớ • Mất lần duyệt file nén • Phải lưu trữ thơng tin giải mã vào file nén • Phải xây dựng lại Huffman giải nén Nén động (Adaptive Huffman) Ưu điểm • Khắc phục nhược điểm Static Huffman • Đầu đọc vừa duyệt, vừa cập nhật Huffman, vừa xuất kết file nén theo thời gian thực • (Ngược lại) Cây Huffman Tính chất anh em: Trọng số nút bên trái phải nhỏ nút bên phải, nhỏ nút cha Nút NYT (not yet transmitted) có trọng số ln = 0, dùng dể nhận biết ký tự xuất hay chưa Trọng số nút cha tổng trọng số nút Thuật toán nén động (Adaptive Huffman) B1: Duyệt ký tự có file nhập TH1: Nếu ký tự chưa tồn tại: + Chuỗi bit: đường dẫn đến NYT + Mã bit ký tự + Chèn nút (Ký tự | trọng số = 1) vào NYT Đánh lại số thứ tự TH2: Nếu ký tự tồn tại: + Chuỗi bit: đường dẫn đến ký tự + Tăng trọng số ký tự (+1) B2: + Tăng trọng số nút cha (+1) + Nếu vi phạm tính anh em  điều chỉnh hết vi phạm B3: Lưu chuỗi bit vào file xuất Lặp lại B1, B2 đến duyệt hết file Thuật toán điều chỉnh + Nếu trọng số nút hành > nút lân cận từ phải sang trái, từ lên  Vi phạm + Tìm nút xa có trọng số cao < trọng số nút vi phạm  Hốn đổi vị trí TH1: Ký tự chưa tồn F = “AABBB” NYT | 01 #0 #2 NYT (new) #0 FOutput = 01000011 A|1 #1 TH1: Ký tự tồn F = “AABBB” Root | 21 #0 #2 NYT (new) #0 FOutput = 01000011 A | 21 #1 TH1: Ký tự chưa tồn F = “AABBB” Root | 32 #2 #4 A|2 NYT NYT (new) #0 #0 #2 B|1 #1 FOutput = 010000111 001000010 #1 #3 TH2: Ký tự tồn F = “AABBB” Root | 434 #4 A|2 21 NYT (new) #0 #2 B | 12 #1 FOutput = 010000111001000010 01 #3 TH2: Ký tự tồn (vi phạm) F = “AABBB” Root | 445 #4 A|2 NYT (new) #0 #2 B | 23 #1 FOutput = 01000011100100001001 01 #3 Thuật toán giải nén B1: Duyệt file, đọc bit file nén duyệt B2: Xuất ký tự tương ứng duyệt hết nút B3: Nếu gặp nút NYT, đọc bit Xuất ký tự tương ứng Cập nhật ký tự vừa xuất vào B4: Thực B1, B2, B3 duyệt hết file B5: Xuất file giải nén Bài tập: Nén chuỗi sau giải thuật nén động – Adaptive Huffman F = “CNTTCLCCNTTCLCCNTT” Ký tự C L N T Mã bit 01000011 01001100 01001110 01010100 FOutput = “C 0N 00T 101 101 100L 11 101 10 10 1001 0 101 10 10” Thanks for your listening ! Thực Nguyễn Văn Hòa Cái Ngọc Tịnh Tiến

Ngày đăng: 11/05/2018, 11:15