Tải bản đầy đủ (.doc) (46 trang)

Tiểu luận môn học THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN PHƯƠNG PHÁP THAM LAM

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (493.73 KB, 46 trang )

Thuật toán tham lam
ĐẠI HỌC HUẾ
TRƯỜNG ĐẠI HỌC KHOA HỌC
o0o
TIỂU LUẬN MÔN HỌC
THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN
Đề tài:
PHƯƠNG PHÁP THAM LAM
Thầy giáo hướng dẫn: TS. Hoàng Quang
Nhóm học viên thực hiện:
1. Võ Thị Ngọc Huệ
2. Lê Thị Nha Trang
3. Phạm Văn Trung
4. Trần Thanh Vũ
Lớp Cao học Khoa Học Máy Tính – Khóa 2014
Trang 1
Thuật toán tham lam
LỜI NÓI ĐẦU
Giải thuật cho những bài toán tối ưu thường đi qua một số bước, với một tập hợp các
chọn lựa tại mỗi bước. Với nhiều bài toán tối ưu hoá có thể sử dụng phương pháp đơn
giản và hiệu quả hơn phương pháp qui hoạch động. Phương pháp tham lam luôn chọn
phương án tốt nhất vào thời điểm hiện tại. Nó chọn tối ưu cục bộ với hy vọng rằng lựa
chọn này sẽ dẫn đến một kết quả tối ưu toàn cục. Trong chương này sẽ chỉ ra

những bài
toán tối ưu mà có thể được giải quyết bằng phương pháp tham lam. Trước khi đọc
chương này chúng ta nên đọc kỹ về phần quy hoạch động.
Phương pháp tham lam không phải luôn mang lại các kết quả tối ưu, nhưng có nhiều
bài toán nó có thể giải quyết được. Trong khuôn khổ đề tài này, nhóm chúng tôi xin đưa
ra các phần như sau:
- Phần 1: giới thiệu bài toán chọn hoạt động, đối với vấn đề này thì phương pháp tham


lam là hiệu quả để đưa ra kết quả. Ta sẽ đi đến một phương pháp tham lam bởi việc
xét đến đầu tiên là một giải pháp quy hoạch động và sau đó chỉ ra rằng ta có thể luôn
đưa ra những lựa chọn tham lam để đi đến một kết quả tối ưu.
- Phần 2 nhắc lại những yếu tố cơ bản của phương pháp tham lam, đưa ra một một cách
tiếp cận trực tiêp hơn để chứng minh phương pháp

tham lam đúng hơn dựa trên quy
hoạch động đã đề cập ở phần 1.
- Phần 3 giới thiệu một ứng dụng quan trọng của kỹ thuật tham lam: một mô hình của
các chuẩn nén dữ liệu.
Trang 2
Thuật toán tham lam
- Phần 4 ta nghiên cứu kỹ một số lý thuyết tổng hợp cơ sở được gọi là "matroids" mà
đối với vấn đề này phương pháp tham lam luôn đưa ra kết quả tối ưu.
- Phần 5 minh hoạ ứng dụng của việc sử dụng maitroids trong một bài toán lập lịch làm
việc với thời hạn cuối cùng và số tiền phạt.
Phương pháp tham lam là khá mạnh và làm việc tốt với nhiều bài toán. Những
chương sau sẽ giới thiệu nhiều phương pháp mà có thể được xem như các ứng dựng của
phương pháp tham lam, bao gồm các giải thuật cây khung nhỏ nhất, thuật toán Dijktra về
tìm đường đi ngắn nhất xuất phát từ một đỉnh và thuật toán heuristic phủ tập hợp tham
lam của Chvátal . Thuật toán cây khung nhỏ nhất là một ví dụ cổ điển của phương pháp
tham lam.
Mặc dù nội dung của tiểu luận được dịch từ Chương 16 trong cuốn Introdution To
Algorithms, đây là một cuốn sách được viết khá công phu và kỹ lưỡng của nhóm tác giả
Thomas H. Cormen, Charles E. Leiserson và Ronald L. Rivest. Tuy nhiên, vì thời gian
thực hiện tiểu luận có hạn, đồng thời còn nhiều hạn chế trong vấn đề ngôn ngữ, nên chắc
chắn tiểu luận sẽ có nhiều sai sót. Rất mong sự góp ý của Thầy và các bạn lớp Cao học
ngành Khoa Học Máy Tính khóa 2007 để chúng tôi hoàn chỉnh tiểu luận.
Xin chân thành cảm ơn TS. Hoàng Quang đã tận tụy giúp đỡ chúng tôi hoàn thành
tiểu luận này.

Trang 3
Thuật toán tham lam
MỤC LỤC
LỜI NÓI ĐẦU 2
MỤC LỤC 4
PHẦN 1: BÀI TOÁN CHỌN HOẠT ĐỘNG 5
1.1.Giới thiệu bài toán 5
1.2. Cấu trúc con tối ưu của bài toán chọn hoạt động: 6
1.3. Giải pháp đệ quy: 8
1.4. Biến đổi một giải pháp quy hoạch động thành một giải pháp tham lam: 8
1.5. Giải pháp tham lam đệ quy 10
1.6. Giải pháp tham lam lặp: 11
1.7. Các bài tập liên quan: 14
PHẦN 2: CÁC THÀNH PHẦN CỦA CHIẾN LƯỢC THAM LAM 16
2.1. Tính lựa chọn tham lam: 17
2.2. Cấu trúc con tối ưu 18
2.3. Thuật toán tham lam mâu thuẫn với quy hoạch động 19
2.4. Các bài tập liên quan: 21
PHẦN 3: CÁC MÃ HUFFMAN 23
3.1. Mã tiền tố: 23
3.2. Xây dựng mã Huffman: 25
3.3. Tính đúng đắn của giải thuật Huffman 27
3.4. Các bài tập liên quan: 30
PHẦN 4: CƠ SỞ LÝ THUYẾT CỦA PHƯƠNG PHÁP THAM LAM 32
4.1. Matroid: 32
4.2. Giải thuật tham lam trên một matroid trọng số 34
4.3. Các bài tập liên quan: 38
PHẦN 5: BÀI TOÁN LẬP LỊCH LÀM VIỆC 39
5.1. Bổ đề 16.12 40
5.2. Định lý 16.13 41

5.3. Các bài tập liên quan: 42
CÁC BÀI TẬP TỔNG HỢP 43
CÁC CHÚ Ý TRONG ĐỀ TÀI 46
Trang 4
Thuật toán tham lam
PHẦN 1: BÀI TOÁN CHỌN HOẠT ĐỘNG
1.1. Giới thiệu bài toán
Bài toán sắp xếp lịch cho nhiều hoạt động với ý nghĩa để có thể sử dụng chung một tài
nguyên (mỗi thời điểm chỉ có một hoạt động sử dụng tài nguyên chung), với mục tiêu là
sắp xếp sao càng có nhiều hoạt động tương thích sử dụng tài nguyên càng tốt.
Giả sử ta có một tập hợp S = {a
1,
a
2,
a
n
} là tập các hoạt động muốn sử dụng tài nguyên,
ví dụ một hội trường, chỉ mỗi một hoạt động tại mỗi thời điểm. Mỗi hoạt động a
i
sẽ có
thời điểm bắt đầu là s
i
và thời điểm kết thúc là f
i,
với điều kiện 0 ≤ s
i
< f
i
< ∞. Nếu


