Nhóm 5:
Thuật tốn mã hố
nguồn Huffman
Thành viên nhóm:
Nguyễn Duy Tin (102210380)
Nguyễn Văn Dũng (102210356)
Lê Tuấn Nguyên Khôi (102210359)
Nguyên tắc xây dựng cây mã Hufman
● Huffman đã đưa ra nguyên tắc để xây dựng hệ thống tối ưu như sau: để một mã
prefix có độ dài tối thiểu điều kiện cần và đủ là thỏa mãn 3 tính chất sau:
● Tính chất 1: Tính thứ tự độ dài các mã: Nếu sắp xếp các tin theo thứ tự giảm dần
của xác suất p()≥p() với i < j thì độ dài của các từ mã tương ứng phải thỏa điều kiện
ni≤nj.
● Tính chất 2: Tính chất của những từ mã cuối: với thõa mãn điều kiện 2 ≤ ≤ m
(m là cơ số mã) thì từ mã cuối ln có độ dài n bằng nhau, về trọng số chỉ khác nhau
ký hiệu bên phải
= .. = =
●
Tính chất 3: Tính liên hệ từ mã cuối và từ mà trước cuối: Một dãy gồm hiệu phải là
một từ mã là prefix của từ mã thứ N là từ mã cuối cùng của bộ mã
Đánh giá độ tối ưu của thuật toán Huffman
● Với phép mã hóa tối ưu ta có: = H(A)
● Nguồn rời rạc A = , i =
●
● H(A) =
Þ So sánh H(A)
Nhận xét: phép mã hóa trên là gần tối ưu.
Các bước xây dựng thuật toán Huffman
Đề bài Một văn bản được viết từ các kí từ … , biết tần số xuất hiện của các ký tự trong
văn bản lần lượt là 1200, 2400, 1200, 3200, 1500, 500 ( lần ). Hãy thực hiện mã hố
Huffman cho văn bản
Kí tự
Tần số
1200
2400
1200
3200
1500
500
Tần suất
0.12
0.24
0.12
0.32
0.15
0.05
Bước 1: Sắp xếp nguồn X theo xác suất giảm dần
Kí tự
Tần số
3200
2400
1500
1200
1200
500
Tần suất
0.32
0.24
0.15
0.12
0.12
0.05
Các bước xây dựng thuật toán Huffman
Bước 2: Tạo danh sách chứa các nút lá bao gồm phần tử đầu vào và trọng số nút là
tần suất xuất hiện của nó theo xác suất trong bảng đã sắp xếp
𝐱𝟒 𝐱𝟐 𝐱𝟓 𝐱𝟏 𝐱𝟑 𝐱𝟔
0.32
0.24
0,15
0.12
0,12
0,05
Các bước xây dựng thuật toán Huffman
Bước 3: Từ danh sách này, lấy ra 2 phần tử có tần suất xuất hiện ít nhất. Sau đó gắn 2 nút vừa
lấy ra vào một nút gốc mới với trọng số là tổng của 2 trọng số ở nút vừa lấy ra để tạo thành một
cây.
𝐱𝟒 𝐱𝟐 𝐱𝟓 𝐱𝟏 𝐱𝟑 𝐱𝟔
0.32
0.24
0,15
0.12
0,12
0,05
𝐱𝟑−𝟔
0,17
Các bước xây dựng thuật toán Huffman
Bước 4: Đẩy cây mới vào lại danh sách.
𝐱𝟒
𝐱𝟐
0.32
0.24
𝐱𝟑−𝟔
𝐱𝟓
𝐱𝟏
0,15
0.12
0,17
𝐱𝟑 𝐱𝟔
0,12
0,05
Bước 5: Lặp lại bước 3 và 4 cho đến khi danh sách chỉ còn 1 nút gốc duy nhất của cây.
Các bước xây dựng thuật toán Huffman
Lần lập 1:
𝐱𝟒
𝐱𝟏−𝟓
𝐱𝟐
𝐱𝟑−𝟔
0.32
0.27
0.24
0,17
𝐱𝟓 𝐱𝟏
0,15
0.12
𝐱𝟑 𝐱𝟔
0,12
0,05
Các bước xây dựng thuật toán Huffman
Lần lập 2:
𝐱𝟐−𝟑−𝟔
0.41
𝐱𝟐
𝐱𝟑−𝟔
0.24
0,17
𝐱𝟒
𝐱𝟏−𝟓
0.32
0.27
𝐱𝟓 𝐱𝟏
0,15
𝐱𝟑 𝐱𝟔
0,12
0,05
0.12
Các bước xây dựng thuật toán Huffman
Lần lập 3:
𝐱𝟐−𝟑−𝟔
𝐱𝟒−𝟏−𝟓
0.41
0.59
𝐱𝟐
𝐱𝟑−𝟔
𝐱𝟒
𝐱𝟏−𝟓
0.24
0,17
0.32
0.27
𝐱𝟑 𝐱𝟔
0,12
0,05
𝐱𝟓 𝐱𝟏
0,15
0.12
Các bước xây dựng thuật toán Huffman
Lần lập 4:
𝐱𝒓𝒐𝒐𝒇
1
𝐱𝟐
0.24
𝐱𝟐−𝟑−𝟔
𝐱𝟒−𝟏−𝟓
0.41
0.59
𝐱𝟑−𝟔
𝐱𝟒
0,17
𝐱𝟏−𝟓
0.27
0.32
𝐱𝟑
𝐱𝟔
𝐱𝟓
𝐱𝟏
0,12
0,05
0,15
0.12
Các bước xây dựng thuật toán Huffman
Bước 6: Xuất phát từ nút góc đánh số tập tin 0,1 cho các nhánh ( 0 cho nhánh
bên trái, 1 cho nhánh bên phải ). Quá trình sẽ được dùng lại khi tất cả các nhánh
đều đã được gán mã
𝐱𝒓𝒐𝒐𝒇
0
1
1
𝐱𝟒−𝟏−𝟓
𝐱𝟐−𝟑−𝟔
0
𝐱𝟐
0.24
0.41
1
0
𝐱𝟑−𝟔
0,17
0
0.59
𝐱𝟒
0.32
1
1
𝐱𝟏−𝟓
0
0.27
1
𝐱𝟑
𝐱𝟔
𝐱𝟓
𝐱𝟏
0,12
0,05
0,15
0.12
Các bước xây dựng thuật toán Huffman
Bước 7: Đánh mã cho các nút lá, loại tất cả các nút phụ ta thu được tập tin cần
tìm
𝐱𝒓𝒐𝒐𝒇
0
1
1
𝐱𝟒−𝟏−𝟓
𝐱𝟐−𝟑−𝟔
0
00
0.41
1
0
𝐱𝟑−𝟔
𝐱𝟐
0,17
0.24
0
010
10
𝐱𝟒
0.32
1
𝐱𝟑
𝐱𝟔
0,12
0,05
011
0.59
110
1
𝐱𝟏−𝟓
0
0.27
1
𝐱𝟓
𝐱𝟏
0,15
0.12
111
Các bước xây dựng thuật toán Huffman
Bước 7: Đánh mã cho các nút lá, loại tất cả các nút phụ ta thu được tập tin cần
tìm
𝐱𝟐 𝐱𝟒 𝐱𝟑 𝐱𝟔 𝐱𝟓 𝐱𝟏
00
10
010
011
110
111
Ứng dụng mã hoá Huffman để nén file
Các bước thực hiện nén:
• Đọc file và xác định các ký tự xuất
hiện trong file & tần suất của
chúng
• Dựng cây mã Huffman
• Dựa vào cây mã thu được mã hóa
từng ký tự và ghi vào file nén
• Lưu cây mã vào cuối file nén
Các bước thực hiện giải nén:
• Dựa vào cây mã đã được lưu vào
cuối file nén ta xây dựng lại cây
mã Huffman
• Dựa vào cây mã Huffman ta thu
được mã hố của từng ký tự
• Sau đó dựa vào file đã nén tiền
hành mã hoá ngược lại từng kí tự
H
M
U
F
A
N
00
10
010
011
110
111
00-010-011-011-10-110-111
H
U
F
F
M
A
N
Ví dụ minh hoạ
Ví dụ : Một file có 500 kí tự tương ứng với 5 kí tự khác nhau là S, V, D, U, T. Mỗi
kí tự sẽ có xác suất xuất hiện lần lượt là S: 0.5, V: 0.2, D: 0.15, U: 0.1, T: 0.05 .
Dùng giải thuật mã hóa Huffman, tính độ lớn của file sau khi mã hóa.
● Đối với cách mã hóa thơng thường, để mã hóa 500 kí tự cần tới 1500 bit để
mã hóa vì để biểu diễn mỗi kí tự cần 3 bit.
●Với cách mã hóa Huffman ta sẽ gán các chuỗi bit ngắn nhất cho các kí tự có
xác suất xuất hiện cao nhất.
Ta gán:
S: 1
V: 01
D: 001
U: 0000
T: 0001
→Số bit cần để biểu diễn file là :
500*( 1*0.5 + 2*0.2 + 3*0.15 + 4*0.1 + 4*0.05) = 975 bit
→975 bit < 1000 bit (so với cách thông thường)
Bài tập 1 Cho bảng phân phối xác suất các tín hiệu rời rạc như sau:
x
A
B
C
D
E
f(x)
0.2
0.5
0.1
0.05
0.15
a) Xây dựng bộ mã Huffman
b) Giải mã đoạn mã nhị phân sau: 10111110110111010100
c) Tính hiệu suất bộ mã
Bài tập 1: Cho bảng phân phối xác suất các tín hiệu rời rạc như sau:
a) Xây dựng bộ mã Huffman
𝐱𝒓𝒐𝒐𝒇
0
0
𝐱𝑩
𝐱 𝑨−𝑬−𝑪−𝑫
0
0.5
0
100
1
𝐱 𝑬−𝑪−𝑫
𝐱𝑬
0.3
0.5
1
𝐱𝑨
1
𝐱𝑪 −𝑫
0
0.15
11
0.2
1
0.15
1010
𝐱𝑪
0.1
𝐱𝑫
0.05
1011
x
A
B
C
D
E
f(x)
0.2
0.5
0.1
0.05
0.15
Bài tập 1 Cho bảng phân phối xác suất các tín hiệu rời rạc như sau:
b) Giải mã đoạn mã sau: 10111110110111010100
Từ bảng Huffman trên ta có:
A: 11
B: 0
→ 1011 11 1011 0 11 1010 100
C: 1010
D
A D B A C
E
D: 1011 →DADBACE
E: 100
x
A
B
C
D
E
f(x)
0.2
0.5
0.1
0.05
0.15
c) Tính hiệu suất bộ mã
●Entropy
= -0.2* -0.5* -0.15* -0.1* -0.05* =
●Độ dài trung bình của từ mã:
●Hiệu suất bộ mã:
/ H(x) =
= 2*0.2 + 1*0.5 + 4*0.1 + 4*0.05 + 3*0.15 =
Bài tập 2: Cho các mã sau, mã nào là mã Huffman:
a) 010, 00, 011, 10, 111
b) 000, 001, 010, 011, 11, 10
a)
b)
0
0
1
0
1
0
1
0
1
0
1
0
1
● Bị dư 110 → Không phải mã Huffman
0
0
1
10
1
1
● Đầy đủ các từ mã → Mã Huffman
THANKS
!