You are on page 1of 21

Nhóm 5:

Thuật toán mã hoá


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 luôn 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ã hoá
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,17 0,15 0.12

𝐱𝟑 𝐱𝟔
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.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 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.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
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.41 1 0 0.59
1

𝐱𝟐 𝐱𝟑−𝟔 𝐱𝟒 𝐱𝟏−𝟓
0.24 0,17 0.32 0.27
0 1 0 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
0.41 1 0 0.59
1

00 𝐱𝟐 𝐱𝟑−𝟔 10 𝐱𝟒 𝐱𝟏−𝟓
0.24 0,17 0.32 0.27
0 1 0 1

010 𝐱𝟑 𝐱𝟔 011 110 𝐱𝟓 𝐱𝟏 111


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

𝐱𝟐 𝐱𝟒 𝐱𝟑 𝐱𝟔 𝐱𝟓 𝐱𝟏
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 H M U F A N
• Dựng cây mã Huffman 00 10 010 011 110 111
• 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 00-010-011-011-10-110-111
mã Huffman H U F F M A N
• Dựa vào cây mã Huffman ta thu
được mã hoá 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ự
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ố bit cần để biểu diễn file là :


S: 1 500*( 1*0.5 + 2*0.2 + 3*0.15 + 4*0.1 + 4*0.05) = 975 bit
V: 01 →975 bit < 1000 bit (so với cách thông thường)
D: 001
U: 0000
T: 0001
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 𝐱𝒓𝒐𝒐𝒇 1
x A B C D E

0 𝐱𝑩 0
𝐱𝑨−𝑬−𝑪−𝑫 f(x) 0.2 0.5 0.1 0.05 0.15

1
0.5 0.5

0
𝐱 𝑬−𝑪−𝑫 1
𝐱𝑨 11
0.3

𝐱𝑬 𝐱𝑪 −𝑫
0.2
100
0 1
0.15 0.15

1010 𝐱𝑪 𝐱𝑫 1011
0.1 0.05
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


x A B C D E
Từ bảng Huffman trên ta có:
A: 11 0.1
f(x) 0.2 0.5 0.05 0.15
B: 0 → 1011 11 1011 0 11 1010 100
C: 1010 D A D B A C E
D: 1011 →DADBACE
E: 100
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ã: = 2*0.2 + 1*0.5 + 4*0.1 + 4*0.05 + 3*0.15 =

●Hiệu suất bộ mã: / H(x) =


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 1 0 1

0 0 0 1 0 1
1 1
0 10
0 1 0 1 1

● Bị dư 110 → Không phải mã Huffman ● Đầy đủ các từ mã → Mã Huffman


THANKS
!

You might also like