hoạt
động a
i
được

chọn, thì nó sẽ độc chiếm tài nguyên trong khoảng thời gian [s
i,
f
i
). Hoạt
động a
i
và a
j
được

gọi là tương thích lẫn nhau nếu như khoảng thời gian [s
i,
f
i
) và [a
j,
f
j
) là
không giao nhau (Ví dụ a
i
và a
j
là tương thích nếu s

i
≥ f
j
hoặc s
j
≥ f
i
). Trong bài toán

chọn
hoạt động ta phải chọn tập con lớn nhất của các hoạt động tương thích lẫn nhau. Chẳng
hạn, xem tập S của các hoạt động sau, mà ta có thể sắp xếp tăng dần theo thời điểm kết
thúc.
i 1 2 3 4 5 6 7 8 9 10 11
S
i
1 3 0 5 3 5 6 8 8 2 12
F
i
4 5 6 7 8 9 10 11 12 13 14
Ta sẽ thấy một cách ngắn gọn là tại sao nó thuận lợi để xem xét các hoạt động trong
trình tự sắp xếp. Chẳng hạn như, một tập con {a
3,
a
9,
a
11
} bao gồm những hoạt động tương
thích lẫn nhau. Nó không phải là tập con lớn nhất, vì một tập con {a
1

, a
4,
a
8
, a
11
} là lớn
hơn. Thật ra {a
1
, a
4,
a
8
, a
11
} là tập con lớn nhất của các hoạt động tương thích lẫn nhau;
một tập con lớn nhất khác là {a
2
, a
4,
a
9
, a
11
}.
Ta sẽ giải quyết bài toán này trong một vài bước. Ta bắt đầu bởi việc đưa ra công thức
của giải pháp quy hoạch động đối với bài toán này trong đó ta tổng hợp các giải pháp tối
ưu đối với hai bài toán con để thiết lập giải pháp tối ưu của bài toán gốc. Ta có các lựa
chọn khi quyết định các bài toán để sử dụng trong một giải pháp tối ưu. Sau đó, ta sẽ
nhận thấy rằng ta chỉ cần một lựa chọn duy nhất - lựa chọn tham lam - và sau khi ta lựa

chọn chỉ còn một bài toán con, một bài toán con còn lại sẽ rỗng. Dựa trên những nhận xét
này, ta sẽ xây dựng một giải thuật tham lam đệ quy để giải quyết bài toán lập lịch hoạt
Trang 5
Thuật toán tham lam
động. Ta sẽ hoàn thành quá trình xây dựng giải thuật tham lam bởi việc biến đổi giải
thuật đệ quy sang giải thuật lặp. Mặc dù những bước ta thực hiện trong phần này thể hiện
mối liên quan nhiều hơn là tiêu biểu cho sự phát triển của phương pháp tham lam, chúng
minh hoạ cho mối quan hệ của phương pháp tham lam và quy hoạch động.
1.2. Cấu trúc con tối ưu của bài toán chọn hoạt động:
Như đã đề cập ở trên, ta bắt đầu bằng phương quy hoạch động để giải quyết bài toán
lựa chọn hoạt động. Như ở chương 15, bước đầu tiên là tìm ra cấu trúc con tối ưu và sau
đó sử dụng nó để xây dựng một giải pháp tối ưu cho bài toán từ các giải pháp tối ưu cho
các bài toán con.
Ta nhận thấy rằng ở chương 15 ta cần định nghĩa một không gian thích hợp của bài
toán con. Ta hãy bắt đầu bằng việc định nghĩa các tập hợp:
S
ij
= {a
k
∈S : f
i
≤ s
k
<

f
k
≤ s
j
}

Sao cho S
ij
là một tập con của các hoạt động trong tập S mà có thể bắt đầu sau khi
hoạt động a
i
kết thúc và kết thúc trước hoạt động a
j
bắt đầu. Thật ra, S
ij
chứa tất cả các
hoạt động tương thích với a
i
và a
j
và cũng tương thích với tất cả các hoạt động hoàn thành
không trễ hơn a
i
và tất cả các hoạt động bắt đầu không sớm hơn a
j
bắt đầu. Để thuận tiện
trong việc biểu diễn bài toán, không mất tính tổng quát, ta thêm vào những hoạt động giả
sử a
0
và a
n+1
với qui ước rằng f
0
= 0 và S
n+1
= ∞. Sau đó S = S

0.n+1
, và phạm vi của i và j
được cho bởi 0 ≤

i, j ≤n+1.
Ta có thể giới hạn hơn nữa

phạm vi của i và j như sau. Giả sử rằng các hoạt động đó
được sắp xếp theo một thứ tự

tăng dần của thời điểm kết thúc:
f
0
≤ f
1
≤ f
2
≤ ≤f
n
≤ f
n+1
.

(16.1)
Ta dễ dàng thấy rằng S
ij
= Ø với i ≥ j. Tại sao? Giả sử rằng tồn tại hoạt động a
k

S

ij
sao cho i ≥ j, vì vậy a
i
kế tiếp a
j
trong thứ tự sắp xếp. Sau đó ta sẽ có
f
i
≤ s
k
< f
k
≤ s
j
< f
j
. Vì vậy, f
i
< f
j,
điều này mâu thuẫn với giả thiết rằng

a
i
kế tiếp a
j
trong thứ
tự sắp xếp. Ta có thể kết luận rằng,

ta sắp xếp các hoạt động theo thứ tự tăng dần của thời

điểm kết thúc, phạm vi

của các

bài toán con của ta là chọn một tập con cực đại của các
hoạt động tương thích lẫn nhau từ S
ij
với

0 ≤

i

< j

≤ n+1, biết rằng tất cả các S
ij
khác là đều
rỗng.
Trang 6
Thuật toán tham lam
Để nhận ra

được cấu trúc con của bài toán chọn hoạt động,

ta xét một bài toán con
khác rỗng S
ij
, và giả sử rằng một giải pháp đối với S
ij

tồn tại một hoạt động a
k,


f
i
≤ s
k
<
f
k
≤ s
j.
Việc chọn hoạt động a
k
sẽ phát sinh ra hai bài toán con, S
ik
(những hoạt động mà
bắt đầu sau khi a
i
kết thúc và kết thúc trước khi a
k
bắt đầu) và S
kj
(những hoạt động mà bắt
đầu sau khi a
k
kết thúc và kết thúc trước khi a
j
bắt đầu), mỗi hoạt đó bao gồm một tập con

của các hoạt động trong S
ij
. Giải pháp của ta đối với bài toán S
ij
là tổng hợp hai giải pháp
cho hai bài toán con S
ik
và S
kj,
ứng với hoạt động

a
k
. Vì vậy số các hoạt động trong giải
pháp đối với S
ij
của ta là kích thước của bài toán S
ik
, cộng với kích thước của bài toán

S
kj
,
cộng với một (cho a
k
).
Cấu trúc con

tối ưu của bài toán này là như sau. Nếu A
ij

là giải pháp tối ưu cho bài
toán có chứa các hoạt động a
k.
Thì giải pháp

