You are on page 1of 21

Các kỹ thuật nén số liệu

Huffman
• 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 bits. Đâ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

. bên phải mã 1. Bước 3 Tách ký tự cuối cùng và tạo cây nhị phân với quy ước bên trái mã 0. trọng số của ký tự mới bằng tông trọ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.Huffman • 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. nếu không thì thực hiện bước ba.

. Lấy ký tự ớ lá đó ghi ra tệp giải nén.Huffman 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á. Bước 2 Trong khi chưa hết tập tin nén thì thực hiện bước một. ngược lại thì thực hiện Bước 3 Kết thúc thuật toán.

đòi hỏi ít bộ nhớ. . phương pháp thực hiện tương đối đơn giản. có thể xây dựng dựa trên các mảng bé hơn 64KB.Huffman • Ưu điểm : • Thuật toán Huffman có ưu điểm là hệ số nén tương đối cao.

• Quá trình giải nén phức tạp do chiều dài mã không biết trước cho đến khi ký tự đầu tiên được tìm ra. . Điều này đòi hỏi thời gian không ít do ta không biết trước kiểu dừ liệu sê được thực hiện nén. • Huffman tĩnh đòi hỏi phải xây dựng cây nhị phân sẵn chứa các khả năng.Huffman • Nhược điểm : • Mã Huffman chỉ thực hiện được khi biết được tần suất xuất hiện của các ký • Mã Huffman chỉ giải quyết được độ dư thừa phân bố ký tự.

Length • Nguyên lý : • 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.. các vùng dừ liệu hằng của các tập tin chương trình.Run . một số tập tin văn bản. .. điều này thường thấy trong các tập tin đồ hoạ bitmap.

. Có nhiều cách để thực hiện ý tưởng này.. Có bao nhiêu bit được dùng để mã hoá các kí tự đang được mã ?).. tuỳ thuộc vào các đặc trưng của ứng dụng (các loạt chạy có khuynh hướng tương đổi dài hay không . rồi lại theo sau bởi năm chữ B. Ta muốn nói ràng chuỗi này gồm bốn chữ A theo sau bởi ba chữ B rồi lại theo sau bởi hai chữ A.Run . Khi có những loạt dài.Length • AAAABBBAABBBBBCCCCCCCCDABCBAAABBBBCCCD • Chuồi này có thể được mã hoá 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. việc tiết kiệm có thể là đáng kể. Việc nén một chuỗi theo phương pháp này được gọi là mã hoá độ dài loạt.

Vì vậy chuồi kí tự trên được mã hoá lại như sau: 4A3BAA5B8CDABCB3A4B3CD • Ở đây "4A" có nghĩa là "bốn chữ A".Run ..Length • Nếu ta biết ràng chuỗi của chúng ta chỉ chứa các chữ cái. 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á. . thì ta có thể mã hoá 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..

nhưng khó có phương pháp mã hoá độ 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. . Điều này giả định ràng có một vài loạt chạy 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 so bit cần đổ biễu diễn chính nó trong dạng nhị phân). Ý tưởng ở đây là lun lại các độ dài loạt.Length • Đối với các tập tin nhị phân một phiên bản được tinh chế của phương pháp này được dùng đế thu được sự tiết kiệm đáng kế.Run . tận dụng sự kiện các loạt chạy thay đổi giữa 0 và 1 để tránh phái lun chính các số 0 và 1 đó.

vì vậy nó không thể dùng cho mọi tập tin. 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 đó. giả sử ta phải mã hoá bất kì một chuỗi nào từ một chừ cái đó. ví dụ. . điều này có thể hoàn toàn bất lợi. thì nó sẽ không làm việc với các chuỗi chứa các kí tự đó. Để minh hoạ. 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ố. Neu những kí tụkhác được sử dụng đê mã hoá các số đếm.Length • Việc mã hoá độ 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ã hoá của nó.Run . 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.

