36
1 Chương 4. Chương 4. Các giải thuật tham lam Các giải thuật tham lam giải bài toán tối ưu giải bài toán tối ưu 7.1. 7.1. Sơ đồ chung của giải thuật tham lam Sơ đồ chung của giải thuật tham lam 7.2. 7.2. Bài toán lựa chọn công việc Bài toán lựa chọn công việc 7.3. 7.3. Bài toán mã Huffman (mã tiền tố tối Bài toán mã Huffman (mã tiền tố tối ưu) ưu)

Chg4 tham lam

Embed Size (px)

Citation preview

Page 1: Chg4 tham lam

11

Chương 4. Chương 4. Các giải thuật tham lamCác giải thuật tham lam

giải bài toán tối ưugiải bài toán tối ưu

7.1. 7.1. Sơ đồ chung của giải thuật tham lamSơ đồ chung của giải thuật tham lam7.2. 7.2. Bài toán lựa chọn công việcBài toán lựa chọn công việc7.3. 7.3. Bài toán mã Huffman (mã tiền tố tối ưu)Bài toán mã Huffman (mã tiền tố tối ưu)

Page 2: Chg4 tham lam

22

Sơ đồ chung của giải thuật tham Sơ đồ chung của giải thuật tham lamlam

Dạng các bài toán giải bằng giải thuật Tham Dạng các bài toán giải bằng giải thuật Tham LamLam

Giả sử ta phải chọn một tập con R của các phần Giả sử ta phải chọn một tập con R của các phần tử của một tập tử của một tập

S = (s1, s2,...,sn )S = (s1, s2,...,sn ) sao cho :sao cho : Tập R thỏa mãn một điều kiện ràng buộc W(R) Tập R thỏa mãn một điều kiện ràng buộc W(R)

nào đó;nào đó; Một hàm mục tiêu Z(R) đạt giá trị tối ưu (cực đại Một hàm mục tiêu Z(R) đạt giá trị tối ưu (cực đại

hoặc cực tiểu).hoặc cực tiểu).

Page 3: Chg4 tham lam

33

Sơ đồSơ đồBước 1Bước 1: Chọn một phần tử : Chọn một phần tử ss có l có lợiợi nhất cho nhất cho

lời giải trong bước đó sao cho phần tử này lời giải trong bước đó sao cho phần tử này cùng với lời giải tối ưu của bài toán với tập cùng với lời giải tối ưu của bài toán với tập con Scon S{{ss} } với ràng buộc W(Rvới ràng buộc W(R{{ss }) và }) và hàm mục tiêu Z(Rhàm mục tiêu Z(R{{ss}) là lời giải tối ưu }) là lời giải tối ưu của bài toán.của bài toán.

Bước 2Bước 2: Tiêp tục tìm phần tử tiếp theo có lợi : Tiêp tục tìm phần tử tiếp theo có lợi nhất với tập con S = Snhất với tập con S = S{s} {s} với ràng buộc với ràng buộc W=W=W(RW(R{s{s}) và hàm mục tiêu }) và hàm mục tiêu Z = Z = Z(RZ(R{s{s}).}). Cho đến khi không thể tìm được Cho đến khi không thể tìm được phần tử như vậy hoặc tập S = phần tử như vậy hoặc tập S = ..

Page 4: Chg4 tham lam

44

4.2. Bài toán lựa chọn công việc4.2. Bài toán lựa chọn công việc

Bài toán:Bài toán: Giả sử rằng ta có một tập S = { 1,2,...n} của n Giả sử rằng ta có một tập S = { 1,2,...n} của n

công việc sử dụng cùng một tài nguyên, ví dụ như công việc sử dụng cùng một tài nguyên, ví dụ như một phòng họp, tại một thời điểm chỉ có một công một phòng họp, tại một thời điểm chỉ có một công việc được tiến hành. Các công việc i được bắt đầu việc được tiến hành. Các công việc i được bắt đầu tại thời điểm stại thời điểm sii và kết thúc tại thời điểm f và kết thúc tại thời điểm fii với s với sii ≤ ≤ ffii . Nếu được chọn, công việc i sẽ chiếm khoảng . Nếu được chọn, công việc i sẽ chiếm khoảng thời gian là thời gian là [s[sii, f, fii) )