A
ik
cho S
ik
và A
kj
cho S
kj
được sử dụng trong
S
ij
cũng tối ưu. Lý luận cắt và dán thông thường áp dụng. Thật vậy, nếu tồn tại một giải
pháp A'
ik
cho S
ik
chứa

nhiều hoạt động hơn A
ik
, ta có thể thay A
ik
bởi A'
ik
trong


A
ij
, ta sẽ tìm
ra một giải pháp khác đối với S
ij


nhiều hoạt động hơn A
ij
. Điều này trái với giả thiết ta
co rằng A
ij
là giải pháp tối ưu đối với S
ij
. Tương tự, nếu ta có một giải pháp A'
kj
đối với S
kj
với nhiều hoạt động hơn A
kj
, ta có thể thay thế A
kj
bởi A'
kj
để đưa ra một giải pháp cho S
ij
với nhiều hoạt động hơn A
ij
.

Bây giờ ta sử dụng cấu trúc con tối ưu để chỉ ra rằng có thể xây dựng một giải pháp
tối ưu cho bài toán từ những giải pháp tối ưu đối với những bài toán con. Ta đã thấy rằng
giải pháp nào đó cho bài toán con khác rỗng S
ij
có chứa hoạt động a
k
, và giải pháp tối ưu
bất kỳ đó chứa trong nó những giải pháp tối ưu đối với bài toán con S
ik
và S
kj
. Vì vậy, ta
có thể xây dựng một tập con cực đại của những hoạt động tương thích lẫn nhau trong S
ij
bởi việc phân chia bài toán thành hai bài toán con (tìm tập con lớn nhất của các hoạt động
tương thích lẫn nhau trong S
ik
và S
kj
), tìm ra những tập con lớn nhất A
ik
và A
kj
của những
hoạt động tương thích lẫn nhau đối với những bài toán con này, và thành lập tập con lớn
nhất

A
ij
của các hoạt động tương thích lẫn nhau như:

A
ij
= A
ik
U {a
k
} U A
kj
(16.2)
Giải pháp tối ưu cho bài toán chính là giải pháp cho S
0,n+1.
Trang 7
Thuật toán tham lam
1.3. Giải pháp đệ quy:
Bước thứ hai trong việc phát triển giải pháp quy hoạch động là định nghĩa một cách
đệ quy giá trị của giải pháp tối ưu. Đối với những bài toán chọn hoạt động, gọi c[i,j] là số
các hoạt động trong tập con lớn nhất chứa các hoạt động tương thích lẫn nhau trong S
ij
.
Ta có c[i,j] = 0 khi S
ij
= Ø, hoặc c[i,j] = 0 khi i ≥ j.
Xét một tập con S
ij
khác rỗng. Như ta đã thấy, nếu a
k
được sử dụng trong tập con lớn
nhất các hoạt động tương thích lẫn nhau của S
ij
, Ta cũng sử dụng các tập con lớn nhất của

các hoạt động tương thích lẫn nhau cho các bài toán con S
ik
và S
kj.
Dùng công thức (16.2),
ta có công thức c[i,j] = c[i,k] + c[k,j] + 1.
Công thức đệ quy này cho thấy rằng ta biết giá trị của k, mà ta không biết. Ta có i-j-1
giá trị có thể chấp nhận cho k, cụ thể là k = i+1, , j-1. Vì tập con lớn nhất của S
ij
phải
dùng một trong những giá trị này của k, ta phải kiểm tra tất cả chúng để tìm ra giá trị tốt
nhất. Vì vậy công thức đệ quy đầy đủ của c[i,j]

trở thành:
(16.3)
1.4. Biến đổi một giải pháp quy hoạch động thành một giải pháp tham lam:
Tại điểm này, nó sẽ là một bài tập dễ hiểu lập một cái bảng, từ dưới lên, thuật toán
quy hoạch động dựa trên công thức (16.3). Thực ra, bài tập 16.1-1 yêu cầu bạn thực hiện
điều này. Có hai sự xác định then chốt, tuy nhiên, điều này cho phép ta đơn giản hoá giải
pháp của ta.
a. Định lý 16.1:
Xét một bài toán con khác rỗng

S
ij
,và nếu a
m
là một hoạt động trong S
ij
có thời điểm

kết thúc sớm nhất:

f
m
= min{f
k
: a
k

S
ij
}. Thì:
1. Hoạt động a
m
được sử dụng trong một tập con lớn nhất nào đó của các hoạt động
tương thích lẫn nhau của S
ij
.
2. Bài toán con S
im
là rỗng, do đó nếu chọn a
m
thì chỉ còn duy nhất bài toán con
khác rỗng

S
mj.
Trang 8
Thuật toán tham lam
b. Chứng minh:

Ta chứng minh phần hai trước vì đơn giản hơn. Giả sử rằng S
im
là khác rỗng, do đó có
một hoạt động a
k
nào đó sao cho f
i
≤ s
k
< f
k
≤ s
m
< f
m
. Mà a
k
cũng nằm trong S
ij
và nó có
thời gian kết thúc sớm hơn a
m,
điều này mâu thuẫn với việc chọn a
m
Ta kết luận rằng S
im

rỗng.
Để chứng minh phần thứ nhất, ta giả sử rằng, A
ij

là một tập con lớn nhất của các hoạt
động tương thích lẫn nhau của S
ij,
và ta sắp xếp các hoạt động của A
ij
theo thứ tự tăng dần
của thời điểm kết thúc. Gọi a
k
là hoạt động đầu tiên trong A
ij.
Nếu

a
k
= a
m
, thì ta đã chứng
minh được, chỉ ra rằng a
m
được sử dụng trong tập con lớn nhất nào đó của các hoạt động
tương thích lẫn nhau của S
ij
. Nếu

a
k
≠ a
m
, ta


xây dựng tập con

A’
ij =
A
ij
– {a
k
} ∪ {a
m
}
.
các
hoạt động trong A’
ij
thì tách rời nhau, các hoạt động trong A
ij
thì, a
k
là hoạt động kết thúc
đầu tiên trong A
ij,
và fm ≤ fk. Chú ý rằng A’
ij
có số

hoạt động giống như A
ij,
ta thấy rằng
A’

ij
cũng là một tập con lớn nhất của các hoạt động tương thích lẫn nhau của S
ij
mà có
chứa a
m.
Tại sao định lý 16.1 có giá trị? Quay về phần 15.3 cấu trúc con tối ưu làm thay đổi
cách nhiều bài toán được sử dụng trong giải pháp tối ưu để đến bài toán gốc và trong
nhiều cách chọn ta có xác định những bài toán con để sử dụng. Trong giải pháp quy
hoạch động, hai bài toán con được sử dụng trong giải pháp tối ưu, và có j-i-1 cách chọn
khi giải quyết bài toán con S
ij.
Định lý 16.1 giảm cả số lượng lớn đáng kể này: chỉ duy
nhất một bài toán con được sử dụng trong giải pháp tối ưu (một bài toán con khác thì là
rỗng), và khi giải quyết bài toán con S
ij,
ta cần xem duy nhất một cách chọn: một cách với
thời gian kết thúc sớm nhất trong S
ij
. May mắn thay, ta có thể dễ dàng xác định đây là
hoạt động nào.
Cùng với

