Trong thời buổi công nghệ thông tin bùng nổ hiện nay, cùng với sự phát triển hết sức mạnh mẽ của nghành Tin Học. Khoa học máy tính đang dần chiếm lĩnh thế giới, chính vì vậy các môn học về công nghệ máy vi tính luôn dẫn đầu hiện nay và Lý Thuyết Đồ Thị không ngoại lệ. Năm 1736 với bài toán kinh điển “ 7 cây cầu ở Konigsburg” của nhà toán học Leonhard Euler ( 1707 – 1783 ) được công bố, mở rộng thêm hướng đi mới cho Tin học hiện đại. Lý Thuyết Đồ Thị là môn học thú vị, giúp sinh viên có cơ hội làm quen với những bài toán cùng nhiều thuật toán đồ thị ứng dụng cao trong thực tế…, qua đó nâng cao khả năng lập trình cho sinh viên. Trong đó phương pháp mã hóa Huffman là một ví dụ, đây là một trong những phương pháp nén hay đã có nhiều công trình nghiên cứu ứng dụng của nó vào thực tiễn. Vì vậ , em chọn đề tài để báo cáo.
Trang 1TRƯỜNG ĐH SƯ PHẠM TP HỒ CHÍ MINH
KHOA TOÁN – TIN
-òòòòòò -MÔN LÝ THUYẾT ĐỒ THỊ
BÁO CÁO ĐỀ TÀI
Trang 2LỜI NÓI ĐẦU
Trong thời buổi công nghệ thông tin bùng nổ hiện nay, cùng với sự phát triển hết sức mạnh mẽcủa nghành Tin Học Khoa học máy tính đang dần chiếm lĩnh thế giới, chính vì vậy các môn học
về công nghệ máy vi tính luôn dẫn đầu hiện nay và Lý Thuyết Đồ Thị không ngoại lệ
Năm 1736 với bài toán kinh điển “ 7 cây cầu ở Konigsburg” của nhà toán học Leonhard Euler
( 1707 – 1783 ) được công bố, mở rộng thêm hướng đi mới cho Tin học hiện đại
Lý Thuyết Đồ Thị là môn học thú vị, giúp sinh viên có cơ hội làm quen với những bài toán cùng
nhiều thuật toán đồ thị ứng dụng cao trong thực tế…, qua đó nâng cao khả năng lập trình cho
sinh viên Trong đó phương pháp mã hóa Huffman là một ví dụ, đây là một trong những
phương pháp nén hay đã có nhiều công trình nghiên cứu ứng dụng của nó vào thực tiễn Vì vậ ,
em chọn đề tài để báo cáo
Trong quá trình làm đề tài, em đã cố gắng học tập, tìm tài liệu, lắng nghe sự chỉ bảo tận tình củathầy trong các buổi học Do sự hiểu biết kiến thức chưa sâu về bộ môn lẫn kỹ thuật lập trình Đềtài hoàn thành nhưng vẫn còn nhiều thiết sót
Xin thầy xem xét lượng thứ, và đóng góp ý kiến để em ý thức hơn và rút kinh nghiệm cho các
đề tài sau này
Cuối cùng, em chân thành cám ơn thầy đã tạo cơ hội cho em hiện đề tài
NHẬN XÉT CỦA GIÁO VIÊN BỘ MÔN
Trang 3
MỤC LỤC
Trang 4Chương 1 : TỔNG QUAN VỀ NÉN DỮ LIỆU
I Giới thiệu 5
II Tỷ lệ nén 5
III Phân loại các phương pháp nén 5
IV Các phương pháp nén thứ nhất 6
1 Mã hóa loạt dài RLC (Run Length Coding) 2 Mã hóa Huffman 3 Mã hóa LZW (Lempel Ziv-Wench) V Kết luận 8
Chương 2 : PHƯƠNG PHÁP MÃ HÓA HUFFMAN PHẦN 1 : SƠ LƯỢC VỀ LỊCH SỬ PHƯƠNG PHÁP MÃ HUFFMAN 9
PHẦN 2 : MÃ TIỀN TỐ ( PREFIX-FREE BINARY CODE ) I Nội dung 9
II Biểu diễn mã tiền tố trên cây nhị phân 10
III Tính tối ưu của độ dài mã .13
PHẦN 3 : MÃ HUFFMAN I Nguyên tắc 15
II Định lý Huffman 15
III Phương pháp sinh mã Huffman 15
IV Cây Huffman 17
V Thuật toán 20
VI Tóm tắt các bước mã hóa và giải mã văn bản 21
Chương 3 : VIẾT CHƯƠNG TRÌNH NÉN VÀ GIẢ NÉN PHẦN 1 : HỖ TRỢ THỰC HIỆN 22
PHẦN 2 : TẠO MÃ HUFFMAN CHO MỘT XÂU KÝ TỰ I Tìm hiểu đoạn code 22
II Code chương trình 24
III Demo chương trình 27
PHẦN 3 : CÀI ĐẶT CHƯƠNG TRÌNH NÉN VÀ GIẢI NÉN BẰNG C# I Hình ảnh phần mềm 27
II Code chương trình 27
III Demo chương trình 28
CHƯƠNG 1 : TỔNG QUAN VỀ NÉN DỮ LIỆU
Trang 5I Giới thiệu
đi thường rất lớn, gây tốn kém tài nguyên mạng, tiêu phí khả năng của hệ thống… Để giải quyết vấn đề đó, các thuật toán nén đã được ra đời
các kí tự khác
(analog signal) khác các tín hiệu này có thể có các mẫu được lặp lại nhiều lần
II Tỷ lệ nén (Compression Rate)
Tỷ lệ nén là một trong các đặc trưng quan trọng nhất của mọi phươngpháp nén Tuy
nhiên, về cách đánh giá và các kết quả công bố trong các tài liệu cũng cầnquan tâm xem xét
Nhìn chung, người ta định nghĩa tỷ lệ cơ bản của phương pháp nén Nhiều khi tỷ
dữ liệu: vấn đề đặt ra là hiệu quả nén có tương hợp với đường truyền không
Cũng cần phân biệt dữ liệu với nén băng truyền Mục đích chính của nén
là giảm lượng
thông tin dư thừa và dẫn tới giảm kích thước dữ liệu Tuy vậy, đôi khi quátrình nén cũng làm
giảm băng truyền tín hiệu số hóa thấp hơn so với truyền tín hiệu tương tự
III Phân loại các phương pháp nén
Có nhiều cách phân loại các phương pháp nén khác nhau
1 Cách thứ nhất : Dựa vào nguyênlý nén Cách này phân các phương pháp nénthành hai họ:
Nén chính xác hay nén không mất thông tin: họ này bao gồm các
phương pháp nén mà
sau khi giải nén ta thu được chính xác dữ liệu gốc
Nén có mất thông tin: họ này bao gồm các phương pháp mà sau khi
giải nén ta không
thu được dữ liệu như bản gốc Phương pháp này lợi dụng tính chất của mắt người, chấp nhận một
số vặn xoắn trong ảnh khi khôi phục lại Tất nhiên, các phương pháp này chỉ
có hiệu quả khi mà
độ vặn xoắn chấp nhận được bằng mắt thường hay với dung sai nào đấy
Trang 62 Cách thứ hai : Dựa vào cách thức thực hiện nén Theo cách này, người ta
sự biến đổi của ảnh gốc mà không tác động trực tiếp như họ trên
3 Cách thứ ba : Dựa vào triết lý của sự mã hóa.Cách này phân các phương pháp nén thành hai họ:
Các phương pháp nén thế hệ thứ nhất: Gồm các phương pháp mà
mức độ tính toán làđơn giản, thí dụ việc lấy mẫu, gán từ mã,.v.v
Các phương pháp nén thế hệ thứ hai: dựa vào độ bão hòa của tỷ lệ
nén
IV Các phương pháp nén thứ nhất
- Mã hóa loạt dài RLC (Run Length Coding)
- Mã hóa Huffman
- Mã hóa LZW (Lempel Ziv-Wench)
1. Phương pháp mã hoá độ dài loạt (Run-Length Encoding)
được biểu diễn dưới dạng bitmap là các chuỗi bit có đường chạy dài Trên thực tế, nó được dùng trong các tập tin PCX, RLE, các vùng dữ liệu hằng của các tập tin chương trình, một số tập tin văn bản
Chuỗi kí tự trên được mã hoá lại : 4A3BAA5B 8CDABCB3A4B3CD
Chú ý : là không đáng để mã hoá các loạt chạy có độ dài 1 hoặc 2 vì cần đến hai kí tự
để mã hoá
chuỗi kí tự có chứa số Nếu những kí tự khác được sử dụng để mã hoá các số đếm, thì
nó sẽ không làm việc với các chuỗi chứa các kí tự đó Giả sử ta phải mã hoá bất kì kí tựnào từ một bảng chữ cái cố định bằng cách chỉ dùng các kí tự từ bảng chữ cái đó Ðể minh hoạ, giả sử ta phải mã hoá bất kì một chuỗi nào từ một chữ cái đó, ta sẽ giả định rằng ta chỉ có 26 chữ cái trong bảng chữ cái (và cả khoảng trống) để làm việc
của chuỗi sẽ được mã hoá, ta phải chọn một kí tự được gọi là kí tự "Escape" Mỗi một
sự xuất hiện của kí tự đó báo hiệu rằng hai chữ cái tiếp theo sẽ tạo thành một cặp (số đếm, kí tự) với các số đếm được biểu diễn bằng cách dùng kí tự thứ i của bảng chữ cái
Trang 7để biểu diễn số i Vì vậy, chuỗi ví dụ của chúng ta sẽ được biểu diễn như sau với Q được xem là các kí tự "Escape"
QDA BBB AA BQH CDABCB AAA QDB CCC D
ý rằng không đáng để mã hoá các đường chạy có chiều dài ít hơn bốn kí tự, vì ít nhất là cần đến ba kí tự để mã hoá bất kì một loạt chạy nào
dụng một dãy "Escape" với số đếm là 0 (kí tự space) để biểu diễn kí tự "Escape" Như vậy trong trường hợp kí tự "Escape" xuất hiện nhiều thì có thể làm cho tập tin nén phình to hơn trước
chạy gồm 51 chữ A sẽ được mã hoá như QZAQYA bằng cách dùng trên
2 Phương pháp nén Huffman
Dựa vào mô hình thống kê, tính tần suất xuất hiện của các ký tự, rồi gán cho các ký tự có tần suấtcao một từ mã ngắn, các ký tự tần suất thấp từ mã dài Phương pháp này phải lưu giữ lại bảng mãgắn kèm cùng với dữ liệu nén
3 Phương pháp nén LZW
Thuật toán này là sự chuyển giao của thuật toán LZ78
Phương pháp nén LZW được phát minh bởi Lempel - Zip và Welch Nó hoạt động đựa trên một
ý tưởng rất đơn giản là người mã hoá và người giải mã cùng xây dựng bản mã Nguyên tắc hoạt động :
Phần quan trọng nhất của phương pháp nén này là phải tạo một mảng rất lớn dùng để lưu giữ các
chúng liền được giữ lại trong một bộ đệm chứa (Accumulator) và đem so sánh với các chuỗi đã
có trong "từ điển"
Nếu chuỗi dữ liệu trong bộ đệm chứa không có trong "từ điển" thì nó được bổ sung thêm vào "từđiển" và chỉ số của chuỗi ở trong "từ điển" chính là dấu hiệu của chuỗi Nếu chuỗi trong bộ đệmchứa đã có trong "từ điển" thì dấu hiệu của chuỗi được đem ra thay cho chuỗi ở dòng dữ liệu ra
Có bốn qui tắc để thực hiên việc nén dữ liệu theo thuật toán LZW là:
Trang 8- Qui tắc 1: 256 dấu hiệu đầu tiên được dành cho các kí tự đơn (0 - 0ffh)
- Qui tắc 2: Cố gắng so sánh với "từ điển" khi trong bộ đệm chứa đã có nhiều hơn hai kí tự.
- Qui tắc 3: Các kí tự ở đầu vào (Nhận từ tập tin sẽ được nén) được bổ sung vào bộ đệm
chứa đến khi chuỗi kí tự trong bộ đệm chứa không có trong "từ điển"
- Qui tắc 4: Khi bộ đệm chứa có một chuỗi mà trong "từ điển" không có thì chuỗi trong bộ
đệm chứa được đem vào "từ điển" Kí tự cuối cùng của chuỗi kí tự trong bộ đệm chứa phải
ở lại trong bộ đệm chứa để tiếp tục tạo thành chuỗi mới
Thuật toán còn lại Huffman đều có thể áp dụng được để nén nhiều loại tập tin trên các máy vi tính
Thuật toán Huffman có ưu điểm là hệ số nén tương đối cao, phương pháp thực hiện tương đối
Trang 9đơn giản, đòi hỏi ít bộ nhớ, có thể xây dựng dựa trên các mảng bé hơn 64KB Nhược điểm của
nó là 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ấtnén chỉ cao khi ta thực hiện nén các tập tin lớn
Từ các ưu và nhược điểm trên, ta chọn phương pháp nén Huffman vì tính đơn giản của nó hệ số nén lại cao
CHƯƠNG 2: PHƯƠNG PHÁP MÃ HÓA HUFFMAN
PHẦN 1 : SƠ LƯỢC VỀ LỊCH SỬ PHƯƠNG PHÁP MÃ HUFFMAN
và công bố năm 1952 trong bài báo "A Method for the Construction of Redundancy Codes" Sau này Huffman đã trở thành một giảng viên ở MIT và sau đó ở
(Baskin School of Engineering)
dùng để nén dữ liệu Nó dựa trên bảng tần suất xuất hiện các kí tự cần mã hóa để xâydựng một bộ mã nhị phân cho các kí tự đó sao cho dung lượng (số bít) sau khi mã hóa lànhỏ nhất
PHẦN 2 : MÃ TIỀN TỐ ( PREFIX-FREE BINARY CODE )
I Nội dung :
Để mã hóa các kí hiệu (kí tự, chữ số, ) ta thay chúng bằng các xâu nhị phân, được gọi là từ mã
từ 0 đến 255, mỗi từ mã gồm 8 bít
Trong ASCII từ mã của kí tự "a" là 1100001, của kí tự "A" là 1000001 Trong cách mã hóa nàycác từ mã của tất cả 256 kí hiệu có độ dài bằng nhau (mỗi từ mã 8 bít) Nó được gọi là mã hóavới độ dài không đổi
Khi mã hóa một tài liệu có thể không sử dụng đến tất cả 256 kí hiệu Hơn nữa trong tài liệu chữcái "a" chỉ có thể xuất hiện 1000000 lần còn chữ cái "A" có thể chỉ xuất hiện 2, 3 lần Như vậy ta
có thể không cần dùng đủ 8 bít để mã hóa cho một ký hiệu, hơn nữa độ dài (số bít) dành cho mỗi
kí hiệu có thể khác nhau, kí hiệu nào xuất hiện nhiều lần thì nên dùng số bít ít, ký hiệu nào xuấthiện ít thì có thể mã hóa bằng từ mã dài hơn
Như vậy ta có việc mã hóa với độ dài thay đổi Tuy nhiên, nếu mã hóa với độ dài thay đổi, khigiải mã ta làm thế nào phân biệt được xâu bít nào là mã hóa của ký hiệu nào Một trong các giảipháp là dùng các dấu phẩy (",") hoặc một kí hiệu quy ước nào đó để tách từ mã của các kí tựđứng cạnh nhau Nhưng như thế số các dấu phẩy sẽ chiếm một không gian đáng kể trong bản mã.Một cách giải quyết khác dẫn đến khái niệm mã tiền tố
Trang 10 Mã tiền tố là bộ các từ mã của một tập hợp các kí hiệu sao cho từ mã của mỗi ký hiệu
không là tiền tố (phần đầu) của từ mã một ký hiệu khác trong bộ mã ấy
Đương nhiên mã hóa với độ dài không đổi là mã tiền tố
Ví dụ: Giả sử mã hóa từ "ARRAY", tập các ký hiệu cần mã hóa gồm 3 chữ cái
"A","R","Y".
chẳng hạn "A"=00, "R"=01, "Y"=10 Khi đó mã hóa của cả từ là 0001010010 Để giải
mã ta đọc hai bit một và đối chiếu với bảng mã
"A" là tiền tố của từ mã của "R" Để mã hóa cả từ ARRAY phải đặt dấu ngăn cách vào
giữa các từ mã 0,01,01,0,11
khi mã hóa xâu "ARRAY" ta có 01010011.
II Biểu diễn mã tiền tố trên cây nhị phân :
mỗi ký hiệu vào một lá Từ mã của mỗi kí hiệu được được tạo ra khi đi từ gốc tới lá chứa
ký hiệu đó, nếu đi qua cạnh trái thì ta thêm số 0, đi qua cạnh phải thì thêm số 1
VÍ DỤ 1 : Cây 3 lá sau đây biểu diễn bộ mã của A ,R ,Y trong ví dụ trên
- Từ mã của "A" là 0, của "R" là 10, của "Y" là 11.
VÍ DỤ 2 : Xét cây nhị phân trong hình sau
Khi đó ta có bảng mã :
Trang 11Từ đó xâu 11111011100 là mã của từ same.
Ngược lại để kiểm tra xem một cách mã có phải là mã tiền tố hay không, cần phải biểu diễncác mã đó thành cây nhị phân Nếu các lá có nhãn là các chữ cái có trong bảng mã thì đó là
mã tiền tố, còn nếu tồn tại đỉnh trong có nhãn là chữ cái thì đó không phải là mã tiền tố
Biểu diễn các mã thành cây nhị phân , ta có kết luận:
VÍ DỤ 3:
Trang 12Giả sử có một bản tin gồm một dãy ký hiệu lấy trong một tập hữu hạn X Biết rằng mỗi ký hiệutrong X xuất hiện trong bản tin theo một xác suất cho trước Ta muốn mã các ký hiệu này thànhnhững chuỗi bit nhị phân sao cho chiều dài chuỗi mã của bản tin là ngắn nhất.
Xét một bản tin gồm 1000 ký tự lấy trong tập các chữ cái A = { a,b,c,d,e} với tần suất sau :
Các cây mã tiền tố
Bộ mã 3 : Dựa trên nguyên lý đỉnh lá nào có tần suất càng lớn thì đường đi từ gốc cây tới đỉnh lá
đó càng ngắn
Trang 13Câu hỏi : Đặt ra bộ mã 3 là bộ tối ưu nhất ? Tại sao ?
III Tính tối ưu của độ dài mã :
1 Định lý Shannon (1948)
2 Bảng mã tối ưu tuyệt đối :
Trang 143 Bảng mã tối ưu tương đối
4 Điều kiện nhận biết một bảng mã tối ưu
Trang 15PHẦN 3 : MÃ HUFFMAN
I Nguyên tắc
Phương pháp mã hóa Huffman là phương pháp dựa vào mô hình thống kê Dựa vào dữ liệu gốc,người ta tính tần suất xuất hiện của các ký tự Việc tính tần suất được thực hiện bởi cách duyệttuần tự tệp gốc từ đầu đến cuối Việc xử lý ở đây tính theo bit
Trong phương pháp này người ta gán cho các ký tự có tần suất cao một từ mã ngắn, các ký tự cótần suất thấp từ mã dài Nói một cách khác, các ký tự có tần suất càng cao được gắn mã càngngắn và ngược lại Rõ ràng với cách thức này, người ta đã làm giảm chiều dài trung bình của từ
mã hóa bằng cách dùng chiều dài biến đổi
II Định lý Huffman
Trang 16III Phương pháp sinh mã Huffman
Trang 17IV Cây Huffman
Trang 181 Định lý : Cây Huffman là cây mã tối ưu
Để chứng minh định lý ta xét bổ đề sau :
Trang 192 Thiết lập cây mã Huffman :
2.1 Mã Huffman :
Một mã phi tiền tố được biểu diễn bằng một cây nhị phân
Các nút này chứa tổng tần suất xuất hiện của các nút trong các nhánh con của nó
hiện ở mức cao hơn trong cây Huffman
2.2 Thiết lập
Đầu vào : Bảng chữ cái C Tần suất xuất hiện của các ký tự trong C
mà tần suất của hai nhánh đó là nhỏ nhất
VÍ DỤ :
Trang 20V Thuật toán
Trang 22VI Tóm tắt các bước mã hóa và giải mã văn bản
1 Mã hóa văn bản sử dụng mã Huffman
1 Duyệt văn bản cần mã hóa và xáx định tần suất xuất hiện của các ký tự
2 Sắp xếp các ký tự dựa trên tần suất xuất hiện của chúng trong văn bản
3 Xây dựng cây mã Huffman dựa trên dãy đã được sắp
4 Duyệt cây để xác định mã của các ký tự
5 Duyệt văn bản cần mã hóa và sinh văn bản mã hóa sử dụng mã có được trong bước 4
2 Giải mã :
1 Xuất phát từ gốc của cây mã hóa
2 Đọc lần lượt từng ký tự trong xâu mã hóa
3 Nếu chạm tới nút lá ghi ký tự chứa tại nút lá, sau đó quay lại nút gốc của cây mã hóa
Trang 23CHƯƠNG 3 : VIẾT CHƯƠNG TRÌNH NÉN VÀ GIẢI NÉN
PHẦN 1 : HỖ TRỢ THỰC HIỆN
I Tài liệu tham khảo
1 Đoạn code tham khảo
2 Sách tham khảo
- www.google.com.vn từ khóa “ Huffma, nén và giải nén, thuật giải… ”
II Môi trường cài đặt
PHẦN 2 : TẠO MÃ HUFFMAN CHO MỘT XÂU KÝ TỰ
I Tìm hiểu đoạn code
Mã số Huffman có hai tính chất sau :
Dựa vào tần số xuất hiện từng ký tự có thể tạo thành một cây nhị phân, các lá của cây là các ký
tự, ký tự có tần số càng bé càng ở tầng sâu hơn, mã của ký tự là đường đi từ gốc đến ký tự đó.Thực chất là xây dựng cây từ các lá
Thay cho cây ta sẽ trình bày thuật toán dưới dạng phân nhóm, có thể là dễ hiểu hơn và dễ cài đặthơn, mỗi cây con xem như một nhóm gồm các lá ( ký tự) của cây con đó
Khởi đầu mã số các ký tự đều là xâu rỗng