1. Trang chủ
  2. » Luận Văn - Báo Cáo

ĐỀ tài cây mã HUFFMAN (TOÁN ỨNG DỤNG)

24 364 6
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Đề tài cây mã Huffman (Toán Ứng Dụng)
Tác giả Nhóm 4 - KHMT K24
Người hướng dẫn PGS.TSKH. Trần Quốc Chiến
Chuyên ngành Toán Ứng Dụng
Thể loại Đồ án môn học
Định dạng
Số trang 24
Dung lượng 271,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

LỜ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 2

CHƯƠ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 3

1000001 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 4

1.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 5

ii 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 6

Ví 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 7

x ∈ 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 9

ta 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 10

Kế đế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 11

Bâ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 12

CHƯƠ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 13

Minh 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 14

int 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 15

Node ư

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 17

typedef 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 18

2.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 19

Cho đ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 20

CHƯƠ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

Ngày đăng: 26/12/2013, 15:38

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w