việc giảm số các bài toán con và số cách chọn, định lý 16.1 cung cấp một lợi
ích khác: ta có thể giải quyết mỗi bài toán con theo kiểu từ trên xuống (top-down), hơn là
kiểu từ dưới lên (bottom-up) sử dụng điển hình trong quy hoạch động. Để giải quyết bài
toán con S
ij
, ta chọn hoạt động a
m

trong S
ij
với thời gian kết thúc sớm nhất và thêm vào
giải pháp này một tập của các hoạt động dùng trong giải pháp tối ưu đối với bài toán con
S
ij
. Bởi vì ta biết rằng, có chọn a
m,
ta sẽ được sử dụng một giải pháp nào đó cho

S
mj
trong
giải pháp tối ưu của ta cho S
ij
, ta không cần giải quyết S
mj
trước việc giải quyết S
ij
. Để
Trang 9
Thuật toán tham lam
giải quyết S
ij,
ta có thể chọn a
m
trước tiên như hoạt động trong S
ij
với thời điểm kết thúc
sớm nhất và sau đó giải quyết S

mj
.
Cũng chú ý rằng có một mô hình đối với những bài toán con mà ta giải quyết. Bài
toán ban đầu của ta là S =S
0,n+1
. Giả sử rằng

chọn a
m1
là hoạt động trong S
0,n+1
với thời
điểm kết thúc sớm nhất. (Từ việc sắp xếp các hoạt động theo thứ tự thời điểm kết thúc
tăng dần và f
0
= 0,

ta phải có m
1
= 1.) Bài toán con tiếp theo là S
m1,n+1.
Bây giờ giả sử rằng
ta chọn a
m2
là hoạt động trong S
m1,n+1
với thời điểm kết thúc sớm nhất. (Nó không cần thiết
trong trường hợp m
2
= 2). Bài toán con tiếp theo là S

m2,n+1.
Tiếp theo, ta thấy rằng mỗi bài
toán con sẽ có dạng S
i
m
,n+1
cho

số hoạt động m
i
nào đó.

Tóm lại, mỗi bài toán con gồm có
các

hoạt động cuối cùng để kết thúc, và một số các hoạt động biến đổi từ bài toán con này
đến bài toán con khác.
Cũng có một mô hình đối với các hoạt động mà ta chọn. Bởi vì ta luôn luôn chọn hoạt
động với thời điểm kết thúc sớm nhất trong S
i
m
,n+1,
thời điểm kết thúc của các

hoạt động
được chọn qua tất cả các bài toán con sẽ làm

gia tăng nghiêm trọng thời gian. Tuy nhiên,
ta có thể xem như mỗi hoạt động là một toàn diện, trong việc sắp xếp tăng dần của thời
điểm kết thúc.

Hoạt động a
m
mà ta chọn khi giải quyết một bài toán con thì luôn là một hoạt động với
thời điểm kết thúc sớm nhất mà có thể được lập lịch hợp lý. Hoạt động được chọn như
vậy là chọn lựa “tham lam” trong hướng này, qua trực giác, nó để lại nhiều cơ hội có thể
cho những hoạt động còn lại để lập lịch. Đó là, lựa chọn tham lam là một cách mà cực đại
hoá số lượng đáng kể của thời gian còn lại chưa

lập

lịch.
1.5. Giải pháp tham lam đệ quy
Bây giờ ta đã thấy cách tổ chức hiệu quả giải pháp quy hoạch động, và cách xử lý nó
theo phương pháp từ trên xuống, ta xem một giải thuật mà nó hoạt động một cách thuần
tuý trong thuật toán tham lam, kiểu từ trên xuống. Dễ hiểu, một giải thuật đệ quy như là
thủ tục RECURSIVE-ACTIVITY-SELECTOR. Nó lấy thời điểm bắt đầu và kết thúc của
các hoạt động, được trình bày như các mảng s và f, xem như những chỉ số bắt đầu i và n
mà nó định nghĩa bài toán con S
i,n+1
nó là để giải quyết. (Tham số n chỉ hoạt động thực tế
cuối cùng a
n
trong bài toán con và không chỉ hoạt động không có thật a
n+1
mà nó cũng ở
Trang 10
Thuật toán tham lam
trong bài toán con). Nó trả về một tập lớn nhất của các hoạt động tương thích lẫn nhau
trong S
i,n+1

.Ta cho rằng n hoạt động đưa vào được sắp xếp theo thời điểm kết thúc tăng
dần, theo công thức (16.1). nếu không, ta có thể sắp xếp chúng theo thứ tự này với độ
phức tạp O(nlgn), phá vỡ sự ràng buộc một cách tuỳ tiện. Lời gọi ban đầu là
RECURSIVE-ACTIVITY-SELECTOR(s,f, 0, n).
RECURSIVE-ACTIVITY-SELECTOR(s,f,i,n)
1 mi+1
2 while m

n and s
m
<f
i
Tìm hoạt động đầu tiên trong S
i,n+1
3 do m m+1
4 if m<n
5 Then return {a
m
}

RECURSIVE-ACTIVITY-SELECTOR(s,f,m,n)
6 else return

Minh hoạ 16.1 chỉ ra sự thực hiện của thuật toán. Trong việc gọi đệ quy của
RECURSIVE-ACTIVITY-SELECTOR(s,f,i,n), vòng lặp while của dòng 2-3 tìm kiếm
hoạt động đầu tiên trong vòng lặp ví dụ a
i+1
, a
i+2
, …, a

n,
cho đến khi nó tím thấy hoạt động
đầu tiên a
m
mà tương thích với a
i,
một

hoạt động như vậy có S
m

f
i
. Nếu vòng lặp giới hạn
bởi

nó tìm thấy một hoạt động như vậy giải thuật quay lại dòng 5 sự kết hợp của {am} và
tập con cực đại của S
m,n+1
quay lại bởi việc gọi đệ quy RECURSIVE-ACTIVITY-
SELECTOR(s,f,m,n). Một cách lựa chọn, vòng lặp có thể giới hạn bởi m>n, trong trường
hợp này ta đã có kiểm tra tất cả các hoạt động mà không tìm thấy một hoạt động nào
tương thích với a
i
. Trong trường hợp này S
i,n+1
=

, vì vậy giải thuật sẽ trả về


ở dòng
6.
1.6. Giải pháp tham lam lặp:
Ta dễ dàng chuyển đổi giải thuật đệ quy thành giải thuật lặp. Giải thuật
RECURSIVE-ACTIVITY-SELECTOR thì hầu như “đệ qui yếu“ (xem bài toán 7-4): nó
kết thúc với lời gọi đệ quy chính nó theo một sự thực hiện kết hợp. Dễ dàng để thay đổi
một giải thuật đệ qui yếu thành giải thuật lặp, thật ra, một số trình biên dịch cho ngôn ngữ
lập trình bất kỳ thực hiện công việc này một cách tự động. Như đã được viết,
RECURSIVE-ACTIVITY-SELECTOR thực hiện cho các bài toán con S
i,n+1
…, những bài
toán con mà có các hoạt động kết thúc cuối cùng.
Trang 11
Thuật toán tham lam
Giải thuật GREEDY-ACTIVITY-SELECTOR là một phiên bản lặp của giải thuật
RECURSIVE-ACTIVITY-SELECTOR, ở đây cũng giả sử các hoạt động đầu vào được
sắp xếp theo thời điểm kết thúc tăng dần. Nó tập hợp các hoạt động được chọn vào một
tập A và quay lại tập này khi nó đã được thực hiện xong.
Trang 12
Thuật toán tham lam
Hình 16.1 Sự thực hiện của RECURSIVE-ACTIVITY-SELECTOR trong hoạt động 11
được cho sớm hơn. Các hoạt động đã được xem