Hãy lựa chọn các công việc không mâu thuẫn Hãy lựa chọn các công việc không mâu thuẫn nhau (nghĩa là các khoảng thời gian sử dụng tài nhau (nghĩa là các khoảng thời gian sử dụng tài nguyên không giao nhau) sao cho số các công nguyên không giao nhau) sao cho số các công việc được chọn là nhiều nhất.việc được chọn là nhiều nhất.

INPUT: Thời gian khởi đầu s[1..n]; Thời gian INPUT: Thời gian khởi đầu s[1..n]; Thời gian kết thúc f[1..n]kết thúc f[1..n]

Page 5: Chg4 tham lam

55

Tính chất lời giảiTính chất lời giải

Giả sử dãy công việc sắp xếp tăng dần theo Giả sử dãy công việc sắp xếp tăng dần theo thời điểm kết thúc :thời điểm kết thúc :

ff1 1 f f22 ... ... f fnn

1.1. Luôn tồn tại một lời giải tối ưu chứa công Luôn tồn tại một lời giải tối ưu chứa công việc thứ nhấtviệc thứ nhất

2.2. Nếu A Nếu A S là lời giải tối ưu của bài toán S là lời giải tối ưu của bài toán có chứa việc 1 thì A – {1} là lời giải tối ưu có chứa việc 1 thì A – {1} là lời giải tối ưu của bài toán với tập S’ gồm các công của bài toán với tập S’ gồm các công việc bắt đầu từ thời điểm fviệc bắt đầu từ thời điểm f11 trở đi. trở đi.

Page 6: Chg4 tham lam

66

CHỨNG MINHCHỨNG MINH

1.1. Giả sử tập A là lời giải tối ưu chứa công Giả sử tập A là lời giải tối ưu chứa công việc k>1 là công việc có fviệc k>1 là công việc có fkk nhỏ nhất nhỏ nhất trong A. Khi đó ftrong A. Khi đó fkk ff1 1 nên có thể thay A nên có thể thay A bằng A’= A-{k} U {1} thì A’ vẫn là lời bằng A’= A-{k} U {1} thì A’ vẫn là lời giải tối ưu.giải tối ưu.

2.2. Giả sử A là lời giải tối ưu chứa công việc Giả sử A là lời giải tối ưu chứa công việc 1. Nếu A’= A-{1} không là lời giải tối ưu 1. Nếu A’= A-{1} không là lời giải tối ưu của các công việc bắt đầu từ fcủa các công việc bắt đầu từ f11 trở đi thì trở đi thì la tìm được một lới giải tối ưu với nhiều la tìm được một lới giải tối ưu với nhiều hơn công việc trong A’. Ghép nó với {1} hơn công việc trong A’. Ghép nó với {1} ta được lời giải tốt hơn A, trái giải thiết A ta được lời giải tốt hơn A, trái giải thiết A là lời giải tối ưu.là lời giải tối ưu.

Page 7: Chg4 tham lam

77

Giải thuật tham lam giải bài toán Giải thuật tham lam giải bài toán lựa chọn công việclựa chọn công việc

Procedure Greedy_Selector (s,f)Procedure Greedy_Selector (s,f)1.1. Sắp xếp tăng dần theo thời gian kết thúc Sắp xếp tăng dần theo thời gian kết thúc

các công việc: f[1] ≤ f[2] ≤ ... ≤ f[n]các công việc: f[1] ≤ f[2] ≤ ... ≤ f[n]2.2. A :={1};A :={1}; k := 1;k := 1; For i:= 2 to n do For i:= 2 to n do if sif sii f fkk then then begin A := A begin A := A {i} ; k:= i ;end;{i} ; k:= i ;end; return Areturn A

Page 8: Chg4 tham lam

88

Giải thuật tham lam giải bài toán Giải thuật tham lam giải bài toán lựa chọn công việc: Ví dụlựa chọn công việc: Ví dụ

AA BB CC DD EE FF GG HH II JJ KK

s[i]s[i] 11 33 00 55 33 55 66 88 88 22 1212

f[i]f[i] 44 55 66 77 77 99 1010 1111 1212 1313 1414

Page 9: Chg4 tham lam

99

Ví dụ: GiảiVí dụ: Giải

A[1,4)A[1,4)

B[3,5)B[3,5)

C[0,6)C[0,6)

D[5,7)D[5,7)

E[3,7)E[3,7)

F[5,9)F[5,9)

G[6,10)G[6,10)

H[7,10)H[7,10)

I[8,11)I[8,11)

J[2,12)J[2,12)

K[11,13K[11,13))

