Trong bài báo cáo này chúng ta chỉ tậpchung nghiên cứu về thuật toán static Huffman hay là mã Huffman dựatrên mã tiền tố và sau đó đưa ra những nhận xét về ưu điểm và khuyết điểmcủa phươ
Trang 1LỜI NÓI ĐẦU
Mạng Internet là xu hướng phát triển của thế giới ngày nay Hiện nay, Internet đã trở nên rất phổ biến trên toàn thế giới Thông qua mạng Internet mọi người có thể trao đổi thông tin với nhau một cách nhanh chóng thuận tiện Khi một người muốn trao đổi thông tin với một người hay một tổ chức nào đó thông qua mạng máy tính thì yêu cầu quan trọng
là làm sao để đảm bảo thông tin không bị sai lệch hoặc bị lộ do sự xâm nhập của kẻ thứ ba.
Trước các yêu cầu cần thiết đó, một số giải thuật mã hóa đã dược xây dựng nhằm đảm bảo tính an toàn dữ liệu tại nơi lưu trữ cũng như khi dữ liệu được truyền trên mạng, như các giải thuật Huffman, giải thuật mã hóa đối xứng (DES), giải thuật mã hóa công khai RSA, Việc tìm hiểu và xây dựng chương trình các giải thuật này cũng không nằm ngoài mục đích của đồ án môn học này Đồ án có nhiệm vụ tìm hiểu lý thuyết về mật
mã hoá thông tin.
Thuật toán Huffman, đây được coi là thuật toán mã hóa cơ bản nhất,
từ đó chúng ta sẽ có cách nhìn về các phương pháp mã hóa dữ liệu và các ứng dụng của nó.
Nội dung bài báo cáo gồm những vấn đề sau:
Mục lục Lời mở đầu
Chương 1: Cây mã Huffman Chương 2: Ứng dụng của thuật toán Huffman Chương 3: Cài đặt chương trình
Kết Luận Tài liệu tham khảo.
Trang 2CHƯƠNG 1
CÂY MÃ HUFFMAN 1.1 Giới thiệu thuật toán Huffman
Trong khoa học máy tính và lý thuyết thông tin, mã Huffman là mộtthuật toán mã hóa dùng để mã hóa dữ liệu Nó dựa trên bảng tần suất xuấthiện các kí tự cần mã hóa để xây dự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 Thuật toán được đềxuất bởi David A Huffman khi ông còn là sinh viên Ph.D tại MIT, 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
Minimum-và sau đó ở khoa Khoa học máy tính của Đại học California, Santa Cruz,Trường Kỹ nghệ Baskin (Baskin School of Engineering)
Mã Huffman xây dựng trên mã tiền tố là Huffman tĩnh Sau đây là kháiniệm về mã tiền tố Sau này dựa trên thuật toán Huffman, các nhà khoa họcnhư : Faller (1973) và Gallager (1978) đã cải tiến thuật toán và đưa ra kháiniệm Adaptive Huffman hay là Huffman động, Năm 1985 Knuth đưa ramột số cải tiến và hoàn chỉnh thuật toán Vì vậy thuật toán này còn được gọi
là thuật toán FGK Về cơ bản thì thuật toán này khắc phục được nhữngđiểm thiếu sót của static Huffman Trong bài báo cáo này chúng ta chỉ tậpchung nghiên cứu về thuật toán static Huffman hay là mã Huffman dựatrên mã tiền tố và sau đó đưa ra những nhận xét về ưu điểm và khuyết điểmcủa phương pháp này , cuối cùng là so sánh với phương pháp Huffmanđộng và các phương pháp mã hóa khác
1.2 Mã tiền tố (prefix-free binary code)
1.2.1 Giới thiệu mã tiền tố
Để 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ã của kí hiệu đó Chẳng hạn bộ mã ASCII, mã hóacho 256 kí hiệu là biểu diễn nhị phân của các số 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à
Trang 31000001 Trong cách mã hóa này các từ mã của tất cả 256 kí hiệu có độ dàibằng nhau (mỗi từ mã 8 bít) Nó được gọi là mã hóa vớ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ơnnữ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ệunào xuất hiệ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ệunào Một trong các giải pháp là dùng các dấu phẩy (",") hoặc một kí hiệuquy ướ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áchgiải quyết khác dẫn đến khái niệm mã tiền tố
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áctrong 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" Nếu mã hóa bằng các từ mã có độ dài bằng nhau ta dùng
ít nhất 2 bit cho một chữ cái 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ếuvới bảng mã
Nếu mã hóa "A"=0, "R"=01, "Y"=11 thì bộ từ mã này không là mã tiền
tố ví từ mã của "A" là tiền tố của từ mã của "R" Để mã hóa cả từ ARRAYphải đặt dấu ngăn cách vào giữa các từ mã 0,01,01,0,11
Nếu mã hóa "A"=0, "R"=10, "Y"=11 thì bộ mã này là mã tiền tố Với
bộ mã tiền tố này khi mã hóa xâu "ARRAY" ta có 01010011
Trang 41.2.2 Biểu diễn mã tiền tố trên cây nhị phân
Nếu có một cây nhị phân n lá ta có thể tạo một bộ mã tiền tố cho n kýhiệu bằng cách đặt mỗi ký hiệu vào một lá Từ mã của mỗi kí hiệu đượ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ụ: 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
Giả sử ta có một bản tin gồm một dãy ký hiệu lấy trong một tập hợp hữuhạn X Biết rằng mỗi ký hiệu x trong bản tin xuất hiện theo một xác suấtcho trước p(x) Ta muốn mã hóa các ký hiệu này thành các chuỗi bit nhịphân sao cho chiều dài chuỗi mã hóa của bản tin là ngắn nhất
+ Ví dụ: Xét bản tin gồm 1010 ký hiệu lấy từ tập X = {a,b,c,d,e,f} Tầnsuất xuất hiện các ký hiệu trong bản tin như sau:
Trang 5ii Cách mã hóa thứ hai:
Cách mã III ngắn hơn cách mã I và có tính chất sau:
- Không có chuỗi mã ký hiệu nào là tiền tố (tức dãy con đầu) của chuỗi mã của ký hiệu khác Mọi mã thỏa mãn tính chất này gọi là mã tiền tố.
- Với mỗi mã tiền tố ta có thể xây dựng cây nhị phân sao cho mỗi láứng với một ký hiệu và đường đi từ gốc đến lá sẽ xác định mã của ký
hiệu tương ứng như sau: Cạnh đi xuống con bên trái ứng với bít 0 và cạnh đi xuống bên phải ứng với bit 1.
Trang 6Ví dụ: Cây nhị phân của mã tiền tố III:
Đảo lại, xét cây nhị phân t, trên đó mỗi lá được gán nhãn là một kýhiệu trong X Khi đó cây t sẽ xát định một mã tiền tố Với mỗi lá x, mứch(x) của x chính là chiều dài chuỗi mã của x gọi f(x) là tần suất xuất hiệnthì chiều dài chuỗi mã bản tin là:
L*∑ h(x) * f(x)
x ∈ X
trong đó L là số ký hiệu của bản tin
Độ dài trên ngắn nhất khi và chỉ khi cây T có
Trang 7x ∈ X
đạt giá trị nhỏ nhất Cây T như vậy gọi là cây mã tối ưu
1.3 Giải thuật Huffman
1.3.1 Giải thuật Huffman tìm cây mã hóa tối ưu
Đầu ra: Cây mã tối ưu Huffman.
iii. Tìm hai cây trong T với nhãn gốc nhỏ nhất gọi các gốc là u và
v Nối u và v với đỉnh w ta được cây mới gốc w (các cây u
và v trở thành cây con của w) Nhãn gán cho w là tổng nhãncủa u và v Quay lại bước (ii)
• Bổ đề: gọi x và y là hai ký hiệu có tần suất hiện f(x), f(y) nhỏ nhất trong
X khi đó tồn tại cây mã tối ưu T của X sao cho x và y là hai nút anh emtrong T
Chứng minh:
Gọi Tn là một cây mã tối ưu của X
Giả sử x,y không là lá anh em Gọi u là lá mức lớn nhất trong T0 khi đó uphải có lá anh em v, vì nếu không ta có thể xóa nút u và gán ký hiệu u chocha của u và ta có mã mới tốt hơn T0 , mâu thuẫn với T0 là mã tối ưu
Nếu x không cùng mức với u, tức h(x) < h(u), ta hoán đổi ký hiệu x và u, vànhận được cây mới T1 Ta có:
E(T1) = E(T0) – h(x).f(x) – h(u).f(u) + h(x).f(u) + h(u) f(x)
= E(T0) – [h(u) – h(x)] [f(u) – f(x)] < E(T0)
Trang 8Điều này mâu thuẫn với tính tối ưu của T0 Vậy x và tương tự y cócùng mức với u,v Bằng cách hóan đổi x và y với u ta nhận được cây T cóE(T) = E(T0), nghĩa là T cũng là cây tối ưu.
• Định lý: Giải thuật Huffman cho cây mã tối ưu.
Chứng minh:
Quy nạp theo số ký hiệu n của X
Bước cơ sở: n=2 Giả sử hai ký hiệu trong X là x và y thì giải thuậtcho cây mã
và hiển nhiên đây là cây mã tối ưu
+ Bước quy nạp: Giả sử X có n ký hiệu và x và y là hai ký hiệu cótần suất nhỏ nhất
Gọi X’ là tập có n-1 ký hiệu nhận được từ X bằng cách thay ký hiệu x
và y bằng 1 ký hiệu z với tần suất f(z) = f(x) + f(y)
Theo bổ đề tồn tại cây mã tối ưu t sao cho x và y là anh em Từ T bỏhai nút lá x và y và gán z cho nút cha của x và y ta nhận được cây mãT’ của X’
Bây giờ cho H là cây nhận được từ giải thuật Huffman của X với x và
y là anh em Từ H bỏ hai nút lá x và y và gán z cho nút cha của x và y
y x
1 0
Trang 9ta nhận được cây mã Huffman H’ của X’ theo giả thiết quy nạp H’ làcây mã tối ưu Vì vậy ta có:
E(H) = E(H’) + f(x) + f(y) ≤ E(T’) + f(x) + f(y) = E(T)Mặt khác vì T tối ưu nên từ đó suy ra E(H) = E(T), tức là tối ưu
1.3.2 Giải thuật thành lập cây Huffman
Thành lập cây nhị phân từ tập hợp các kí hiệu trong thông báo, mỗi kíhiệu là nút
Chọn hai nút a,b có xác suất nhỏ nhất trong tập hợp các nút, giả sửxác xuất nút a nhỏ hơn hoặc bằng xác suất nút b Thành lập cây nhị phân cónút gốc x, con trái là a, con phải là b Nút x có xác suất bằng tổng xác suấtcủa a và b
Tập hợp các nút bây giờ là các nút còn lại (đã loại bỏ a, và nút x Lặplại một cách đệ qui quá trình trên tập hợp đang xét cho đến khi tập này chỉcòn lại một nút
Mã của a, b sẽ tìm được bằng cách lấy mã của x nối thêm 0 cho a và 1cho b Mã của nút gốc là rỗng
Như vậy thực chất quá trình trên là ta xây dựng một cây nhị phân từtập hợp các ký tự muốn mã hoá, cuối cùng ta được một cây nhị phân có lá làcác ký tự đó Mã của một ký tự là một đường đi trên cây từ gốc đến lá chứa
kí tự, với 0 đi sang trái còn 1 đi sang phải Ý tưởng của giải thuật mã hoácũng hết sức đơn giản, ta tìm bộ mã cho các kí tự sao cho các kí tự có tầnsuất xuất hiện cao (xác suất xuất hiện là lớn) sẽ được mã ngắn (gần với gốc)
để độ dài trung bình để mã hoá một kí tự là nhỏ nhất
Ví dụ: xét tập hợp các kí tự với xác xuất được cho trong bảng trên ta cóBước khởi đầu ta có 5 nút với xác xuất như sau:
a b c d e.10 40 12 18 20hai nút a và c có xác suất nhỏ nhất vậy ta kết hợp hai nút này lại ta có
Trang 10Kế đến ta thấy hai nút d và e có sác xuất nhỏ nhất trong tập hợp trênnên ta kết hợp chúng lại ta được
Tiếp tục ta kết hợp hai nút có xác suất bé nhất lại, ta được
0.38 0.40
Trang 11Bây giờ tập hợp chỉ còn hai nút ta kết hợp hai nút này lại và giải thuật kếtthúc.
Từ cây kết quả trên suy ra mã của các ký hiệu như sau:
100 0 101 110 111
Ðộ dài trung bình của bộ mã: 3*0.10+1*0.40+3*0.12+3*0.18+1*0.20 = 2.2
b 1.0
e d
*
*
*
Trang 12CHƯƠNG 2 ỨNG DỤNG CỦA THUẬT TOÁN HUFFMAN 2.1 Mã hóa và giải mã file
Mã Huffman là một thuật toán mã hóa dùng để mã hóa dữ liệu Nó dựatrên bảng tần suất xuất hiện các kí tự để xây dựng một bộ mã nhị phân chocác kí tự đó sao cho dung lượng (số bít) sau khi mã hóa là nhỏ nhất
2.2 Giải thuật mã hóa huffman
2.2.1 Tư tưởng của giải thuật mã hóa huffman
Phương pháp cũ là dùng 1 dãy cố định (7 hay 8 bits) để biểu diễn 1 ký
tự dẫn đến việc dư thừa thông tin
Huffman:
Sử dụng 1 vài bit (mã/code) để biểu diễn 1 ký tự
Ký tự xuất hiện nhiều: biểu diễn bằng mã ngắn
Ký tự xuất hiện ít: biểu diễn bằng mã dài
Vì thế tiết kiệm được số bit lưu trữ
Việc mã hóa các kí tự bằng những chuỗi bit có độ dài khác nhau thìrất khó khăn Ta có thể dùng dấu phẩy “,” nhưng như thế thì nó lại chiếmthêm 1 không gian đáng kể để lưu trữ Vì vậy bộ các từ mã tập hợp các kíhiệu phải thoả điều kiện: từ mã của mỗi ký tự không là tiền tố (phần đầu)của từ mã một ký tự khác trong bộ mã ấy (mã tiền tố)
2.2.2 Ý tưởng thuật toán
Các bước:
[B1]: Duyệt file Lập bảng thống kê số lần xuất hiện của mỗi ký tự[B2]: Dựa vào bảng thống kê số lần xuất hiện Phát sinh câyHuffman
[B3]: Cây Huffman Phát sinh bảng mã bit ứng với từng ký tự
[B4]: Duyệt file Thay thế các ký tự bằng mã bit tương ứng lưu vàofile mã hóa
[B5]: Lưu lại thông tin của cây Huffman (dùng để Giải mã)
Trang 13Minh họa ý tưởng thuật toán mã hóa:
Thực hiện Bước 2 ta có cây:
Thực hiện bước 3 duyệt cây trên ta được bảng mã bit cho từng ký tự:
Note :
1
CEDBA31
Root Node 2
Trang 14int iLeft; //cây con trai
int iRight; //cây con phải
} HuffNode;
HuffNode HuffTree[MAX_NODES];
int iStart = 0; // trỏ vào phần tử đầu tiên của cây
int iEnd = 0; // trỏ vào phần tử null sau phần tử cuối của mảng ( phần
tử cuối của mảng là gốc )
Thuật toán phát sinh cây:
- [b1] Chọn trong bảng thống kê 2 phần tử x,y có trọng số thấpnhất tạo thành 1 nút mơi z:
- [b2] Loại bỏ nút x và y khỏi bảng; thêm nút z vào bảng
- [b3] Lặp lại bước [b1] và [b2] cho đến khi trong bảng chỉ còn 1nút duy nhất
void CreateTree()
{
while ( iEnd > iStart + 1 ) //cây còn nút
{sort( iStart, iEnd ); //sắp xếp các nút theo thứ tự tăng dần theo trọng
số
Trang 15Node ư
HuffTree[iEnd].iLeft = iStart; //nút con trái của nút cha HuffTree[iEnd].iRight = iStart + 1; //nút con phải của nút cha
Duyệt cây mã bit của 1 ký tự
Duyệt sang trái 0, duyệt sang phải 1
Phát sinh bảng mã bit - Cấu trúc bảng mã
Trang 17typedef struct Ele
{
char c; // ký tự
int code; // mã của ký tự
int length; // độ dài của code
}Ele;
Ele HuffTable[256]; // bảng mã ký tự và mã bit tương ứng
int iN = 0; số phần tử của bảng mã
void CreateTable( int pos, int code, int length ) // pos: vị trí nút hiện tại, code: mã bit đạt được tới thời điểm hiện tại, length: chiều dài của
mã bit hiện tại
}
}
2.2.4 Thuâ ̣t toán nén file
Các bước:
[b1] Đo ̣c từng ký tự trong tập tin cần nén vào
[b2] Tìm trong bảng mã bit mã bit tương ứng ký tự đó
[b3] Ghi ra file nén đoa ̣n mã bit đó
[b4] Nếu file còn ký tự thì quay la ̣i bước 1, nếu không thì kết thúc
Trang 182.2.5 Cấu trúc file mã hóa
• Lưu bảng thống kê số ký tự:
– Byte đầu lưu số N ký tự
– N phần tử kế tiếp lưu loại ký tự và số lần xuất hiện
– 4 byte kế lưu số ký tự đã được mã hóa
– Phần còn lại lưu mã bit của các ký tự của file được mã hóa
• Lưu bảng mã bit:
– Byte đầu lưu số N ký tự
– N phần tử kế tiếp lưu loại ký tự, mã bit và chiều dài mã bit– 4 byte kế lưu số ký tự đã được mã hóa
– Phần còn lại lưu mã bit của các ký tự của file được mã hóa
2.3 Giải thuật giải mã huffman
- Các bước thực hiện
[b1] Xây dựng lại cây Huffman (từ thông tin được lưu)
[b2] Bắt đầu từ nút gốc
[b3] Đọc 1 bit b từ file mã hóa fn
[b4] Nếu (b=0) thì qua nút trái ngược lại qua nút phải
[b5] Nếu tơi nút lá thì:
- Xuất ký tự tại nút lá ra file
- Nếu đọc hết file thì kết thúc thuật toán
- Quay lại bước [b2]
ngược lại không phải là nút lá
- Quay lại bước [b3]
Cho bảng mã huffman như sau:
Trang 19Cho đoạn mã 1111001 Ta có sơ đồ giải mã như sau:
Phát sinh cây huffman từ bảng mã:
1
1
0
0 0
0
Roo t
Trang 20CHƯƠNG 3 CÀI ĐẶT CHƯƠNG TRÌNH
3.1 Yêu cầu của bài toán
◊ File văn bản đầu vào: <Văn bản>.TXT
◊ Dữ liệu đầu ra
i File mã <Văn bản>.HUF có cấu trúc
3.2 Chương trình mã hóa mã huffman
Chương trình được viết trên môi trường turbo C++ for DOS 3.0,Window XP
a Thư mục chương trình gồm các file