trong mỗi lời đệ quy xuất hiện giữa
những đường kẻ ngang. Hoạt động không có thật a
0
kết thúc tại thời điểm 0, và trong lời
gọi ban đầu RECURSIVE-ACTIVITY-SELECTOR (s,f,0,11), hoạt động a
1
được chọn.

Trong mỗi lời gọi đệ quy, những hoạt động mà đã được chọn được tô đen, và các hoạt
động tmàu tô trắng đang được xem xét. Nếu thời gian bắt đầu của một hoạt động xảy ra
trước thời gian kêt thúc của hoạt động mới được chọn (mũi tên giữa chúng chỉ sang trái),
nó bị loại. Trái lại (mũi tên chỉ trực tiếp hay qua phải), nó được chọn. Lời gọi đệ quy
cuối cùng, RECURSIVE-ACTIVITY-SELECTOR (s, f, 0, 11) trả về Ø. Tập kết quả

của
các hoạt động được chọn là{a
1
, a
4
, a
8
, a
11
}.
GREEDY-ACTIVITY-SELECTOR(s, f)
1 n ← length[s]
2 A ← {a1}
3 i ← 1
4 for m ← 2 to n
5 do if sm ≥ fi
6 then A ← A
U
{am}
7 i ← m
8 return A
Giải thuật thực hiện như sau. Biến i đánh số các phần tử thêm vào A gần nhất, tương
ứng đối với hoạt động a
i

trong phiên bản đệ quy. Giả sử các hoạt động được sắp xếp theo
thứ tự tăng dần của thời điểm kết thúc, f
i
luôn là thời điểm kết thúc lớn nhất

của hoạt động
nào đó trong A. Điều đó là:
f
i
= max{f
k
: a
k

A}

(16.4)
Dòng 2-3 chọn hoạt động a
i,
ban đầu A chỉ chứa chỉ một hoạt động này, và khởi đầu i
là chỉ số hoạt động này. Vòng lặp for ở các dòng 4-7 tìm thấy hoạt động kết thúc sớm
nhất trong

S
i
,n+1. Vòng lặp xem xét mỗi hoạt động a
m
trong vòng lặp và thêm a
m
vào A

Trang 13
Thuật toán tham lam
nếu nó tương thích với tất cả các hoạt động được chọn trước đó. Một hoạt động như vậy
là hoạt động kết thúc sớm nhất

trong S
i
,n+1. Để thấy nếu hoạt động a
m
là tương thích với
mỗi hoạt động hiện tại trong A, nó đáp ứng bởi phương trình (16.4) để kiểm tra (dòng 5)
rằng thời điểm bắt đầu của nó S
m
thì không sớm hơn thời điểm kết thúc f
i
của hoạt động
thêm vào A gần đây nhất. nếu hoạt động a
m
tương thích, thì các dòng 6-7

thêm hoạt động
a
m
vào A và thiết lập i đến m. Tập A quay lại bởi lời gọi GREEDY-ACTIVITY-
SELECTOR(s,f) là chính xác tập được quay lại bởi lời gọi RECURSIVE-ACTIVITY-
SELECTOR(s,f, 0, n ).
Giống như phiên bản đệ quy, GREEDY-ACTIVITY-SELECTOR lập lịch một tập của
n hoạt động với độ phức tạp là O(n) thời gian, giả sử rằng các hoạt động ban đầu đã được
sắp xếp


theo thời điểm kết thúc của chúng.
1.7. Các bài tập liên quan:
Bài 1: Đưa ra thuật toán quy hoạch động cho bài toán chọn hoạt động, dựa trên công thức
(16.3). Có thuật toán của bạn tính toán kích cỡ c[i,j] như định nghĩa trên và cũng đưa ra
tập con lớn nhất A của các hoạt động. Giả sử rằng các giá trị vào đã được sắp xếp theo
công thức (16.1). So sánh thời gian thực hiện giải thuật của bạn với thời gian thực hiện
của GREEDY-ACTIVITY-SELECTOR.
Bài 2: Giả sử rằng thay vì luôn luôn chọn hoạt động

kết thúc đầu tiên, ta thay thế chọn
hoạt động cuối cùng để bắt đầu mà nó tương thích với tất cả các hoạt động được chọn
trước đó. Mô tả cách thực hiện này là thuật toán tham lam, và chứng tỏ rằng nó sinh ra
một giải pháp tối ưu.
Bài 3: Giả sử ta có một tập của các hoạt động để lập lịch trong một số luợng lớn của các
hội trường. Ta lập lịch tất cả các

hoạt động sử dụng các hội trường càng ít càng tốt. Nêu
ra thuật toán tham lam hiệu quả để xác định hoạt động nào sẽ sử dụng hội trường nào.
(Điều này cũng được gọi là bài toán tô màu đồ thị quãng. Ta có thể tạo ra một đồ thị
quãng mà các đỉnh của nó là các hoạt đông đã cho và

các cạnh của nó nối với các hoạt
động không tương thích. Số lượng màu nhỏ nhất cần có để tô màu mọi đỉnh sao cho
không có hai đỉnh liền kề được tô cùng màu giống nhau sẽ tương ứng với việc tìm số
phòng ít nhất cần có để lập lịch cho tất cả các hoạt động đã cho).
Trang 14
Thuật toán tham lam
Bài 4: Không phải bất kỳ cách tiếp cận giải pháp tham lam nào cho bài toán chọn hoạt
động cũng đều tạo ra một tập lớn nhất của các hoạt động tương thích lẫn nhau. Hãy nêu
một ví dụ để chứng tỏ không thể dùng cách tiếp cận lựa chọn hoạt động với thời gian nhỏ

nhất trong số các hoạt động tương thích với các hoạt động đã lựa chọn trước đó. Làm
tương tự

với cách tiếp cận luôn lựa chọn hoạt động tương thích mà lấn lên những hoạt
động còn lại khác ít nhất và luôn luôn lựa chọn hoạt động còn lại với thời điểm bắt đầu
sớm nhất.
Trang 15
Thuật toán tham lam
PHẦN 2: CÁC THÀNH PHẦN CỦA CHIẾN LƯỢC THAM LAM
Thuật toán tham lam có được một giải pháp tối ưu cho một bài toán bằng cách thực
hiện một chuỗi các lựa chọn. Đối với mỗi quyết định chỉ ra trong thuật toán, sự lựa chọn
này dường như tốt nhất tại thời điểm được chọn. Chiến lược phỏng đoán này không luôn
tạo ra giải pháp tối ưu, nhưng như ta đã thấy trong bài toán

