Bài toỏn mó húa Huffman

Một phần của tài liệu thiết kế thuật toán dựa trên ý tưởng của phương pháp tham lam (Trang 48 - 55)

* Mó húa Huffman

Mó húa Huffman là một thuật toỏn mó húa dựng để nộn dữ liệu. Nú là phƣơng phỏp hiệu quả và đƣợc sử dụng một cỏch rộng rói trong việc nộn dữ liệu, thƣờng tiết kiệm từ 20% đến 90%, phụ thuộc vào đặc tớnh của tập tin đƣợc nộn. Ta xem nhƣ dữ liệu đú là một chuỗi cỏc ký tự. Giải phỏp tham lam của Huffman sử dụng một bảng gồm cỏc tần số xuất hiện của cỏc ký tự để xõy dựng nờn một cỏch biểu diễn tối ƣu mỗi ký tự dƣới dạng một chuỗi nhị phõn.

Để 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úa cho 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à 1000001. Trong cỏch mó húa này cỏc từ mó của tất cả 256 kớ hiệu cú độ dài bằ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ơn nữ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ệu nà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, khi giải mó làm thế nào phõn biệt đƣợc xõu bớt nào là mó húa của ký hiệu nà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ệu quy ƣớ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ảng mó. Một cỏch giải quyết khỏc là mó tiền tố

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ỏc trong bộ mó ấy.

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ếu vớ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ừ ARRAY phả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

Việc giải mó luụn luụn đơn giản đối với bất cứ mó ký tự nhị phõn nào; ta chỉ việc ghộp nối cỏc từ mó biểu diễn mỗi ký tự của tập tin đú với nhau.

Mó tiền tố cần thiết bởi vỡ chỳng làm đơn giản hoỏ việc giải mó. Vỡ khụng cú từ mó nào là tiền tố của bất kỳ từ mó khỏc, nờn từ mó bắt đầu một tập tin đƣợc mó hoỏ là rất rừ ràng. Ta cú thể nhận biết một cỏch đơn giản từ mó lỳc đầu, dịch nú trở lại ký tự gốc ban đầu, và lặp lại quy trỡnh giải mó đối với phần cũn lại của tập tin đó mó hoỏ.

Quỏ trỡnh giải mó cần cú sự biểu diễn thớch hợp cho mó tiền tố sao cho cú thể dễ dàng chọn ra từ mó ban đầu. Một cõy nhị phõn mà cỏc lỏ của nú là cỏc ký tự cho trƣớc quy định một cỏch biểu diễn nhƣ vậy. Ta diễn dịch từ mó nhị phõn của một ký tự chớnh là đƣờng đi từ gốc đến ký tự đú, ở đú 0 cú nghĩa là “đi đến con trỏi” và 1 cú nghĩa là “đi đến con phải.

Lƣu ý rằng những cõy này khụng là cõy nhị phõn tỡm kiếm, những lỏ khụng cần xuất hiện trong thứ tự sắp xếp và những nỳt trong khụng chứa khoỏ ký tự.

(a) (b) Minh hoạ 1

Mỗi lỏ được gỏn nhón là một ký tự và tần số xuất hiện của nú. Mỗi nỳt trong được gỏn nhón là tổng của tần số cỏc lỏ trờn cõy con của nú. (a) Cõy tương ứng với mó cú chiều dài cố định a = 000,..., e = 101. (b) Cõy tương ứng với mó tiền tố tối ưu a = 0, b = 101,..., f= 1100.

