Tải bản đầy đủ

Phương pháp mã hóa Huffman

ỦY BAN NHÂN DÂN THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG CAO ĐẲNG KỸ THUẬT LÝ TỰ TRỌNG

BÀI TIỂU LUẬN:

MÃ NÉN DỮ LIỆU

( GIÁO TRÌNH TRUYỀN DỮ LIỆU )
LỚP: 12CĐ-ĐT3
NHÓM 10: Chí Ngọc Sơn
Nguyễn Văn Phụng

Thành phố HCM - Năm học 2014


I. Mã vi phân ( Differential encoding)
Còn gọi là mã tương đối (Relative encoding)
Trong nhiều trường hợp, các dữ liệu liên tiếp nhau thay đổi rất ít. Thí dụ
trường hợp mã tín hiệu hình ảnh trong kỹ thuật video, do phải xử lý 30 bán ảnh (
khung) trong một giây để tạo ảnh động, nên chi tiết của các ảnh không khác
nhau bao nhiêu, thay vì phải nén tín hiệu từng khung người ta nghĩ tới việc xác

định sự khác nhau của cac khung liên tiếp, mã thông tin này và gửi đi.
Nguyên tắc của mã vi phân như sau: khung thứ nhất được phát đi đồng
thời lửu ở bộ đệm của máy phat1va2 thu. Máy phát sẽ so sánh khung thứ hai với
khung thứ nhất này , mã khác biệt và phát đi dưới dạng một khung. Máy thu khi
nhận được khung thứ hai, nhờ các mã chỉ sự khác biệt mà so sánh với khung thứ
nhất (đã lưu trước đó) để tái tạo khung thứ hai, đồng thời nó lưu khung thứ hai
này retrong bộ đệm và quá trình tiếp tục với các khung mới.
Ví dụ:

5762866356
657556 3247
84 68564885
5129865566
5529968951
Khung thứ nhất

5762866356
657656 3237
84 68564885
5139865576
5529968951
Khung thứ nhì
0000000000
0 0 0 1 0 0 0 0 -1 0
0000000000
0010000010
0000000000
Khung phát đi là sai
biệt giữa khung thứ
nhì và khung thứ nhất

5762866356
658556 3337
84 68564885
5129765586
5529968951
Khung thứ ba
0000000000
0010000100
0000000000

0 0 0 0 -1 0 0 0 1 0
0000000000
Khung phát đi là sai
biệt giữa khung thứ ba
và khung thứ nhì


Dữ liệu gồm các số nguyên được biểu diễn trong một khung 2 chiều, chúng
không mang một ý nghĩa cụ thể nào. Mục đích của thí dụ là để hiểu cách tạo mã.
Khung thứ nhất chứa một tập hợp các số nguyên và khung thứ hai chứa một tập
hợp các số nguyên khác khung thứ nhật một ít.
Trong hình, các khung nằm dưới khung thứ hai và khung ba là khung chứa các
mã vi phân, số 0 chỉ không có sự khác biệt dữ liệu của 2 khung, số 1 chỉ dữ liệu
khung sau lớn hơn khung trước 1 đơn vị và số -1 chỉ dữ liệu khung sau bé hơn
khung trước. Dĩ nhiên có thể sử dụng các số khác nhau là 1 và -1.
Thí dụ cho ta thấy sự xuất hiện một chuỗi dài các bit 0 và có thể được nén nhờ
phương pháp Run length.2. Phương pháp mã hoá độ dài loạt (Run-Length
Encoding)
2.1 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, điều này thường thấy trong các tập tin đồ hoạ 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
2.2 Ví dụ, xét chuỗi sau:
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. 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, rồi lại theo sau bởi năm chữ
B 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. 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, tuỳ thuộc vào các đặc trưng của ứng dụng.
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ã
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.
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" 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á.)


Ðố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ể. Ý tưởng ở đây là lưu lại
các độ dài loạt, tận dụng sự kiện các loạt chạy thay đổi giữa 0 và 1 để tránh phải
lưu chính các số 0 và 1 đó. Ð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 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ã 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.
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ó, 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ã 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ó 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á, 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ã 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. 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ự
"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ã hoá bằng nhiều dãy Escape, ví
dụ, 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.
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. Trên thực tế, nó được dùng trong các
tập tin .PCX, .RLE.
3. Phương pháp mã hóa Huffman
3.1. 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 hơn
3.2. 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 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, nếu không thì thực hiện bước ba.
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,
bên phải mã 1.
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ì thực hiện bước một, ngược lại thì
thực hiện bước 3.
Bước 3: Kết thúc thuật toán.


Một số những hạn chế của mã Hufman:






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ý tự.
Mã Huffman chỉ giải quyết được độ dư thừa phân bố ký tự.
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.
Đ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.
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.



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×