chọn hoạt động, thỉnh thoảng
nó giải quyết được. Phần này thảo luận một số tính chất tổng quát của phương pháp tham
lam.
Quy trình mà ta đã thực hiện trong phần 16.1 để phát triển thuật toán tham lam là bao
hàm nhiều hơn là điển hình. Ta đi qua từng bước như sau:
1. Xác định cấu trúc bên trong tối ưu của bài toán.
2. Xây dựng một giải pháp đệ quy.
3. Chứng minh rằng tại mỗi bước của giải thuật đệ quy, lựa chọn tham lam là một
trong những lựa chọn sẽ dẫn đến kết quả tối ưu.
4. Chỉ ra rằng sau mỗi lần chọn tham lam thì một trong những bài toán con sẽ rỗng.
5. Xây dựng giải thuật đệ quy cho chiến lược tham lam.
6. Biến đổi giải thuật đệ quy thành giải thuật lặp.
Qua các bước này, ta đã thấy chi tiết cơ bản nguồn gốc quy hoạch động của thuật toán
tham lam. Trong thực tế, tuy nhiên, ta thường tổ chức hiệu quả các bước trên khi thiết kế
giải thuật tham lam. Ta phát triển cấu trúc con với một cái nhìn hướng đến thực hiện lựa
chọn tham lam mà để lại một bài toán con được giải quyết một cách tối ưu. Ví dụ, trong

bài toán chọn hoạt động, ta trước tiên định nghĩa bài toán con S
ij
, mà cả hai i và j khác
nhau. Ta đã thấy rằng nếu ta luôn thực hiện lựa chọn tham lam, ta có thể giới hạn các bài
toán con được thành lập bởi S
i,n+1
Như một sự lựa chọn, ta có thể tạo nên cấu trúc con tối ưu với một lựa chọn tham lam
có nghĩa. Điều đó là, ta có thể bỏ qua chỉ số dưới thứ hai và định nghĩa các bài toán con
của công thức S
i
= {a
k

S : f
i
≤ S
k
}. Sau đó, ta có thể chứng minh rằng một lựa chọn tham
lam (hoạt động đầu tiên a
m
để kết thúc S
i
), kết hợp với một giải pháp tối ưu để đi đến tập
Trang 16
Thuật toán tham lam
còn lại S
m
của các hoạt động tương thích, mang lại một giải pháp tối ưu đối với S
i
. Tổng

quát hơn, ta thiết kế thuật toán tham lam theo chuỗi các bước:
1. Tìm lựa chọn sao cho bước tiếp theo chỉ việc giải quyết một bài toán con
2. Chứng minh rằng

với sự lựa chọn tham lam tại mỗi bước ta luôn tìm được một giải
pháp tối ưu của bài toán ban đầu.
3. Chỉ ra rằng, với sự lựa chọn tham lam tại mỗi bước, giải pháp tối ưu của bài toán
con còn lại kết hợp với

sự lựa chọn tham lam này sẽ đi đến một giải pháp tối ưu
cho bài toán ban đầu.
Ta sẽ sử dụng điều này nhiều hơn nhằm xử lý trong những phần sau của chương này.
Tuy nhiên, dưới mỗi thuật toán tham lam,

hầu như luôn có một giải thuật quy hoạch động
cồng kềnh.
Có thể nói một cách như thế nào nếu một giải thuật tham lam sẽ giải quyết được một
bài toán tối ưu riêng biệt? Không có cách tổng quát, nhưng chiến lược lựa chọn tham lam
và cấu trúc con tối ưu là hai thành phần then chốt. Nếu ta có thể chứng minh rằng bài
toán có các thuộc tính

này, sau đó ta thuận lợi trong cách xây dựng một thuật toán tham
lam cho nó.


2.1. Tính lựa chọn tham lam:
Thành phần then chốt trước tiên là tính lựa chọn tham lam: một giải pháp tôi ưu toàn
cục có thể đạt được bằng cách lựa chọn tối ưu cục bộ (tham lam). Nói một cách khác, khi
có nhiều sự lựa chọn thì ta lựa chọn phương án nào tốt nhất ở hiện tại trong bài toán hiện
tại, mà không cần quan tâm đến kết quả các bài toán con của nó.

Đây là chỗ khác nhau giữa các thuật toán tham lam và quy hoạch động. Trong quy
hoạch động tại mỗi bước ta thực hiện một lựa chọn, nhưng sự lựa chọn phụ thuộc vào các
giải pháp cho các bài toán con. Do đó, ta giải quyết một cách tiêu biểu các bài toán quy
hoạch động theo kiểu từ dưới lên, nghĩa là lần lượt xử lý những bài toán con nhỏ hơn đến
những bài toán con lớn hơn. Trong giải thuật tham lam, ta thực hiện cách chọn bất kỳ
dường như tốt nhất ngay lập tức và sau đó giải quyết bài toán con xuất hiện sau khi lựa
chọn được thực hiện. Lựa chọn được thực hiện bởi một thuật toán tham lam có lẽ phụ
thuộc vào các lựa chọn cho đến giờ, nhưng nó không thể phụ thuộc vào những lựa chọn
Trang 17
Thuật toán tham lam
bất kỳ trong tương lai hay những giải pháp cho các bài toán con. Vì vậy, không giống
quy hoạch động, nó giải quyết các bài toán con từ dưới lên, một chiến lược tham lam
thường giải quyết theo kiểu từ trên xuống, thực hiện một lựa chọn tham lam sau một chọn
lựa khác, liên tục rút gọn từng trường hợp bài toán đã cho thành một bài toán nhỏ hơn.
Dĩ nhiên, ta phải chứng minh rằng một lựa chọn tham lam tại mỗi bước đưa ra một
giải pháp tối ưu toàn cục, và đây là nơi cần có sự thông minh. Điển hình, như trong
trường hợp của định lý 16.1, sự chứng minh kiểm tra một giải thuật tối ưu toàn cục đối
với một bài toán con nào đó. Rồi nó chỉ ra rằng giải thuật có thể được sửa đổi để sử dụng
lựa chọn tham lam, kết quả trong một bài toán tương tự nhưng bài toán con nhỏ hơn.
Thuộc tính lựa chọn tham lam thường đạt được hiệu lực trong việc thực hiện lựa chọn
của ta trong bài toán con. Ví dụ, trong bài toán chọn hoạt động, giả sử rằng ta có các hoạt
động được sắp xếp sẵn theo thứ tự tăng dần của thời điểm kết thúc, ta cần kiểm tra mỗi
một hoạt động. Nó thường là trường hợp mà được xử lý trước khi đưa vào hay sử dụng
một cấu trúc dữ liệu thích hợp (thường một hàng đợi ưu thế), ta có thể thực hiện các lựa
chọn tham lam nhanh chóng, vì vậy đưa ra một thuật toán hiệu quả.
2.2. Cấu trúc con tối ưu
Một bài toán có cấu trúc con tối ưu nếu giải pháp tối ưu cho bài toán này

chứa trong
nó các giải pháp tối ưu cho các bài toán con. Thuộc tính này là điểm để quyết định ta có