Một mó tối ƣu cho một tập tin luụn luụn đƣợc biểu diễn bằng một cõy nhị phõn đầy đủ, trong đú mọi nỳt khụng là lỏ đều cú 2 con . Mó cú chiều dài cố định trong vớ dụ của ta là khụng tối ƣu vỡ rằng cõy của nú thể hiện ở minh hoạ (a) khụng phải là cõy nhị phõn đầy đủ: cú những từ mó bắt đầu 10… nhƣng khụng bắt đầu 11…Vỡ rằng bõy giờ ta cú thể hạn chế chỳ ý vào cỏc cõy nhị phõn đầy đủ, nờn cú thể núi rằng nếu C là bảng chữ cỏi từ những ký tự đƣợc cho trƣớc và tất cả tần số ký tự là xỏc định, thỡ cõy cho một mó tiền tố tối ƣu cú chớnh xỏc là lỏ, mỗi lỏ cho một ký tự của bảng chữ cỏi, và cú đỳng .

Cho một cõy T tƣơng ứng với một mó tiền tố, dễ dàng để tớnh đƣợc số bit yờu cầu để mó hoỏ một tập tin. Với mỗi ký tự c trong bảng chữ cỏi C, đặt f(c) là tần số của c trong tập tin đú và đặt dT(c) là độ sõu của lỏ chứa ký tự c trờn cõy. Lƣu ý rằng dT(c) cũng là chiều dài của từ mó của ký tự c.

100 0 0 1 58 0 1 c:12 b:13 14 0 1 f:5 e:9 d:16 28 a:45 14 0 1 86 0 0 1 100 0 0 1 25 0 1 c:12 b:13 14 0 1 f:5 e:9 d:16 30 0 1 a:45 55 0 1

Xõy dựng mó Huffman

Huffman phỏt minh ra giải thuật tham lam nhằm xõy dựng mó tiền tố tối ƣu

gọi là giải thuật mó hoỏ Huffman. Sự kiểm chứng về độ tin cậy đỳng đắn trờn thuộc tớnh lựa chọn tham lam và cấu trỳc con tối ƣu. Hơn nữa chứng minh rằng hiểu đƣợc những thuộc tớnh này và rồi phỏt triển dạng giả mó, đầu tiờn ta biểu diễn dƣới dạng giả mó. Làm nhƣ thế sẽ giỳp làm rừ giải thuật chọn những chọn lựa tham lam nhƣ thế nào.

Trong dạng giả mó sau đõy, ta giả sử rằng C là một tập hợp gồm n ký tự và mỗi ký tự c  C là phần tử với tần số xỏc định f[c]. Giải thuật xõy dựng cõy T tƣơng ứng với mó tối ƣu theo cỏch từ trờn xuống. Nú bắt đầu với một tập gồm lỏ và thực hiện một chuỗi gồm phộp “kết hợp” để tạo ra cõy cuối cựng. Một hàng đợi ƣu tiờn nhỏ nhất Q, đƣợc lập trờn khoỏ f, đƣợc sử dụng để nhận biết 2 đối tƣợng cú tần số nhỏ nhất để kết hợp với nhau. Kết quả của sự kết hợp 2 phần tử đú là một phần tử mới mà tần số của nú là tổng của cỏc tần số của 2 phần tử đƣợc kết hợp. HUFFMAN(C)

1 n← |C| 2 Q←C

3 fori 1 ton - 1

4 do allocate a new node z

5 left[z] ←x← EXTRACT-MIN (Q) 6 right[z] ←y← EXTRACT-MIN (Q) 7 f [z] ←f [x] + f [y]

8 INSERT(Q, z)

9 return EXTRACT-MIN(Q) ▹Return the root of the tree.

Dũng 2 khởi tạo hàng đợi ƣu tiờn nhỏ nhất Q với cỏc ký tự trong C. Vũng For ở dũng 3-8 lặp lại nhiều lần động tỏc trớch ra 2 nỳt x và y cú tần số thấp nhất trong hàng đợi, và thay thế chỳng trong hàng đợi với một nỳt mới z thực hiện kết hợp chỳng với nhau. Tần số của z đƣợc tớnh là tổng của cỏc tần số của x và y ở dũng 7. Nỳt z cú x là nỳt con trỏi và y là nỳt con phải. (Thứ tự này là tuỳ ý; đổi vị trớ

cõy con trỏi và phải đều mang lại một mó khỏc cú mức hao phớ tƣơng đƣơng). Sau n-1 phộp kết hợp, nỳt thứ nhất trỏi đƣợc để lại trong hàng đợi - gốc của cõy mó hoỏ - đƣợc trả về giỏ trị ở dũng 9.