0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 1 2 3 4 5 6 7 8 9 10 11 12 13

Page 10: Chg4 tham lam

1010

4.3. Mã nén Huffman4.3. Mã nén Huffman

Mã Huffman được sử dụng rộng rãi và là Mã Huffman được sử dụng rộng rãi và là một kỹ thuật rất hiệu quả đối với việc nén một kỹ thuật rất hiệu quả đối với việc nén dữ liệu. nó có thể tiết kiệm được tới 20% dữ liệu. nó có thể tiết kiệm được tới 20% 90% tùy theo từng file bị nén. Huffman đề 90% tùy theo từng file bị nén. Huffman đề xuất một thuật toán tham lam sử dụng xuất một thuật toán tham lam sử dụng một bảng tần suất xuất hiện của các ký tự một bảng tần suất xuất hiện của các ký tự để xây dựng lên một sơ đồ tốt nhất biểu để xây dựng lên một sơ đồ tốt nhất biểu diễn các ký tự bằng một xâu nhị phân.diễn các ký tự bằng một xâu nhị phân.

Page 11: Chg4 tham lam

1111

Nội dungNội dung

4.3.1. 4.3.1. Mã tiền tốMã tiền tố 4.3.24.3.2.Mã tiền tố tối ưu.Mã tiền tố tối ưu 4.3.3. 4.3.3. Giải thuật của Huffman xây Giải thuật của Huffman xây

dựng cây biểu diễn mã tiền tố tối ưudựng cây biểu diễn mã tiền tố tối ưu 4.3.44.3.4. Các kỹ thuật khi cài đặt thủ tục . Các kỹ thuật khi cài đặt thủ tục

sinh bộ mã Huffmansinh bộ mã Huffman

Page 12: Chg4 tham lam

1212

4.34.3.1. Mã tiền tố.1. Mã tiền tố

Mã tiền tố của một bộ n kí tự là bộ Mã tiền tố của một bộ n kí tự là bộ mã nhị phân của các kí tự đó sao cho mã nhị phân của các kí tự đó sao cho từ mã của kí tự này không phải là từ mã của kí tự này không phải là tiền tố của từ mã một kí tự khác.tiền tố của từ mã một kí tự khác.

Ví dụ: từ mã của A=‘001’, B=‘0010’ Ví dụ: từ mã của A=‘001’, B=‘0010’ thì từ mã của A là tiền tố của từ mã thì từ mã của A là tiền tố của từ mã của B không thỏa mãn định nghĩa mã của B không thỏa mãn định nghĩa mã tiền tố.tiền tố.

Page 13: Chg4 tham lam

1313

Biểu diễn mã tiền tố bằng cây nhị phânBiểu diễn mã tiền tố bằng cây nhị phân

Mỗi bộ mã nhị phân tiền tố của n kí tự Mỗi bộ mã nhị phân tiền tố của n kí tự có thể biểu diễn bằng một cây nhị có thể biểu diễn bằng một cây nhị phân n lá. Khi đó mỗi kí tphân n lá. Khi đó mỗi kí tự ự được đặt được đặt vào một lá của cây sao cho nếu gán vào một lá của cây sao cho nếu gán nhãn cho các cạnh trái của cây bởi ‘0’, nhãn cho các cạnh trái của cây bởi ‘0’, cạnh phải bởcạnh phải bởii ‘1’, thì từ mã của mỗi kí ‘1’, thì từ mã của mỗi kí tự là dãy các nhãn nằm trên đường đi tự là dãy các nhãn nằm trên đường đi từ gốc của cây nhị phân tới mỗi lá đặt từ gốc của cây nhị phân tới mỗi lá đặt kí tự ấy.kí tự ấy.

Page 14: Chg4 tham lam

1414

Mã tiền tố biểu diễn bởi cây nhị phânMã tiền tố biểu diễn bởi cây nhị phân

HH0000 O O 0101 NN100100 GG101101 AA110110 I I 111111

OH

NI

G A

10

1

1

1

1

0

00

0

HONGHAIHONGHAI00 01 100 101 00 110 11100 01 100 101 00 110 111

Page 15: Chg4 tham lam

1515

4.3.4.3.2.Mã tiền tố tối ưu2.Mã tiền tố tối ưu Giả sử một văn bản dùng n ký tự khác nhau Giả sử một văn bản dùng n ký tự khác nhau