thể giải quyết bài toán bằng phương pháp quy hoạch động cũng như tham lam được hay
không. Như một ví dụ của cấu trúc con tối ưu, quay về cách ta chứng minh trong phần
16.1 rằng nếu một giải pháp tối ưu đối với bài toán con S
ij
có chứa một hoạt động a
k,
sau
đó nó cũng phải chứa các giải pháp tối ưu đối với các bài toán S
ik
và S
kj
. Cấu trúc con tối
ưu này được đưa ra, ta nói rằng nếu biết hoạt động nào sử dụng như a
k
, ta có thể xây
dựng một giải pháp tối ưu đối với S
ij
bằng việc lựa chọn cùng với tất cả hoạt động của
các giải pháp tối ưu đối với các bài toán con S
ik
và S
kj.
Dựa trên sự quan sát này của cấu
trúc con tối ưu, ta có thể đưa ra công thức đệ quy (16.3) mà nó định rõ giá trị của một giải
pháp tối ưu.
Ta thường sử dụng thêm cấu trúc con tối ưu gần như trực tiếp, khi áp dụng nó đối với
các giải thuật tham lam. Như sự chú ý ở trên, ta không cần thiết cho rằng

đi


đến một bài
toán con bằng cách thực hiện

lựa chọn tham lam trong bài toán tối ưu. Tất cả ta thật sự
Trang 18
Thuật toán tham lam
cần làm

là cho rằng một giải pháp tối ưu đối với bài toán con, kết hợp với lựa chọn tham
lam vừa được thực hiện, mang lại một giải pháp tối ưu đối với bài toán ban đầu. Sự phối
hợp hoàn toàn sử dụng phương pháp quy nạp đối với

các bài toán con để chứng mỉnh
rằng việc sử dụng lựa chọn tham lam tại mỗi bước tạo ra một giải pháp tối ưu.
2.3. Thuật toán tham lam mâu thuẫn với quy hoạch động
Bởi vì thuộc tính cấu trúc con tối ưu được khai thác cả trong chiến lược tham lam và
quy hoạch động. Một mặt ta có thể có khuynh hướng phát sinh một giải thuật quy hoạch
động cho một bài toán khi chỉ một giải thuật tham lam là đủ, hoặc ta có thể lầm lẫn khi
nghĩ rằng giải thuật tham lam sẽ làm việc khi thực tế lại cần một giải pháp quy hoạch
động. Minh hoạ cho sự tinh tế giữa hai phương pháp, ta hãy khám phá hai biến thể của
một bài toán tối ưu hoá cổ điển.
Bài toán chiếc ba lô 0-1

được đưa ra như sau. Một tên trộm lấy trộm tại một cửa hiệu
với n đồ vật, đồ vật thứ i có giá trị v
i
dollar và có trọng lượng w
i
pound, v
i

và w
i
là các số
nguyên. Hắn ta muốn lấy một tải trọng càng có giá trị càng tốt, nhưng hắn ta chỉ mang
được nhiều nhất là W pound trong chiếc ba lô cho m của mình cho vài số nguyên W
.
Những món hàng nào hắn ta phải lấy? (Đây được gọi là bài toán chiếc ba lô 0-1 bởi vì
mỗi một món hàng hoặc là được lấy hoặc để lại; tên trộm khhông thể lấy một phần trong
một món hàng hay lấy một món hàng nhiều hơn một lần.)
Trong bài toán chiếc ba lô phân số, thiết lập giống

như vậy, nhưng tên trộm có thể
lấy một số phần trong các

món hàng; Hơn là thực hiện cách chọn lựa

nhị phân (0-1) cho
mỗi món hàng. Bạn có thể nghĩ mỗi một món hàng trong bài toán chiếc ba lô (0-1) giống
như một thỏi vàng, trong khi đó mỗi món hàng trong bài toán chiếc ba lô phân số thì
giống bụi vàng hơn.

Cả hai bài toán chiếc ba lô thể hiện thuộc tính cấu trúc con tối ưu. Trong bài toán 0-1,
xem như

tải trọng có giá trị lớn nhất cân nặng nhiều nhất là W pouds. Nếu ta bỏ

món hàng
j ra khỏiẩtỉ trọng này, tải trọng còn lại phải là tải trọng có giá

trị nhất cân nặng nhiều nhất

là W–w
j
mà tên trộm có thể lấy từ n-1 món hàng ban đầu loại ra món hàng j. Trong bài
toán chiếc ba lô phân số tương thích, giả sử rằng nếu ta bỏ lại trọng lượng w

của một món
hàng j khỏi tải trọng tối ưu, tải trọng còn lại phải là tải trọng có giá trị nhất cân nặng
Trang 19
Thuật toán tham lam
nhiều nhất là W-w mà tên trộm có thể lấy từ n-1 món hàng ban đầu cộng với w
j
-w

pound
của món hàng j.
Mặc dù các bài toán là tương tự nhau, bài toán chiếc ba lô phân số có thể được giải
quyết bằng chiến lược tham lam, nhưng ngược lại bài toán 0-1 thì không. Để giải quyết
bài toán

phân số, ta trước tiên tính toán đơn giá của mỗi pound v
i
/w
i
cho mỗi món hàng.
Tuân theo chiến lược tham lam, tên trộm bắt đầu lấy càng nhiều càng tốt

món hàng với
đơn giá cao nhất. Nếu sự cung cấp của món hàng đó đã hết và hắn ta có thể mang thêm
nữa, hắn ta lấy càng nhiều càng tốt như món hàng với đơn giá cáo nhất tiếp theo, tiếp tục
cho đến khi hắn ta không thể mang được nữa. Vì vậy, việc sắp xếp các món hàng theo

đơn giá, thuật toán tham lam chạy với độ phức tạp O(nlogn) thời gian. Sự chứng minh
rằng bài toán chiếc ba lô phân số có chiến lược lựa chọn tham lam được để lại cho bài tập
16.2-1.

Hình 16.2: Chiến lược tham lam không thực hiện trong bài toán chiếc ba lô 0-1. (a)
tên trộm phải chọn một tập con của ba món hàng mà khối lượng của chúng không vượt
quá 50 pound. (b) Tập con tối ưu bao gồm món hàng 2 và 3. Giải pháp bất kỳ có món
hàng 1 là không tối ưu, mặc dù món hàng 1 có đơn giá lớn nhất. (c) trong bài toán chiếc
ba lô phân số, lấy các món hàng theo thứ tự sắp xếp đơn giá lớn nhất của mỗi pound của
các món hàng đưa lại một giải pháp tối ưu.
Để thấy rằng chiến lược tham lam này không thực hiện cho bài toán chiếc ba lô 0-1,
xem trường hợp của bài toán đựoc minh hoạ trong hình 16.2(a). Có 3 món hàng, và cái ba
lô có thể chứa 50 pound. Món hàng 1 nặng 10 pound có giá tri 60 dollar. Món hàng 2
nặng 20 pound và có giá trị 100 dollar. Món hàng 3 nặng 30 pound và có giá trị 120
dollar. Vì vậy, đơn giá của món hàng 1 là 6 dollar mỗi pound, nó lớn hơn đơn giá của
Trang 20
Thuật toán tham lam
món hàng 2 (5

dollar mỗi pound) hay cả món hàng 3 (4 dollar mỗi pound). Chiến lược
tham lam, bởi vậy, sẽ lấy món hàng 1 trước tiên. Như có thể thấy từ sự phân tích ở hình
16.2(b). Tuy nhiên, giải thuật tối ưu lấy món hàng 2 và 3, để lại 1. Hai giải thuật có khả
năng mà bao gồm món hàng 1 là đều không tối ưu.
Tuy nhiên, trong bài toán phân số tương ứng, chiến lược tham lam,