Phõn tớch thời gian chạy giải thuật Huffman cho thấy rằng Q đƣợc thực hiện nhƣ một đống nhị phõn. Cho một tập hợp C gồm n ký tự, giỏ trị ban đầu của Q ở dũng 2 cú thể đƣợc thực hiện trong O(n) thời gian dựng cho thủ tục BUILD_MIN_HEAP . Vũng Forở dũng 3-8 đƣợc thực hiện chớnh xỏc là n-1 lần, và bởi vỡ mỗi phộp toỏn đống yờu cầu thời gian là O(lgn), nờn vũng lặp đúng gúp O(nlgn) vào thời gian chạy thuật toỏn. Vỡ vậy, tổng thời gian chạy của giải thuật Huffman trờn tập hợp gồm n ký tự là O(nlgn).

Vớ dụ: Bài toỏn mó hoỏ ký tự. Một tập tin dữ liệu gồm 100,000 ký tự chỉ chứa cỏc ký tự a-f, với tần số đƣợc cho trƣớc(bảng dƣới). Nếu mỗi ký tự đƣợc chỉ định một từ mó 3 bit, tập tin đú cú thể đƣợc mó hoỏ với 300,000 bit. Sử dụng mó cú chiều dài bất định cho thấy tập tin đú cú thể đƣợc mó hoỏ với 224,000 bit.

A b c d e f Tần số (ngàn) 45 13 12 16 9 5 Từ mó cú chiều dài cố định 000 001 010 011 100 101 Từ mó cú chiều dài bất định 0 101 100 111 1101 1100 (a) (b) (c) (d) (e) f:5 e:9 c:12 b:13 d:16 a:45 14 0 1 f:5 e:9 c:12 b:13 d:16 a:45 14 0 1 f:5 e:9 25 0 1 c:12 f:13 d:16 a:45 25 0 1 c:12 b:13 14 0 1 d:16 30 0 1 a:45 25 0 1 30 0 1 a:45 55 0 1

(f)

Minh hoạ 2

Cỏc bƣớc của giải thuật Huffman với tần số đƣợc cho trong minh hoạ 2 mỗi đƣờng đi chỉ ra nội dung của chuỗi đƣợc sắp xếp theo thứ tự tăng dần của tần số. Ở mỗi bƣớc, 2 cõy với tần số thấp nhất đƣợc kết hợp với nhau. Cỏc lỏ đƣợc thể hiện bởi cỏc hỡnh chữ nhật chứa một ký tự và tần số của nú. Những nỳt trong đƣợc thể hiện bởi cỏc vũng trũn chứa tổng cỏc tần số của cỏc nỳt con của nú. Nỳt ngoài cựng kết nối với nỳt trong bởi cỏc con của nú cú nhón là 0 nếu đú là cạnh đi đến nỳt con trỏi và 1 nếu đú là cạnh đi đến nỳt con phải. Từ mó cho một mẫu tự là một dóy cỏc nhón trờn những cạnh kết nối gốc với lỏ biểu diễn cho mẫu tự đú. (a) Tập hợp ban đầu của n=6 nỳt, mỗi nỳt là một mẫu tự. (b)-(e) cỏc giai đoạn trung gian. (f) Cõy cuối cựng

Tớnh đỳng đắn của giải thuật Huffman

Để chứng minh thuật toỏn tham lam Huffman là đỳng, ta chỉ ra rằng bài toỏn xỏc định mó tiền tố tối ƣu thể hiện lựa chọn tham lam và những tớnh chất cấu trỳc con. Bổ đề tiếp theo chỉ ra thuộc tớnh lựa chọn tham lam cú.