c[1..n], trong đó kí tự c[i] xuất hiện k[i] lần.c[1..n], trong đó kí tự c[i] xuất hiện k[i] lần. Giả sử bộ mã tiền tố m[1..n] mã hóa kí tự c[i] Giả sử bộ mã tiền tố m[1..n] mã hóa kí tự c[i]

bằng từ mã m[i] có độ dài d[i] (bít).bằng từ mã m[i] có độ dài d[i] (bít). Tổng số bít để mã hóa toàn bộ văn bản là Tổng số bít để mã hóa toàn bộ văn bản là

n

i

idikw1

][*][

W gọi là giá của bộ mã m[1..n]W gọi là giá của bộ mã m[1..n] Bộ mã có giá nhỏ nhất được gọi là mã Bộ mã có giá nhỏ nhất được gọi là mã

tiền tố tối ưutiền tố tối ưu

Page 16: Chg4 tham lam

1616

Ví dụ: Ví dụ: DINHDANGDINHDINHDANGDINHii 11 22 33 44 55 66

Chữ cáiChữ cái AA DD GG HH II NN

Tần sốTần số 11 33 11 22 22 33

Có thể mã hóa mỗi kí tự bằng các xâu 3 Có thể mã hóa mỗi kí tự bằng các xâu 3 bít như sau:bít như sau:

A=000, D= 001, G= 010, H= 011, I= A=000, D= 001, G= 010, H= 011, I= 100, H=111. 100, H=111.

Khi đó số bít cần dùng để mã hóa toàn Khi đó số bít cần dùng để mã hóa toàn bộ xâu làbộ xâu là

12* 3 = 36 12* 3 = 36

Page 17: Chg4 tham lam

1717

Ví dụ - TiếpVí dụ - Tiếp

Một cách mã khác Một cách mã khác như saunhư sau

A = 00, G= 01, A = 00, G= 01, D=100, H=101, D=100, H=101, N=110, I = 111.N=110, I = 111.

Số bít cần dùng là:Số bít cần dùng là: 1*2+3*3+1*2+2*3+1*2+3*3+1*2+2*3+

2*3+3*3= 342*3+3*3= 34

GA

D IH N

ii 11 22 33 44 55 66

Chữ cáiChữ cái AA DD GG HH II NN

Tần sốTần số 11 33 11 22 22 33

DINHDANGDINH=100|111|110|101|DINHDANGDINH=100|111|110|101|100|00|110|01|100|111|110|101100|00|110|01|100|111|110|101

Page 18: Chg4 tham lam

1818

4.34.3.3. Giải thuật của Huffman xây dựng .3. Giải thuật của Huffman xây dựng cây biểu diễn mã tiền tố tối ưucây biểu diễn mã tiền tố tối ưu

INPUT: INPUT: Danh sách n kí tự Ch[1..n]Danh sách n kí tự Ch[1..n] Bảng tần số của n kí tự cho dưới Bảng tần số của n kí tự cho dưới

dạng mảng Count[1..n]dạng mảng Count[1..n]

OUTPUT:OUTPUT: Cây T biểu diễn mã tiền tố tối ưu của Cây T biểu diễn mã tiền tố tối ưu của

n kí tự đã chon kí tự đã cho

Page 19: Chg4 tham lam

1919

Giải thuậtGiải thuật1.1. Khởi tạoKhởi tạo: Tạo một rừng gồm n cây, có trọng số : Tạo một rừng gồm n cây, có trọng số

tại các đỉnh, mỗi cây có một nút ứng với một ký tại các đỉnh, mỗi cây có một nút ứng với một ký tự với trọng số bằng tần số của ký tự đótự với trọng số bằng tần số của ký tự đó

2.2. Lặp:Lặp:

2.1. Nếu rừng chỉ có một cây thì đó cây biểu diễn 2.1. Nếu rừng chỉ có một cây thì đó cây biểu diễn mã tiền tố tối ưu.mã tiền tố tối ưu.

2.2. Nếu rừng có nhiều hơn một cây thì chọn hai 2.2. Nếu rừng có nhiều hơn một cây thì chọn hai cây có trọng số ở gốc nhỏ nhất, hợp lại thành cây có trọng số ở gốc nhỏ nhất, hợp lại thành một cây bằng cách thêm một nút là cha của hai một cây bằng cách thêm một nút là cha của hai nút gốc của hai cây ấy, gán cho nút gốc của cây nút gốc của hai cây ấy, gán cho nút gốc của cây mới trọng số bằng tổng trọng số của hai nút mới trọng số bằng tổng trọng số của hai nút con. con.

Page 20: Chg4 tham lam

2020

Giả mã cho giải thuật HuffmanGiả mã cho giải thuật Huffman1.1. Q:= C /* C là tập các kí tự */Q:= C /* C là tập các kí tự */2.2. For i:=1 to n-1 doFor i:=1 to n-1 do3.3. New(z);New(z);4.4. x:= ExtracMin(Q) ; z.left:= x;x:= ExtracMin(Q) ; z.left:= x;5.5. y:= ExtracMin(Q) ; z.right:=y;y:= ExtracMin(Q) ; z.right:=y;6.6. f(z):=f(x)+f(y);f(z):=f(x)+f(y);7.7. Insert(Q,z)Insert(Q,z)8.8. Return ExtracMin(Q);Return ExtracMin(Q);

GHI CHÚ: GHI CHÚ: Q là hàng đợi ưu tiên theo tần số nhỏ của các kí tự.Q là hàng đợi ưu tiên theo tần số nhỏ của các kí tự.Thủ tục ExtracMin(Q) lấy phần tử có tần số nhỏ nhất Thủ tục ExtracMin(Q) lấy phần tử có tần số nhỏ nhất

của Q ra khỏi Q.của Q ra khỏi Q.Thủ tục Insert(Q,z) chèn phần tử z vào hàng đợi ưu Thủ tục Insert(Q,z) chèn phần tử z vào hàng đợi ưu

tiên Qtiên Q

Page 21: Chg4 tham lam

2121

Độ phức tạp thời gian của giải Độ phức tạp thời gian của giải thuậtthuật

Việc tạo hàng đợi ưu tiên Q dưới Việc tạo hàng đợi ưu tiên Q dưới dạng đống cực tiểu mất O(dạng đống cực tiểu mất O(nn) thời ) thời gian;gian;

Vòng lặp For gồm n-1 bướcVòng lặp For gồm n-1 bước Mỗi bước trong vòng For thực hiện Mỗi bước trong vòng For thực hiện

việc xuất phần tử nhỏ nhất và vun lại việc xuất phần tử nhỏ nhất và vun lại đống mất O(lnđống mất O(ln n n) thời gian ) thời gian

Do đó vòng For mất O(Do đó vòng For mất O(nn lg lg nn) thời ) thời giangian

Độ phức tạp thời gian là O(Độ phức tạp thời gian là O(nn lg lg nn) )

Page 22: Chg4 tham lam

2222

Ví dụ minh họa giải thuật HuffmanVí dụ minh họa giải thuật HuffmanXây dựng cây mã Huffman để mã hóa từ: Xây dựng cây mã Huffman để mã hóa từ:

DINHDANGDINHDINHDANGDINH Bảng tần số:Bảng tần số:

D

3

I

2

N

3

H

2

A

1

G

1

ii 11 22 33 44 55 66

ChCh AA DD GG HH II NN

CountCount 11 33 11 22 22 33

Page 23: Chg4 tham lam

2323

Bước Bước 11

D

3

I

2

N

3

H

2

A

1

G

1

7

2

D

3

N

3H

2

I

2

A

1

G

1

7

2

8

4

Bước Bước 22

Bước 1: Vì đã có 6 nút ta đặt cho Bước 1: Vì đã có 6 nút ta đặt cho nút mới thêm là nút sô 7, trọng số là nút mới thêm là nút sô 7, trọng số là 1+1 =21+1 =2

Bước 2: nút mới thêm là nút sô 8, Bước 2: nút mới thêm là nút sô 8, trọng số là 2+2 =4trọng số là 2+2 =4

Page 24: Chg4 tham lam

2424

Bước 3Bước 3

N

3

Bước Bước 44

I

2

A

1

G

1

7

2

8

4

D

3

H

2

9

5

D

3

H

2

9

5

N

3

I

2

A

1

G

1

7

2

8

4

10

7

Bước 3: Bước 3: nút mới thêm là nút mới thêm là nút sô 9, trọng số là 2+3 = nút sô 9, trọng số là 2+3 = 55

Bước 4: Bước 4: nút mới thêm là nút mới thêm là nút sô 10, trọng số là 3+4 = nút sô 10, trọng số là 3+4 = 77

Page 25: Chg4 tham lam

2525

Kết quảKết quả

H=00H=00D=01D=01N=10N=10A=1100A=1100G=1101G=1101I=111I=111

Bước Bước 55

D

3

H

2

9

5

N

3

I2

A1

G1

72

84

10

7

11

12

DINHDANGDINH=DINHDANGDINH=01 111 10 00 01 1100 10 1101 01 111 10 00 01 1100 10 1101 01 111 10 0001 111 10 00

Bước 5: Bước 5: nút mới thêm là nút mới thêm là nút sô 11, trọng số là 5+7 = nút sô 11, trọng số là 5+7 = 1212

Page 26: Chg4 tham lam

2626

4.34.3.4. .4. Các kỹ thuật khi cài đặt thủ Các kỹ thuật khi cài đặt thủ tục sinh bộ mã Huffmantục sinh bộ mã Huffman

Biểu diễn cây nhị phân bằng mảng thBiểu diễn cây nhị phân bằng mảng theo quan hệ con eo quan hệ con chacha..

Từ biểu diễn của cây mã, tìm từ mã tưTừ biểu diễn của cây mã, tìm từ mã tương ứng với câyơng ứng với cây

Chọn phần tử nhỏ nhất bằng Heap cựChọn phần tử nhỏ nhất bằng Heap cực tiểuc tiểu..

Lập bảng thống kê từ một văn bảnLập bảng thống kê từ một văn bản Lập bảng thống kê từ một fileLập bảng thống kê từ một file

Page 27: Chg4 tham lam

2727

Biểu diễn cây nhị phân bằng mảng Biểu diễn cây nhị phân bằng mảng theo quan hệ con theo quan hệ con cha cha

Cây mã Huffman, lúc đầu là một rừng gồm n lá, ở Cây mã Huffman, lúc đầu là một rừng gồm n lá, ở mỗi bước xây dựng cây ta hợp hai cây thành một mỗi bước xây dựng cây ta hợp hai cây thành một cây,sau n-1 bước ta chỉ còn một cây. Vì mỗi bước cây,sau n-1 bước ta chỉ còn một cây. Vì mỗi bước ta thêm một nút mới, nên tổng cộng ta thêm n-1 ta thêm một nút mới, nên tổng cộng ta thêm n-1 nút, do vậy cây Huffman cuối cùng có 2n-1 nút. nút, do vậy cây Huffman cuối cùng có 2n-1 nút. Ta dùng một mảng gồm 2n-1 phần tử để lưu cấu Ta dùng một mảng gồm 2n-1 phần tử để lưu cấu trúc cây này.trúc cây này.

Trong ví dụ đã làm với n=6, cây Huffman có 2*6-Trong ví dụ đã làm với n=6, cây Huffman có 2*6-1=11 nút, các nút đã có (là lá trong cây 1=11 nút, các nút đã có (là lá trong cây Huffman) được đánh số từ 1 đến 6, mỗi lần sinh Huffman) được đánh số từ 1 đến 6, mỗi lần sinh thêm một nút ta đánh số thứ tự tiếp theo từ 7 thêm một nút ta đánh số thứ tự tiếp theo từ 7 đến 11.đến 11.

Page 28: Chg4 tham lam

2828

Lưu trữ cấu trúc cây Huffman vào mảng Lưu trữ cấu trúc cây Huffman vào mảng HuffHuff

Ta dùng một mảng đặt tên là Ta dùng một mảng đặt tên là HuffHuff[1..11] lưu trữ [1..11] lưu trữ cấu trúc của cây.cấu trúc của cây.

Ở bước 1 trong ví dụ ta lấy hai nút số 1(A) và số Ở bước 1 trong ví dụ ta lấy hai nút số 1(A) và số 3(G), thêm nút mới là nút số 7, nút số 1(A) là con 3(G), thêm nút mới là nút số 7, nút số 1(A) là con trái của nút số 7, nút số 3(G) là con phải của nút trái của nút số 7, nút số 3(G) là con phải của nút số 7. Để ghi lại tình trạng này ta đặt số 7. Để ghi lại tình trạng này ta đặt HuffHuff[1]:= -7, [1]:= -7, HuffHuff[3]:= 7. Hai nút này cùng cha nhưng nút trái [3]:= 7. Hai nút này cùng cha nhưng nút trái ứng với giá trị âm của chỉ số nút cha, nút phải ứng với giá trị âm của chỉ số nút cha, nút phải ứng với giá trị dương. ứng với giá trị dương.

ii 11 22 33 44 55 66

ChCh AA DD GG HH II NN

CountCount 11 33 11 22 22 33

A1

G1

72

Page 29: Chg4 tham lam

2929

Xây dựng mảng HuffXây dựng mảng Huff

D3

H2

95

N3

I2

A1

G1

72

84

107

1112

ii 11 22 33 44 55 66 77 88 99 1010 1111

HuffHuff -7-7 99 77 -9-9 88 -10-10 -8-8 1010 -11-11 1111

CountCount 11 33 11 22 22 33 22 44 55 77 1212

ii 11 22 33 44 55 66

ChCh AA DD GG HH II NN

CountCount 11 33 11 22 22 33

Đồng thời với mảng Đồng thời với mảng HuffHuff ta mở ta mở rộng mảng rộng mảng CountCount ra thành 11 ra thành 11 phần tử và ghi trọng số của các phần tử và ghi trọng số của các đỉnh tương ứngđỉnh tương ứng::

Page 30: Chg4 tham lam

3030

Dựa vào mảng Huff xây dựng bộ mã Dựa vào mảng Huff xây dựng bộ mã Huffman tương ứngHuffman tương ứng

Gọi từ mã của ký tự thứ i là BiCode[i]Gọi từ mã của ký tự thứ i là BiCode[i] Chẳng hạn với i=1 ta tìm từ mã BiCo[1] như sau:Chẳng hạn với i=1 ta tìm từ mã BiCo[1] như sau: Vì Huff[1]=-7<0 nên đỉnh 1 là con trái của đỉnh 7, Vì Huff[1]=-7<0 nên đỉnh 1 là con trái của đỉnh 7,

vì thế bít tận cùng bên phải của từ mã là 0, nghĩa vì thế bít tận cùng bên phải của từ mã là 0, nghĩa là BiCode[1]=‘*0’. Tiếp theo, Huff[7]=-8<0, nên là BiCode[1]=‘*0’. Tiếp theo, Huff[7]=-8<0, nên bít thứ hai bên phải của từ mã vẫn là 0, nghiã là bít thứ hai bên phải của từ mã vẫn là 0, nghiã là BiCode[1]=‘*00’ . Tiếp theo Huff[8]:= 10>0, nên BiCode[1]=‘*00’ . Tiếp theo Huff[8]:= 10>0, nên bít thứ ba từ phải là 1, vậy từ mã là bít thứ ba từ phải là 1, vậy từ mã là Bicode[1]=‘*100’. Tiếp theo Huff[10]=11>0 nên Bicode[1]=‘*100’. Tiếp theo Huff[10]=11>0 nên bít thứ tư từ phải là 1, vậy BiCode[1]=‘*1100’. bít thứ tư từ phải là 1, vậy BiCode[1]=‘*1100’. Đến đây 11 là đỉnh gốc của cây Huffman nên quá Đến đây 11 là đỉnh gốc của cây Huffman nên quá trình dừng lại, ta có BiCode[1]=‘1100’. trình dừng lại, ta có BiCode[1]=‘1100’.

ii 11 22 33 44 55 66 77 88 99 1010 1111

HuffHuff -7-7 99 77 -9-9 88 -10-10 -8-8 1010 -11-11 1111

Page 31: Chg4 tham lam

3131

Thủ tục lập bảng mã Huffman từ mảng Thủ tục lập bảng mã Huffman từ mảng

Huff [1..2n-1]Huff [1..2n-1] Procedure Coding;Procedure Coding; BeginBegin For i:=1 to n do beginFor i:=1 to n do begin BiCode[i]:=‘’; j:=i ;BiCode[i]:=‘’; j:=i ; While j<2*n-1 do beginWhile j<2*n-1 do begin if Huff[j]>0 then if Huff[j]>0 then BiCode[i]:=‘1’+BiCode[i] BiCode[i]:=‘1’+BiCode[i] else BiCode[i]:=‘0’+BiCode[i] ; else BiCode[i]:=‘0’+BiCode[i] ; j:=abs(Huff[j]) ;j:=abs(Huff[j]) ; end; end; end;end; End;End;

Page 32: Chg4 tham lam

3232

Chọn phần tử nhỏ nhất nhờ Chọn phần tử nhỏ nhất nhờ đống (HEAP) cực tiểuđống (HEAP) cực tiểu

Trong giải thuật Huffman, ở mỗi bước ta chọn ra Trong giải thuật Huffman, ở mỗi bước ta chọn ra hai cây con có trọng số ở gốc nhỏ nhất để hợp lại hai cây con có trọng số ở gốc nhỏ nhất để hợp lại thành một cây. Nếu chọn theo phương pháp bình thành một cây. Nếu chọn theo phương pháp bình thường nhất n phép so sánh, do đó riêng việc chọn thường nhất n phép so sánh, do đó riêng việc chọn phần tử nhỏ nhất mất:phần tử nhỏ nhất mất:

n+2(n-1)+2(n-1)+2(n-3)+..+2.2+2=n+2(n-1)+2(n-1)+2(n-3)+..+2.2+2=

n+(n-1)(n-2)/2 = O(nn+(n-1)(n-2)/2 = O(n22) phép so sánh.) phép so sánh. Để giảm độ phức tạp tính toán ta xây dựng một Để giảm độ phức tạp tính toán ta xây dựng một

hàng đợi có ưu tiên bằng cấu trúc đống (HEAP) cực hàng đợi có ưu tiên bằng cấu trúc đống (HEAP) cực tiểu (đống có trọng số mỗi nút không lớn hơn trọng tiểu (đống có trọng số mỗi nút không lớn hơn trọng số các con của nút ấy)số các con của nút ấy)

Page 33: Chg4 tham lam

3333

Tao một đống Tao một đống cực tiểucực tiểu

Từ cây theo thứ tự Từ cây theo thứ tự tự nhiên bên trái, tự nhiên bên trái, vun thành đống vun thành đống cực tiểu bên phảicực tiểu bên phải

ii 11 22 33 44 55 66

ChCh AA DD GG HH II NN

CountCount 11 33 11 22 22 33

1A

3D

1G

2H

2I

2N

1A

2H

1G

3D

2I

2N

Page 34: Chg4 tham lam

3434

Khai báo một mảng Heap[1..nKhai báo một mảng Heap[1..n]]Thủ tục vun lại đống tại đỉnh k, với Heap có h phần Thủ tục vun lại đống tại đỉnh k, với Heap có h phần

tửtử Procedure DownHeap(k,h);Procedure DownHeap(k,h); v:=Heap(k); w=Count[j]; i:=k;v:=Heap(k); w=Count[j]; i:=k; while 2*i<= h do while 2*i<= h do begin j:=2*i;begin j:=2*i; if j<n and Count[j] > Count[j+1] then j:=j+1;if j<n and Count[j] > Count[j+1] then j:=j+1; if v> Count[j] then Heap[i]:= Heap[j] else break ;if v> Count[j] then Heap[i]:= Heap[j] else break ; i:= j i:= j end;end; Heap(i):=v; Heap(i):=v; Thủ tục tạo đốngThủ tục tạo đống Procedure MakeHeap;Procedure MakeHeap; For i:=1 to n do Heap[i]:=i;For i:=1 to n do Heap[i]:=i; For k:=int(n/2) down to 1 do DownHeap(k,n);For k:=int(n/2) down to 1 do DownHeap(k,n);

Mã để tạo một đống cực tiểuMã để tạo một đống cực tiểu

Page 35: Chg4 tham lam

3535

Mã xây dựng cây Huffman Mã xây dựng cây Huffman lưu trữ vào mảnglưu trữ vào mảng HuffHuff

Khai báo mảng Huff[1..2*n+1];Khai báo mảng Huff[1..2*n+1]; Procedure MakeHuff;Procedure MakeHuff; BeginBegin h:= n; m:=nh:= n; m:=n While h>0 do beginWhile h>0 do begin m1:=Heap[1]; Heap[1]:=Heap[h]; h:=h-1m1:=Heap[1]; Heap[1]:=Heap[h]; h:=h-1 DownHeap(1,h); m2:=Heap[1];DownHeap(1,h); m2:=Heap[1]; m:=m+1;m:=m+1; Huff[m1]:=-m ; Huff[m2]:= m; Huff[m1]:=-m ; Huff[m2]:= m; Count[m]:=Count[m1]+Count[m2];Count[m]:=Count[m1]+Count[m2]; Heap[1]:=m; DownHeap(1, h);Heap[1]:=m; DownHeap(1, h); end;end; End;End;

Page 36: Chg4 tham lam

3636

HẾT CHƯƠNGHẾT CHƯƠNG

[email protected]@yahoo.com.vn

[email protected]@yahoo.com.vn