lấy món hàng 1
trước tiên, mang lại một giải thuật tối ưu, như biểu diễn ở hình 16.2(c). Việc lấy món
hàng 1 không thực hiện trong bài toán 0-1 bởi vì tên trộm không thể làm đầy ba lô của
hắn đối với sức chứa, và khoảng trống hạ thấp giá trị hiệu qủa


của mỗi pound của tải
trọng của hắn. Trong bài toán 0-1, khi ta xem một món hàng cho vào chiếc ba lô, ta phải
so sánh giải thuật đối với bài toán con trong đó món hàng được tính đến với giải thuật đối
vơi bài toán con trong đó món hàng được tính đến trước khi ta có thể thực hiện lựa chọn.
Bài toán được thành lập theo cách này làm tăng lên đối với nhiều bài toán con phủ chồng
- một dấu chất lượng của quy hoạch động,và thực vậy, quy hoạch động có thể được sử
dụng để giải quyết bài toán 0-1.(Xem bài tập 16.2-2)
2.4. Các bài tập liên quan:
Bài 1: Chứng minh

rằng bài toán chiếc ba lô

phân số có chiến lược lựa chọn tham lam.
Bài 2: Đưa ra một giải pháp quy hoạch động cho bài toán chiếc ba lô 0-1 chạy trong
O(nW) thời gian, với điều kiện n là số các món hàng và W là trọng lượng tối đa của các
món hàng mà tên trộm có thể cho vào chiếc ba lô của hắn.
Bài 3: Giả sử rằng trong bài toán chiếc ba lô 0-1, xem như trật tự khi sắp xếp các món
hàng theo sự tăng dần của trọng lượng giống như thứ tự khi sắp xếp theo sự giảm dần của
giá trị. Đưa ra một thuật toán hiệu quả để tìm một giải pháp tối ưu đối với biến thể này,
và chứng tỏ rằng thuật toán của bạn là đúng.
Bài 4: Giáo sư Midas lái xe ô tô từ Newark đến Reno dọc theo 80 Interstate 80. Thùng
xăng xe của ông ấy, khi đầy, đủ để chạy được n dặm, và bản đồ của ông ấy cho thấy các
khoảng cách giữa các trạm xăng trên tuyến trình của ông. Giáo sư muốn dừng càng ít
điểm càng tốt. Nêu ra một phương pháp hiệu quả mà giáo sư Midas có thể quyết định
những trạm xăng mà ông ta dừng, và chứng minh rằng chiến thuật của bạn mang lại một
giải pháp tối ưu.
Trang 21
Thuật toán tham lam
Bài 5: Mô tả một giải thuật hiệu quả mà, cho một tập {x
1,

x
2,
…,x
n
} các điểm trên một
đường thẳng thực, Xác định tập nhỏ nhất gồm các quãng đóng có chiều dài đơn vị mà
chứa tất cả các điểm đã cho. Chứng tỏ rằng thuật toán của bạn là đúng.

Bài 6: Chỉ ra cách giải quyết bài toán chiếc ba lô phân số trong O(n) thời gian. Kết luận rằng bạn
có một giải pháp đối với bài toán 9-2.
Bài 7: Giả sử bạn cho hai tập A và B, mỗi tập chứa n số thực. Bạn có thể chọn để sắp xếp
lại mỗi tập khi bạn thích. Sau khi sắp xếp lại, đặt a
i
là phần tử thứ i của tập A và đặt b
i

phần tử thứ i của tập B.

Sau đó bạn nhận được tỷ lệ phần trăm của
1
i
n
b
i
i
a
=

. Chứng
minh rằng Giải thuật của bạn đạt được tối đa tỷ lệ phần trăm, và nói rõ số lần chạy của

nó.
Trang 22
Thuật toán tham lam
PHẦN 3: CÁC MÃ HUFFMAN
Các mã Hufman 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.
Giả sử ta có tập tin dữ liệu gồm 100,000 ký tự mà ta muốn lưu trữ ở dạng nén. Ta
nhận thấy rằng những ký tự trong tập tin đó xuất hiện với tần số được cho bởi minh hoạ
16.3. Tức là, chỉ có 6 ký tự khác nhau xuất hiện, và ký tự a xuất hiện 45,000 lần.
Có rất nhiều cách để biểu diễn thông tin của một tập tin nào đó. Ta xét bài toán thiết
kế mã ký tự nhị phân (hoặc gọi tắt là mã) ở khía cạnh nào đó mỗi ký tự được biểu diễn
bởi một chuỗi nhị phân duy nhất. Nếu ta sử dụng mã có chiều dài cố định, ta cần 3 bit để
biểu diễn 6 ký tự: a = 000, b = 001, , f = 101. Phương pháp này yêu cầu có 300,000 bit
để mã hoá toàn bộ tập tin đó. Ta có thể làm điều này tốt hơn không?
Mã có chiều dài bất định có thể thực hiện tốt hơn đáng kể so với mã có chiều dài cố
định, bằng cách cho những từ mã ký tự ngắn thường xuyên và những từ mã ký tự dài
không thường xuyên. Minh hoạ 16.3 chỉ ra một cách mã hoá như thế; ở đây chuỗi 1 bit 0
biểu diễn a, và chuỗi 4 bit 1100 biểu diễn f. Cách mã hoá này cần:
(45.1 + 13.3 + 12.3 + 16.3 + 9.4 + 5.4).1,000 = 224,000 bit
để biểu diễn tập tin đó, tiết kiệm khoảng chừng 25%. Thật vậy, đây là cách mã hoá tối ưu
cho tập tin này, như ta thấy.
3.1. Mã tiền tố:
Ở đây ta chỉ xét những mã trong đó không có từ mã nào là tiền tố của vài từ mã khác.
Những mã này được gọi là mã tiền tố. Điều này có thể chỉ ra rằng việc nén dữ liệu tối ưu
có thể thực hiện được bằng việc mã hoá ký tự có thể luôn luôn được hoàn thành với một
mã tiền tố, vì vậy không mất tính tổng quát trong việc giới hạn sự chú ý đến mã tiền tố.
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. Ví dụ, với mã tiền tố có
Trang 23
Thuật toán tham lam
độ dài bất định của minh hoạ 16.3, ta mã hoá tập tin gồm 3 ký tự abc là 0.101.100 =
0101100, những chỗ mà ta sử dụng dấu “.” biểu diễn phép ghép nối.
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
Minh hoạ 16.3 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. 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.
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ì rằng 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á. Ta có ví
dụ, chuỗi 001011101 phân ra một cách duy nhất là 0.0.101.1101, đây là dạng giải mã đối
với aabe.
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”. Minh hoạ 16.4 chỉ ra các cây có 2 mã của ví dụ. 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ự.


Trang 24
Thuật toán tham lam

Minh hoạ 16.4: Cây tương ứng với biểu đồ mã hoá ở minh hoạ 16.3. 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, , f = 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 (xem bài tập 16.3-1). 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ạ 16.4(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à
C
lá, mỗi lá cho một ký tự của
bảng chữ cái, và có đúng
1C −
nút trong (xem Bài tập B.5-3).
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. Số bit cần có để mã hoá một tập tin là như sau:
B(T)=
( ) ( )
T
c C
f c d c


(16.5)
điều này ta định nghĩa là mức phí của cây T.
3.2. 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. Đúng với nhận xét của ta ở phần 16.2, 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
Trang 25

×