You are on page 1of 28

BÁO CÁO MÔN CẤU TRÚC DỮ LIỆU VÀ

GIẢI THUẬT

Ứng dụng cây nhị phân trong mã hoá Huffman

Tháng 5/2023
Nhóm sinh viên thực hiện

1, Nguyễn Hoàng Hiệp 20213703

2, Trương Việt Hưng 20213711

3, Đới Đăng Trung 20213733

4, Lê Hoàng Long 20213714

5, Huỳnh Quang Đức 20210191

Giáo viên hướng dẫn: Thầy Phạm Doãn Tĩnh


Mục lục

1. Giới thiệu chung


2. Xây dựng thuật toán Huffman
3. Run code
4. Nhận xét và đánh giá

3
1. GIỚI THIỆU CHUNG
Đặt vấn đề

• Trong kỹ thuật truyền tin nối tiếp, do các bit dữ liệu được truyền đi nối tiếp, lại bị giới
hạn về dải thông của kênh truyền và giới hạn về các chuẩn ghép nối...nên tốc độ
truyền tin tương đối chậm.

• Thông thường hầu hết các tập tin trong máy tính có rất nhiều thông tin dư thừa, việc
thực hiện mã hoá tập tin thực chất là để loại bỏ các thông tin dư thừa đó.

5
Nén dữ liệu

• Nén dữ liệu là quá trình mã hóa thông tin dùng ít bit hơn so với thông tin
chưa được mã hóa bằng cách dùng một hoặc kết hợp của các phương pháp
nào đó
• Dựa theo nguyên tắc này giúp tiết kiệm các tài nguyên như dung lượng bộ
nhớ, băng thông, thời gian…
 Giúp tránh các hiện tượng kênh truyền bị quá tải và việc truyền tin trở nên
có kinh tế hơn
Nén dữ liệu

• Với một số yêu cầu nén dữ liệu bao gồm khả năng giữ nguyên đầy
đủ thông tin ban đầu, khả năng nén các tệp tin văn bản và tệp tin
hiệu quả và tốc độ giải nén nhanh…

 Đề xuất các loại thuật toán nén không tổn hao gồm: Mã hóa
Shannon, Fano, Huffman… được dùng để nén các file như file thực
thi, văn bản, word, excel…
So sánh các thuật toán
Tiêu chí Mã hóa Shannon Mã hóa Fano Mã hóa Huffman
Cơ chế Chuyển giá trị xác suất Chia các ký tự thành 2 Sử dụng cây Huffman
của ký tự từ hệ thập nhóm con có tổng xác để tạo bảng mã cho các
phân sang hệ nhị phân suất xấp xỉ nhau ký tự dựa trên tần suất
xuất hiện
Trình tự sắp Thứ tự giảm dần Thứ tự tăng dần hoặc Thứ tự tăng dần hoặc
xếp xác suất giảm dần giảm dần
Độ phức tạp O(n^2) O(nlogn) O(nlogn)
thuật toán
Dung lượng Trung Bình Thấp Thấp
lưu trữ
Độ dài mã Cố định Không cố định tùy Ngắn
thuộc vào cách chia
nhóm
Hiệu quả mã Trung bình Trung bình Cao
hóa
Ứng dụng Tạo các mã có độ dài Tối ưu hóa dung lượng Tối ưu hóa dung lượng
cố định, tối ưu hóa và độ phức tạp tính toán lưu trữ, tạo ra các mã
tổng độ dài mã: ngắn hơn so với thuật
toán khác
Thuật toán mã hoá Huffman và Minh hoạ

• Trong khoa học máy tính và lý thuyết thông tin, mã Huffman là một thuật toán mã hóa dùng để nén dữ liệu được phát
minh bởi David A. Huffman vào năm 1952. Mã hoá Huffman hoạt động dựa trên việc xây dựng một cây Huffman từ tần
suất xuất hiện của các ký tự trong dữ liệu cần nén.

• Quá trình mã hoá Huffman bắt đầu bằng việc tạo một bảng tần suất xuất hiện của các ký tự trong dữ liệu. Sau đó, các ký
tự được sắp xếp theo tần suất xuất hiện từ thấp đến cao. Tiếp theo, cây Huffman được xây dựng bằng cách lặp lại việc
ghép nút lá có tần suất nhỏ nhất thành các nút cha và gán bit 0 cho nhánh trái và bit 1 cho nhánh phải.