.Length • Để 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ã hoá.Run . 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ự. 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. ta phải chọn một kí tự được gọi là 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. ví dụ. • Trong trường hợp bản thân kí tụ' "Escape" xuất hiện trong dãy kí tự cần mã hoá ta sử dụng một dãy "Escape" với số đếm là 0 (kí tự space) đổ biểu diễn kí tụ. số đếm và một kí tự lặp lại được gọi là một dãy Escape. vì ít nhất là cần đến ba kí tự đế mã hoá bất kì một loạt chạy nào. . Chú ý rằng không đáng đế mã hoá các đường chạy có chiều dài ít hơn bốn kí tự.Run . một loạt chạy gồm 51 chữ A sẽ được mã hoá như QZAQYA bằng cách dùng trên.Length • Escape"QDABBBAABQHCDABCBAAAQDBCCCD • Tô hợp của kí tự "Escape". • Các loạt chạy dài có thê được cắt ra đê mã hoá bằng nhiều dãy Escape."Escape".

PCX. . . Trên thực tế.RLE.Run .Length • Phương pháp mã hoá độ dài loạt thường được áp dụng cho các tập tin đồ hoạ 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. nó được dùng trong các tập tin .

Trong đó.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 dữ liệu. Thuật toán liên tục “tra cứu” và cập nhật từ điên sau mỗi lần đọc một ký tự dữ liệu đầu vào. Nghĩa là một chuỗi con trong dữ liệu . . Từ điển là tập họp nhũng cặp từ vựng và nghĩa của nó. sự có mặt của một chuỗi con trong từ điên khắng định rằng chuồi đó đã từng xuất hiện trong phần dữ liệu đã đọc. từ vựng sẽ là các từ mã được sắp xếp theo thứ tự nhất định. từ điển được xây dựng đồng thời với quá trình đọc dừ liệu.

xâu kí tự sẽ được thay thế bàng dấu hiệu của nó. • Nếu lần sau gặp lại xâu kí tự đó.LZW • Nguyên tắc chung • 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.

• 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ự.LZW • Quy tắc : • Qui tắc 1: 256 dấu hiệu đầu tiên được dành cho các kí tụ. 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. • 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".đon (0 Offh). • 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". .

LZW • 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. nó chỉ có việc sử dụng số chỉ mục tương ứng trong từ điển. nó chi đọc thêm 1 kí tự mới nữa và cộng với chuỗi con đã biết đế tạo ra 1 chuồi con mới. • 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 đó.. .. 'r'. Sau đó mỗi lần đọc nó đọc 8 bits (ví dụ 't'. Lần tiếp theo LZW bắt gặp một chuỗi con đã có. .) và mã hóa thành con số tương ứng với chỉ mục của kí tự đó trong từ điên.

tìm chỉ mục đó trong từ điển. Chuỗi mới tạo ra được thêm vào từ điển (hoàn toàn giống với quá trình nén). Chuỗi đã được giải mã lại trở thành chuồi đang làm việc và cứ thế quá trình này được tiếp .LZW • Giải nén : • Quá trình mã hóa và giải mã cần phải sử dụng cùng 1 từ điển khởi đầu. trong trường hợp này là 256 kí tự của bảng mã ASCII • Sau đây là cơ chế nó hoạt động. Bộ giải mã LZW trước hết đọc một chỉ mục (là 1 số nguyên). và cho ra chuỗi con gắn với chỉ mực đó. Kí tự đầu tiên của chuỗi con này được cộng thêm vào chuỗi đang làm việc.

• Thuật toán LZW đã khắc phục được sự lãng phí về bộ nhớ mà các thuật toán trước không tận dụng được hết. • Bên nhận có thề tự xây dựng bảng mã mà không cần bên gửi phải gửi kèm theo bản tin nén. Đồng thời khắc phục được sự cứng nhắc của thuật toán nén. có sức hấp dẫn hon đối với người sử dụng . trong tập tin nén không cần phải chứa bảng mã. góp phần làm thuật toán nén trở nên mềm dẻo hơn.LZW • Ưu điểm : • Thuật toán nén LZW có các ưu điểm là hệ số nén tương đối cao.

LZW • Nhược điểm : • Nhược điếm của thuật toán này là tốn nhiều bộ nhớ. khó thực hiện dựa trên các mảng đơn giản (bé hơn 64KB • .