100 0 0 1 25 0 1 c:12 b:13 14 0 1 f:5 e:9 d:16 30 0 1 a:45 55 0 1

1. Bổ đề 1

Cho C là một bảng chữ cỏi mà mỗi ký tự cC cú tần số là f[c]. Cho x và y là 2 ký tự trong C cú tần số thấp nhất. Thỡ tồn tại mó tiền tố tối ƣu đối với C mà trong đú những từ mó của x và y cú cựng chiều dài và chỉ khỏc duy nhất ở bit cuối cựng.

2. Bổ đề 2

Cho C là một bảng chữ cỏi cho trƣớc với tần số f[c] xỏc định với mỗi ký tự cC . Cho x và y là hai ký tự trong C với tần số nhỏ nhất. Cho C’ là bảng chữ cỏi C với x và y bị xoỏ và cú thờm ký tự mới z, vỡ vậy C’=C-{x,y} {z}; xỏc định f của C’ cũng là của C, với f[z]=f[x]+f[y]. Cho T’ là cõy bất kỳ biểu diễn mó tiền tố tối ƣu của bảng chữ cỏi C’ thỡ cõy T, thu đƣợc từ T’ bằng việc thay thế nỳt lỏ z với một nỳt trong cú x và y là con, biểu diễn mó tiền tố tối ƣu cho bảng chữ cỏi C.

3. Bổ đề 3

Thủ tục Huffman hỡnh thành nờn mó tiền tố tối ƣu. Chứng minh từ Bổ đề 2 và 3

2.7.1. Phỏt biểu bài toỏn

Giả sử ta cú một thụng bỏo là một chuỗi cỏc ký tự, trong đú mỗi ký tự xuất hiện độc lập với cựng một xỏc suất tại bất kỳ vị trớ nào trong thụng bỏo. Yờu cầu đặt ra là mó húa thụng bỏo này thành một chuỗi cỏc ký tự 0, 1.

2.7.2. Phõn tớch thiết kế thuật toỏn

Cho trƣớc một tập hợp cỏc ký tự: c1, c2, ..., cn mà xỏc xuất xuất hiện trong thụng bỏo lần lƣợt là w1, w2, ..., wn.

Ta sẽ mó húa mỗi ký tự trong chuỗi thụng bỏo đó cho, sao cho:

 Khụng cú ký tự nào đƣợc mó húa thành chuỗi là tiền tố của chuỗi mó húa ký tự khỏc (tớnh chất này đƣợc gọi là tớnh chất tiền tố).

 éộ dài của bộ mó là ngắn nhất.

Thiết kế thuật toỏn

Input: tập hợp cỏc ký tự: c1, c2, ..., cnC và w1, w2, ..., wn. Output: mó nhị phõn của thụng bỏo C

Mụ tả:

Bƣớc 1: đếm số lần xuất hiện của mỗi kớ tự trong tập tin sẽ đƣợc mó hoỏ.

Bƣớc 2: tiếp theo là xõy dựng một cõy nhị phõn với cỏc tần số đƣợc chứa trong cỏc nỳt. Hai nỳt cú tấn số bộ nhất đƣợc tỡm thấy và một nỳt mới đƣợc tạo ra với hai nỳt con là cỏc nỳt đú với giỏ trị tần số của nỳt mới bằng tổng tần suất của hai nỳt con. Tiếp theo hai nỳt mới với tần số nhỏ nhất lại đƣợc tỡm thấy và một nỳt mới nữa lại đƣợc tao ra theo cỏch trờn.

Lặp lại nhƣ vậy cho đến khi tất cả cỏc nỳt đƣợc tổ hợp thành một cõy duy nhất.

Một phần của tài liệu thiết kế thuật toán dựa trên ý tưởng của phương pháp tham lam (Trang 48 - 55)