9
Thuật toán mã hoá Huffman và Minh hoạ

• Sau khi cây Huffman được xây dựng, mã hóa Huffman được tạo ra bằng cách gán các mã bit cho mỗi ký tự dựa trên vị
trí của ký tự đó trong cây Huffman. Ký tự xuất hiện nhiều lần sẽ có mã bit ngắn hơn so với ký tự xuất hiện ít lần.

• Quá trình giải mã Huffman cũng sử dụng cây Huffman để giải mã các chuôi mã bit thành các ký tự gốc ban đầu.

10
2. XÂY DỰNG THUẬT
TOÁN HUFFMAN
Bài toán được đặt ra:
Cho các tập tin văn bản không dấu, có các kí tự từ a đến z và từ A đến Z (trong đó
có một số kí tự nào đó có xác suất xuất hiện nhiều hơn các kí tự khác). Yêu cầu mã hoá
các kí tự trên thành chuỗi dạng mã nhị phân.
Input: File text không dấu chứa các kí tự từ a đến z và từ A đến Z.
Output: Chuỗi đã được mã hoá nhị phân.

12
Các cấu trúc và thuật toán được sử dụng:
• Hàng đợi ưu tiên ( Priority queue )
• Danh sách liên kết ( Linkedlist)
• Giải thuật sắp xếp Insertion Sort
• Giải thuật đệ quy
• Cây nhị phân ( Binary Tree )

13
• Sơ đồ giải thuật
Khởi tạo Node cho cây Huffman

15
Biểu diễn Priority Queue bằng Linkedlist

• Trong biểu diễn này, mỗi phần tử trong Priority Queue được đại diện bởi
một nút trong danh sách liên kết. Mỗi nút chứa hai thành phần chính: giá trị
của phần tử và mức độ ưu tiên của phần tử đó.
• Linkedlist được sắp xếp theo thứ tự ưu tiên, nghĩa là các phần tử có mức
độ ưu tiên cao hơn được đặt trước trong danh sách. Khi chèn một phần tử
mới vào Priority Queue, nút mới được tạo và chèn vào danh sách liên kết
sao cho thứ tự ưu tiên được duy trì.
• Khi đó, để truy xuất phần tử có mức độ ưu tiên cao nhất, ta chỉ cần truy cập
đến đầu danh sách liên kết.
16
Sử dụng giải thuật Insertion Sort để chèn node mới vào danh sách liên kết

Giải thuật Insertion Sort là một giải thuật sắp xếp đơn
giản dựa bằng cách duyệt qua từng phần tử trong mảng,
và chèn phần tử đó vào vị trí đúng trong đoạn đã sắp xếp
của mảng.

17
Kiểm tra Input
Bằng cách kiểm tra tính hợp lệ của dữ liệu đầu vào trước khi tiếp tục xử lý để đảm bảo rằng dữ liệu đáp ứng
các yêu cầu và ràng buộc cần thiết, giúp đảm bảo tính toàn vẹn và độ tin cậy của quá trình xử lý. Hàm kiểm tra
Input thường trả về kết quả boolean (True hoặc False) để chỉ ra tính hợp lệ của dữ liệu đầu vào. Ngoài ra, hàm
kiểm tra input cũng có thể ném ra các ngoại lệ hoặc thông báo lỗi khi dữ liệu không hợp lệ.

18
Xây dựng
cây
Huffman

19
Hàm mã hoá
Phép duyệt Binary Tree (Traversal): là phép thăm một cách hệ thống tất cả các nút của cây,
mỗi nút đúng một lần.

20
Tạo bảng
mã và in
thành chuỗi

21
Giải mã
Xuất chuỗi mã hoá sang file text và giải mã

23
3. Run Code
Kết quả

25
4. Nhận xét
và đánh giá
• Phương pháp thực hiện thuật toán tương đối
đơn giản, đòi hỏi ít bộ nhớ, có thể xây dựng
trên các mảng bé hơn 64KB
• Phải chứa cả bảng mã vào tập tin nén thì phía
nhận mới có thể giải mã được do đó hiệu suất
nén chỉ cao khi ta thực hiện các tập tin lớn
Là thuật toán nén cơ bản làm cơ sở cho các
thuật toán nén phức tạp hơn
THANK YOU !

28

You might also like