Trong khóa luận này, em sẽ trình bày đôi nét về các thuật toán nén dữ liệu thông dụng hiện nay và so sánh tính hiệu quả của việc nén một số loại dữ liệu khác nhau giữa 2 loại mã nén Run-
Trang 11
LỜI CẢM ƠN
Em xin chân thành cảm ơn Ban chủ nhiệm khoa Công nghệ thông tin, các thầy cô giáo, gia đình và bạn bè đã động viên và giúp đỡ em rất nhiều trong quá trình hoàn thành khóa luận này Đặc biệt em xin bày tỏ lòng cảm ơn
sâu sắc tới thầy giáo hướng dẫn Th.s Trần Tuấn Vinh đã tận tình và tận tâm
hướng dẫn em từ những ý tưởng ban đầu cho đến lúc hoàn thành khóa luận quan trọng này
Em rất mong đón nhận sự đánh giá, bổ sung và những lời chỉ bảo của các thầy cô, giúp em có thể tiếp tục nghiên cứu kĩ hơn về lĩnh vực này
Em xin chân thành cảm ơn!
Hà Nội, tháng 5 năm 2013 Sinh viên Nguyễn Công Thành
Trang 22
LỜI CAM ĐOAN
Tên em là: Nguyễn Công Thành
Sinh viên: K35 – CNTT, trường Đại học Sư phạm Hà Nội 2
Em xin cam đoan:
1 Đề tài “Tìm hiểu các thuật toán nén dữ liệu và xây dựng chương trình ứng dụng” là kết quả tìm hiểu và nghiên cứu của riêng em dưới
sự hướng dẫn của Th.s Trần Tuấn Vinh
2 Khóa luận hoàn toàn không sao chép từ các tài liệu có sẵn đã được công bố khác
3 Kết quả không trùng với các tác giả khác
Nếu sai em xin hoàn toàn chịu trách nhiệm
Hà Nội, tháng 05 năm 2013 Sinh viên
Nguyễn Công Thành
Trang 33
DANH SÁCH CÁC HÌNH
Hình 2.1 Sơ đồ mã hóa và giải mã dùng MPEG
Hình 2.2 Phân lớp mã hóa MPEG 1
Hình 2.3 Các mẫu Audio
Hình 2.4 Cấu trúc khung MPEG
Hình 2.5 Cấu trúc khung MPEG 2
Hình 2.6 Sơ đồ mã hóa và giải mã MPEG 2
Hình 3.1 Quá trình xây dựng cây Huffman
Trang 44
MỤC LỤC
LỜI CẢM ƠN 1
LỜI CAM ĐOAN 2
DANH SÁCH CÁC HÌNH 3
MỞ ĐẦU 6
CHƯƠNG 1 8
SƠ LƯỢC NÉN DỮ LIỆU 8
1.1 Tổng quan về nén dữ liệu 8
1.2 Tổng quan các loại mã nén 8
1.2.1.Các chương trình nén hoạt động như thế nào? 8
1.3 Phân loại và ứng dụng 13
CHƯƠNG 2 16
CÁC PHƯƠNG PHÁP NÉN DỮ LIỆU 16
2.1 Phương pháp nén không tổn hao 16
2.1.1 Mô hình thống kê 16
2.1.2 Mô hình từ điển 20
2.2 Phương pháp nén tổn hao 27
CHƯƠNG 3 42
XÂY DỰNG CHƯƠNG TRÌNH NÉN DỮ LIỆU 42
BẰNG MÃ HUFFMAN VÀ RUN-LENGTH 42
3.1 Đặc điểm của các thuật toán nén dữ liệu 42
3.2 Phân tích thuật toán 43
3.2.3.1 Biến thể vào Run-length Encoding 46
Trang 55
3.2.3.2.Gói Replication dọc 48
CHƯƠNG 4 50HÌNH ẢNH MINH HỌA CÁC CHƯƠNG TRÌNH SỬ DỤNG THUẬT TOÁN HUFFMAN VÀ RUN-LENGTH 50TÀI LIỆU THAM KHẢO 54
Trang 6
6
Ngày nay với sự tiến bộ của khoa học kĩ thuật, CNTT được nâng lên một tầm cao mới Mọi ngành, nghề đều phải ứng dụng CNTT một cách triệt
để để phát triển một cách tốt nhất Ngay như cả cụm từ “ Chính phủ điện tử”
mà ta thường nghe cho ta thấy tầm quan trọng của việc đưa CNTT vào cuộc sống Không nằm ngoài sự phát triển có tính quy luật chung của xã hội, CNTT đã và đang làm hết sức mình để phát triển ngày một tốt hơn, nhanh hơn, nhẹ hơn, gọn hơn CNTT và Viễn thông có mối liên hệ tương đối chặt chẽ với nhau Một trong những tiêu chí giúp ngành CNTT phát triển là sử dụng công nghệ bảo mật, nén dữ liệu, thông tin trong lưu trữ và truyền thông
Bảo mật thông tin, nén dữ liệu là công việc cần thiết trong ngành CNTT Từ thời xa xưa, con người đã biết gìn giữ thông tin trong quân sự, trong chiến tranh nhằm làm cho thông tin được an toàn, không lọt vào tay đối phương Muốn vậy, con người đều có nhiều cách để làm cho thông tin truyền
đi được gọn nhẹ và an toàn khi lưu thông Để thông tin đến tay người nhận một cách bí mật, gọn gàng nhất thì họ phải nén thông tin này lại hay dùng các
kí hiệu đặc biệt có quy ước trước
Trong kỹ thuật truyền số liệu, bảo mật và nén dữ liệu (nguồn tin) truyền
đi là 2 vấn đề quan trọng, nhiều cơ sở lý thuyết về mã hóa nguồn cho ta thấy tầm quan trọng của việc mã hóa và nén dữ liệu Các thuật toán nén dữ liệu ra đời từ rất lâu như mã nén Shannon-Fano, Huffman, Run-length hay Lempel Ziv Welch (LZW) được cho là kinh điển của công nghệ nén dữ liệu
Trong khóa luận này, em sẽ trình bày đôi nét về các thuật toán nén dữ liệu thông dụng hiện nay và so sánh tính hiệu quả của việc nén một số loại dữ liệu khác nhau giữa 2 loại mã nén Run-length và Huffman
Trang 77
Khóa luận này tập trung vào các vấn đề xoay quanh thuật toán Run-length và Huffman, phân tích các ưu, nhược điểm của thuật toán này so với thuật toán kia Các phần sẽ thực hiện trong khóa luận này gồm:
- Tìm hiểu lí thuyết nén dữ liệu, tổng hợp các kết quả trên thế giới về nén dữ liệu Tổng quan về các phương pháp mã hóa nguồn, nguyên tắc làm việc của các phương pháp, tốc độ và tỷ lệ nén
- Phân loại và ứng dụng Nhiệm vụ đặt ra là đưa ra được nội dung của các thuật toán mã hóa nguồn
- Nội dung thuật toán Run-length và Huffman Trong phần này sẽ đi sâu phân tích các ưu, nhược điểm của từng thuật toán, lựa chọn thuật toán Run-length và Huffman để so sánh tính hiệu quả của từng loại với một số loại
dữ liệu khác nhau
- Hình ảnh minh họa của các chương trình sử dụng 2 thuật toán Huffman và Run-length
Trang 88
CHƯƠNG 1
SƠ LƯỢC NÉN DỮ LIỆU
1.1 Tổng quan về nén dữ liệu
Trong khoa học máy tính và lí thuyết thông tin, nén dữ liệu là quá trình
mã hóa thông tin dùng ít bít 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 phương pháp nào đó Dựa theo nguyên tắc này giúp tránh hiện tượng kênh truyền bị quá tải và truyền tin trở nên kinh tế hơn Nén
dữ liệu giúp tiết kiệm tài nguyên như dung lượng bộ nhớ, băng thông, thời gian Ngược lại, dữ liệu đã được nén cần phải được giải nén để đọc (thực thi, nghe, xem, v.v…), quá trình này cũng đòi hỏi các tài nguyên nhất định Một
ví dụ điển hình là việc nén video đòi hỏi phần cứng đắt tiền để quá trình giải nén đủ nhanh để ta có thể xem được Do đó việc thiết kế một chương trình nén dữ liệu phụ thuộc nhiều yếu tố như mức độ nén, độ méo (đối với nén có tổn hao), tài nguyên hệ thống dùng để thực hiện quá trình nén và giải nén dữ liệu
1.2 Tổng quan các loại mã nén
1.2.1 Các chương trình nén hoạt động như thế nào?
Nguyên tắc của các chương trình nén nói chung giống nhau: Tận dụng
sự lặp lại của dữ liệu, các chuỗi dữ liệu lặp lại được thay thế bởi con trỏ chung có độ dài bé hơn Kỹ thuật này rất hiệu quả đối với dữ liệu dạng text, bảng tính, hoặc file DBF (nén trên 70%), vì tính lặp lại của dữ liệu loại này cao: File chương trình (.EXE hoặc COM) nén được ít hơn
Trang 99
1.2.2 Tốc độ và tỷ lệ nén
Ngay cả khi tất cả các chương trình nén file đều dùng chung một thuật toán thì hoạt động của chúng cũng khác nhau Mỗi hãng triển khai thuật toán một kiểu để dung hòa hai vấn đề: thời gian và tỷ lệ nén Chương trình PKZIP thường trội hơn các chương trình nén khác về mặt tốc độ, về tỷ lệ nén, nhiều khi nó cũng khá hơn Tính ổn định của các chương trình nén cũng là điều cần quan tâm Các file nén nói chung rất ít khi bị hỏng Cũng cần lưu ý là các loại file nén không tương thích với nhau, tức là nếu gửi file nén cho người khác thì người đó cần phải có chương trình thích hợp mới giải nén ra được Tuy nhiên để giải quyết vấn đề này, cả 3 chương trình ARC + PLUS, LHA và PKZIP đều cho phép tạo file nén tự bung – tức file nén ở dạng chương trình thực hiện, khi chạy sẽ tự động bung ra Trên thị trường cũng bắt đầu xuất hiện chương trình chuyển đổi từ dạng file nén này sang dạng file nén khác, ví dụ chương trình D’Compress for Windows chuyển các file PKZIP, ARC, LHA sang dạng ARJ
Các chương trình nén giá không cao (PKZIP: 47USD, LHA cung cấp miễn phí) nên được dùng khá rộng rãi Hạn chế hiện nay của chúng ta là giao diện người dùng không thuận tiện, thường phải gõ lệnh với nhiều tham số ở dấu nhắc của DOS để thực hiện một công việc nào đó Cải tiến theo hướng này đang được thực hiện: ARC + PLUS có giao diện kiểu menu, PKZIP cũng
đã có phần bổ sung là PKZIP menu
Nhiều chương trình quản lí file trong DOS và trong Windows đã bắt đầu dùng kỹ thuật nén Chương trình Magellan của hãng Lotus dùng PKZIP
từ năm 1990, chương trình Xtree Gold đưa PKZIP vào công cụ quản lý file năm 1991
Thư mục nén rời sau đó lại phải bung ra để dùng của các chương trình nén file khá rườm rà, chính bởi lí do này mà các chương trình nén đĩa như
Trang 1010
Stacker hoặc Super Store được sử dụng tương đối rộng rãi Các chương trình nén đĩa cũng hoạt động nguyên tắc giống như nén file, chỉ khác là chúng tự động nén và bung mà người dùng không phải quan tâm đến Thời gian và tỷ
lệ nén của các chương trình nén loại này khác nhau Để bung 3,5 MB dữ liệu, chương trình này hết 12 giây, chương trình khác 40 giây Tỷ số nén đối với file văn bản cũng khác: từ 2:1 đến 3:1 Tóm lại khi dùng chương trình nén đĩa, người dùng yên tâm là dung lượng trống của ổ cứng dường như tăng khoảng 2 lần
Việc bung và nén khi làm việc với file sẽ làm công việc chậm lại đôi chút Đối với các file dữ liệu lớn, điều này thể hiện khá rõ Khi làm việc, các chương trình nén đĩa hoạt động ở dạng thường trú, bởi thế một mặt nó chiếm dụng bộ nhớ RAM, một mặt có thể xung đột với các chương trình thường trú khác Các chương trình nén file khi có sự cố chỉ hỏng một vài file, còn chương trình nén đĩa làm hỏng cả ổ đĩa Tuy điều này rất ít khi xảy ra nhưng cũng làm cho nhiều người e ngại không dám dùng
Để cài đặt chương trình nén đĩa cần phân chia lại ổ cứng vì máy tính cần được khởi động bằng đĩa nén trước khi chương trình nén hoạt động Nếu dùng Windows thì phần mềm không nén cần khá lớn (thông thường cần dành
10 Mb cho vùng không nén, chỉ nén vùng đĩa còn lại)
Một điều có thể làm người dùng đau đầu là phải quyết định tỷ lệ nén là bao nhiêu Với tỷ lệ nén 10:1 chẳng hạn, chương trình nén sẽ dành nhiều “con trỏ” để trỏ đến các dữ liệu, mỗi con trỏ chiếm 2 byte, khi đó dễ xảy ra trường hợp không đủ con trỏ, chương trình báo đĩa đầy mà thực ra không phải như vậy
Cuối cùng, việc loại bỏ chương trình nén đĩa khi đã cài đặt cũng là một vấn đề hơi phiền toái Nhiều chương trình – chẳng hạn Double Density có
Trang 11Tỷ lệ nén là một trong các đặc trưng quan trọng nhất của mọi phương phá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ần được quan tâm xem xét
Trong các trình bày sau khi nói đến kết quả nén, chúng ta dùng tỷ số nén, thí dụ như 10 trên 1 có nghĩa là dữ liệu gốc là 10 sau khi nén chỉ có 1 phần Tuy nhiên, cũng phải thấy rằng những số đo của một phương pháp nén chỉ có giá trị với chính sự nén đó, vì rằng hiệu quả của nén còn phụ thuộc vào kiểu dữ liệu định nén, nhiều khi tỷ lệ nén cao cũng chưa thể nói rằng phương pháp đó là hiệu quả hơn các phương pháp khác, vì còn các chi phí khác như thời gian, không gian và thậm chí cả độ phức tạp tính toán nữa
Trang 1212
1.2.3 Các loại dư thừa dữ liệu
Như trên đã nói, nén nhằm mục đích giảm kích thước dữ liệu bằng cách loại bỏ dư thừa dữ liệu Việc xác định bản chất các kiểu dư thừa dữ liệu rất có ích cho việc xây dựng phương pháp nén dữ liệu khác nhau Nói một cách khác, các phương pháp nén dữ liệu khác nhau là do sử dụng các kiểu dư thừa
dữ liệu khác nhau Có 4 kiểu dư thừa chính được trình bày ở các mục dưới đây
1.2.3.1 Sự phân bố kí tự
Trong một dãy kí tự, có một số kí tự có tần suất xuất hiện nhiều hơn một số dãy khác Do vậy, ta có thể mã hóa dữ liệu một cách cô đọng hơn Các
kí tự có tần suất xuất hiện cao hơn được thay thế bởi một từ mã nhị phân với
số bit nhỏ Ngược lại các dãy có tần suất xuất hiện thấp được mã hóa bởi từ
mã có nhiều bit hơn Đây chính là bản chất của phương pháp mã hóa Huffman hay Shanon – Fano
1.2.3.2 Sự lặp lại của các kí tự
Trong một số tình huống, 1 kí hiệu (bit “0” hay bit “1”) được lặp lại một số lần Kĩ thuật nén trong trường hợp này là thay thế dãy lặp đó bằng dãy lặp mới gồm hai thành phần: số lần lặp và kí hiệu dùng để mã hóa Phương pháp mã hóa này gọi là mã hóa loạt dài RLE (Run-length Encoding)
1.2.3.3 Những mẫu sử dụng tần suất
Có thể dãy kí hiệu nào đó xuất hiện với tần suất tương đối cao Do vậy
có thể mã hóa bởi ít bit hơn Đó là cơ sở của phương pháp mã hóa theo kiểu
từ điển do Lempel – Ziv đưa ra và có cải tiến vào năm 1977, 1978 do đó có tên gọi là phương pháp nén LZ77, LZ78 Năm 1984, Terry Welch đã cải tiến hiệu quả hơn và đặt tên là LZW (Lempel – Ziv – Welch) Thuật toán nén dữ
Trang 13Cách đánh giá độ dư thừa như trên hoàn toàn mang tính trực quan nhằm biểu thị một cái gì đó xuất hiện nhiều lần Đối với dữ liệu ảnh, ngoài đặc thù chung đó nó còn có đặc thù riêng Thí dụ có nhiều ứng dụng không cần toàn bộ dữ liệu thô của ảnh mà chỉ cần những thông tin đặc trưng biểu diễn ảnh như biên ảnh hay vùng đồng nhất Do vậy có những phương pháp nén riêng cho ảnh dựa vào biến đổi ảnh hay biểu diễn ảnh
1.3 Phân loại và ứng dụng
1.3.1 Dựa vào nguyên lí nén
1.3.1.1 Các thuật toán nén không tổn hao
Trong các phương pháp nén không tổn hao, dữ liệu sau khi nén sẽ giống y như ban đầu Trong đó thông dụng nhất là Lempel – Ziv (LZ), DEFLATE là một biến thể của thuật toán LZ được tối ưu hóa nhằm tăng tốc
độ giải nén và tỉ lệ nén, bù lại thuật toán này có tốc độ của quá trình nén chậm DEFLATE được dùng trong PKZIP, GZIP và PNG LZW (Lempel – Ziv – Welch) được dùng trong định dạng file Gif Hai biến thể của thuật toán
Trang 1414
LZ cũng đáng chú ý là LZX dùng trong định dạng file CAB của Microsoft (Microsoft còn dùng thuật toán nén này cho file CHM, các file office 2007)
và thuật toán LZMA dùng trong chương trình 7-ZIP
Các thuật toán nén không tổn hao được dùng trong các file thực thi, file văn bản, word, excel,v.v… các loại dữ liệu này không thể sai lệch dù 1 bit, nhất là các file chương trình
Các phương pháp nén không tổn hao cơ bản:
1 Run – length encoding
2 Dictionary coders
3 LZ-77 & LZ-78
4 LZW
5 Burrows and Wheler transform (BWT)
6 Prudition by partial matching (PPM)
Trang 1515
1.3.1.2 Các thuật toán nén tổn hao
Trong các phương pháp nén tổn hao thì dữ liệu được nén khi giải nén ra
sẽ không giống với dữ liệu gốc, tuy nhiên phải đảm bảo dữ liệu sau khi nén vẫn còn hữu ích Đối với hình ảnh, âm thanh, video, do giới hạn của mắt và tai người nên một lượng lớn dung lượng có thể được tiết kiệm bằng cách loại
bỏ các phần dư thừa, trong khi chất lượng hầu như không thay đổi
Trong thực tế, các file hình ảnh, âm thanh hay là video được lưu trữ trên máy tính đều đã được nén có tổn hao để tiết kiệm dung lượng và băng thông Đối lập với nén không tổn hao các phương pháp nén có tổn hao thường gây giảm chất lượng rất nhanh khi thực hiện nén và giải nén đệ quy nhiều lần Các mẫu hình ảnh âm thanh sẽ được chia thành các phần nhỏ và được biến đổi qua miền khác Các hệ số biến đổi này sẽ được lượng tử hóa sau đó được
mã hóa bằng mã Huffman hoặc mã hóa số học
Các mẫu hình ảnh âm thanh trước được sử dụng để dự đoán các mẫu tiếp theo Sai số giữa dữ liệu dự đoán và dữ liệu thực sẽ được lượng tử hóa rồi
mã hóa Ưu điểm của nén tổn hao so với nén không tổn hao đó là nén tổn hao trong nhiều trường hợp cho tỷ lệ nén cao hơn rất nhiều so với bất cứ thuật toán nén không tổn hao được biết, trong khi vẫn đảm bảo được chất lượng Nén tổn hao thường được sử dụng để nén ảnh, âm thanh, video Âm thanh có thể nén với tỉ lệ 10:1 mà hầu như không giảm chất lượng Video có thể nén với tỉ lệ 300:1 với chất lượng giảm ít
1.3.2 Dựa vào cách thức thực hiện nén
Theo cách này, người ta cũng phân thành hai họ:
Phương pháp không gian (Spatial Data Compression): Các phương pháp thuộc họ này thực hiện nén bằng cách tác động trực tiếp lên việc lấy mẫu của ảnh trong miền không gian
Phương pháp sử dụng biến đổi (Tranform Coding): Gồm các phương pháp tác động lên sự biến đổi của ảnh gốc mà không tác động trực tiếp như họ trên
Trang 162.1.1.1 Thuật toán Huffman
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 đơ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ất nén chỉ cao khi ta thực hiện nén các tập tin lớn
Nguyên lý:
Nguyên lý của phương pháp Huffman là mã hóa các bytes trong tệp dữ liệu nguồn bằng biến nhị phân Nó tạo mã độ dài biến thiên là một tập hợp các bít Đây là phương pháp nén kiểu thống kê, những ký tự xuất hiện nhiều hơn
sẽ có mã ngắn hơn (gần giống Shannon-Fano)
Thuật toán
Thuật toán nén:
- Bước 1: Tìm hai ký tự có trọng số nhỏ nhất ghép lại thành một, trọng
số của ký tự mới bằng tổng số của hai ký tự đem ghép
- Bước 2: Trong khi số lượng ký tự trong danh sách còn lớn hơn một thì
thực hiện bước một, nếu không thì thực hiện bước ba
- Bước 3: Tách ký tự cuối và tạo cây nhị phân với quy ước bên trái mã 0,
bên phải mã 1
Trang 1717
Số bit trung bình: 87/39 = 2.23 (< 2.28)
Thuật toán giải nén:
- Bước 1: Đọc lần lượt từng bit trong tập tin nén và duyệt cây nhị phân
đã được xác định cho đến khi hết một lá Lấy kí tự ở lá đó ghi ra tệp giải nén
- Bước 2: Trong khi chưa hết tập tin nén thì quay lại thực hiện bước một,
ngược lại thì thực hiện bước tiếp theo
- Bước 3: Khi hết tập tin, kết thúc thuật toán
Trang 1818
2.1.1.2 Thuật toán Run-length
Loại dư thừa đơn giản nhất trong một tập tin là các đường chạy dài gồm các kí tự lặp lại, điều này thường thấy trong các tập tin đồ họa bitmap, 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
Ví dụ, xét chuỗi sau:
AAAABBBAABBBBBCCCCCCCCDABCBAAABBBBCCCD
Chuỗi này có thể được mã hóa một cách cô đọng hơn bằng cách thay thế chuỗi kí tự lặp lại bằng một thể hiện duy nhất của kí tự lặp lại cùng với một biến đếm số lần kí tự đó được lặp lại Ta muốn nói rằng chuỗi này gồm 4 chữ A theo sau bởi ba chữ B rồi lại theo sau bởi hai chữ A, rồi lại theo sau bởi
5 chữ B Việc nén một chuỗi theo phương pháp này được gọi là mã hóa độ dài loạt Khi có những loạt dài, việc tiết kiệm có thể là đáng kể Có nhiều cách
để thực hiện ý tưởng này, tùy thuộc vào các đặc trưng của ứng dụng (các loạt chạy có khuynh hướng đối dài hay không? Có bao nhiêu bit được dùng để mã hóa các kí tự đang được mã?)
Nếu ta biết rằng chuỗi của chúng ta chỉ chứa các chữ cái, thì ta có thể
mã hóa biến đếm một cách đơn giản bằng cách xen kẽ các con số với các chữ cái Vì vậy chuỗi kí tự trên được mã hóa lại như sau:
Trang 1919
ngắn (Ta tiết kiệm các bit trên một loạt chạy chỉ khi độ dài của đường chạy là lớn hơn số bit cần để biểu diễn chính nó trong dạng nhị phân), nhưng khó có phương pháp mã hóa độ dài loạt nào hoạt động thật tốt trừ phi hầu hết các loạt chạy đều dài
Việc mã hóa độ dài loạt cần đến các biểu diễn riêng biệt cho tập tin và cho bản đã được mã hóa của nó, vì vậy nó không thể dùng cho mọi tập tin, điều này có thể hoàn toàn bất lợi Ví dụ, phương pháp nén tập tin kí tự đã được đề nghị ở trên sẽ không dùng được đối với các chuỗi kí tự có chứa số Nếu những kí tự khác được sử dụng để mã hóa 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ã hóa 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 họa, giả sử ta phải mã hóa 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ó thể dùng vài chữ cái để biểu diễn các số và các kí tự khác biểu diễn các phần tử của chuỗi sẽ được mã hóa, 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 để 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 “QDABBBAABQHCDABCBAAAQDBCCCD”
Tổ hợp của kí tự “Escape”, số đếm và một kí tự lặp lại được gọi là một dãy Escape Chú ý rằng không đáng để mã hóa 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ã hóa bất kì một loạt chạy nào
Trang 2020
Trong trường hợp bản thân kí tự “Escape” xuất hiện trong dãy kí tự cần
mã hóa ta sử 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
Các loạt chạy dài có thể được cắt ra để mã hóa bằng nhiều dãy Escape,
ví dụ một loạt chạy gồm 51 chữ A sẽ được mã hóa như QZAQYA bằng cách dùng trên
Phương pháp mã hóa độ dài loạt thường được áp dụng cho các tập tin
đồ họa bitmap vì ở đó thường có các mảng lớn cùng màu đượ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
2.1.2 Mô hình từ điển
2.1.2.1 Thuật toán LZ78
Thay vì thông báo vị trí đoạn văn lặp lại trong quá khứ, mã LZ78 đánh
số tất cả các đoạn văn sao cho mỗi đoạn ghi nhận số hiệu đoạn văn lặp lại trong quá khứ cộng với một kí tự mà nó làm cho đoạn đó khác với đoạn trong quá khứ Như vậy mỗi đoạn mới là một đoạn ký tự trong quá khứ cộng với một ký tự trong quá khứ Chính vì thế đoạn mới khác với đoạn cũ trong quá khứ
Trang 2121
Ví dụ: Giả sử ta có đoạn văn bản sau: “aaabbabaabaaabab”
Theo thuật toán LZ78 thì chúng ta được phân đoạn như sau:
Như vậy bản nén của chúng ta là: (0,a); (1,a); (0,b); (3,a); (4,a); (5,a); (4,b)
Đọc tiếp ký tự tiếp theo w:=ww+ch;
If w thuộc từ điển then ww:=w;
Else begin Code(w,j);
Trang 2222
Thuật toán giải nén
Bước 1: Đọc thông tin về từ điển đã được lưu trong tệp nén, tl:=false;
Bước 2: while not eof(f) do
Begin
Đọc byte tiếp theo ->b
Decode(b,s,t);
If tl=false then w:=w+s Else w:=ww+s;
TIMCHU(w,t);
If t=false then Begin
Ghi s ra tệp giải nén Thêm s vào từ điển End;
Else Begin ww:=s;
Trang 2323
2.1.2.2 Thuật toán LZW
Giải thuật nén LZW xây dựng một từ điển lưu các mẫu có tần suất xuất hiện cao trong ảnh Từ điển là tập hợp những cặp từ vựng và nghĩa của nó Trong đó, từ vựng sẽ là các từ mã được sắp xếp theo thứ tự nhất định Nghĩa
là một chuỗi con trong dữ liệu ảnh Từ điển được xây dựng đồng thời với quá trình đọc dữ liệu Sự có mặt của một chuỗi con trong từ điển khẳng định chuỗi
đó đã từng xuất hiện trong phần dữ liệu đã đọc Thuật toán liên tục “tra cứu”
và cập nhập từ điển sau mỗi lần đọc một ký tự dữ liệu đầu vào
Do kích thước bộ nhớ ngoài không phải vô hạn và để đảm bảo tốc độ tìm kiếm, từ điển chỉ giới hạn 4096 ở phần tử dùng để lưu lớn nhất là 4096 giá trị của các từ mã Như vậy độ dài lớn nhất của từ mã là 12 bits (4096=212) Cấu trúc từ điển như sau:
256: Mã xóa CC để khắc phục tình trạng mẫu lặp lớn hơn
4096 thì gửi CC để xây dựng từ điển cho phần tiếp theo
Eoi: Báo hiệu hết một phần nén
Trang 24là một bộ từ điển gồm nhiều từ điển con Cứ hết một mảnh ảnh người ta lại gửi một mã xóa để báo hiệu kết thúc mảnh ảnh cũ, bắt đầu mảnh ảnh mới đồng thời khởi tạo lại từ điển cho mảnh ảnh mới Mã xóa có giá trị là 256
- Từ mã thứ 257 chứa mã kết thúc thông tin (EOI – End of information)
Mã này có giá trị là 257 Như chúng ta đã biết, một file ảnh GIF có thể có chứa nhiều ảnh Mỗi một ảnh sẽ được mã hóa riêng Chương trình giải mã sẽ lặp lại thao tác giải mã từng ảnh cho đến khi gặp mã kết thúc thông tin thì dừng lại
- Các từ mã còn lại (từ 258 đến 4096) chứa các mẫu thường lặp lại trong bảng 512 phần tử đầu tiên của từ điển biểu diễn bằng 9 bit Các từ mã từ 512 đến 1023 biểu diễn bởi 10 bit, từ 1024 đến 2047 biểu diễn bởi 11 bit và từ
2048 đến 4095 biểu diễn bởi 12 bit
Nguyên tắc hoạt động của nó như sau:
- Một xâu kí tự là một tập hợp từ hai kí tự trở lên
- Nhớ tất cả các xâu kí tự đã gặp và gán cho nó một dấu hiệu (token) riêng
- Nếu lần sau gặp lại xâu kí tự đó, xâu kí tự sẽ được thay thế bằng dấu hiệu của nó
- 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 xâu kí tự đã gặp (Mảng này được gọi là “Từ
Trang 2525
điển”) Khi các byte dữ liệu cần nén được đem đến, 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ộ đệm chứ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
Quá trình nén
LZW bắt đầu bởi 1 từ điển 256 kí tự (trong trường hợp sử dụng bảng
mã 8 bits) và sử dụng chúng như tập kí tự chuẩn Sau đó mỗi lần đọc 8 bits (ví dụ ‘t’, ‘r’, ) và mã hóa thành con số tương ứng với chỉ mục của kí tự đó trong từ điển
Mỗi khi LZW đi qua 1 chuỗi con mới (giả sử “tr”) thì nó thêm chuỗi con đó vào từ điển
Mỗi khi nó đi qua 1 chuỗi con mà nó đã thấy trước đó, nó chỉ đọc thêm
1 kí tự mới nữa và cộng với chuỗi con đã biết để tạo ra một chuỗi con mới Lần tiếp theo LZW bắt gặp một chuỗi con đã có, nó chỉ có việc sử dụng số chỉ mục tương ứng trong từ điển
Thường thì người ta sẽ định sẵn số lượng lớn nhất các từ trong từ điển (giả sử 4096), vì thế việc nén LZW không làm tiêu tốn hết toàn bộ bộ nhớ Vì vậy mã của các chuỗi con trong ví dụ này là 12 bits ( 212=4096) Cần thiết phải lập mã dài hơn số bits của một kí tự (12 với 8 bits), do đó khi rất nhiều chuỗi con lặp lại sẽ được thay thế bởi một mã duy nhất thì việc nén được thực hiện
Trang 2626
Ví dụ: Các bước để mã hóa chuỗi “ABCBCABCABCD” như sau:
Các bước thực hiện
- Bước 1: w=NIL
- Bước 2: Trong khi đọc được kí tự thứ k trong chuỗi
- Bước 3: Nếu wk đã tồn tại trong từ điển thì w = wk
- Bước 4: Còn không thì thêm wk vào trong từ điển, mã hóa ngõ ra cho
Trang 2727
Chuỗi ra: 65 - 66 - 67 - 259 - 258 - 67 (output)
Đầu vào kích thước: 12 8 = 96 bits
Đầu ra kích thước là: 58 + 39 = 67 bits
Vào những năm 1990, MPEG 2 đã ra đời nhằm đáp ứng các tiêu chuẩn nén video cho truyền hình MPEG 2 có khả năng mã hóa tín hiệu truyền hình
ở tốc độ 3-15Mbit/s và truyền hình độ nét cao ở tốc độ tới 15-30 Mbit/s MPEG 2 cho phép mã hóa tín hiệu video với nhiều mức độ phân giải khác nhau, chúng có khả năng đáp ứng cho nhiều ứng dụng khác nhau Nhiều thuật toán tương ứng với nhiều các ứng dụng khác nhau đã phát triển và được tập hợp lại thành một bộ tiêu chuẩn đầy đủ của MPEG Việc áp dụng toàn bộ các đặc điểm của chuẩn MPEG 2 trong tất cả các bộ mã hóa và giải mã là không cần thiết do sự phức tạp của thiết bị cũng như sự tốn kém về dải thông của đường truyền Vì vậy trong hầu hết các trường hợp ta chỉ sử dụng một phần nhất định trong toàn bộ các đặc điểm của chuẩn MPEG 2, chúng thường được gọi là profiles và levels Một profile sẽ xác định một thuật toán (điều chỉnh bitstream và độ phân giải màu) và một level sẽ xác định một số tiêu chí bắt buộc cho các tham số của bức ảnh (ví dụ như kích thước và số lượng bit)