14/04/2008
1
CHIA ĐỂ TRN
CHIA
ĐỂ
TRN
DIVIDE AND CONQUER
Phạm Thế Bảo
Khoa Toán – Tin học
Trường Đại học Khoa học Tự nhiên Tp.HCM
Nội dung
• Kỹ thuật quan trọng, đượcápdụng rộng rãi để
thiết
kế
các
giải
thuật
có
hiệu
quả
.
thiết
kế
các
giải
thuật
có
hiệu
quả
.
• Để giải quyếtmột bài toán kích thướcn,tachia
bài toán này thành mộtsố bài toán con có kích
thướcnhỏ hơn. Giải các bài toán con này rồitổng
hợpkếtquả lại để đượclờigiảibanđầu.
• Những bài toán con này cũng có thểđược chia
thành
các
bài
toán
có
kích
thước
nhỏ
hơn
nữa
để
thành
các
bài
toán
có
kích
thước
nhỏ
hơn
nữa
để
giải quyết. Quá trình này sẽđưa đếnnhững bài
toán mà lờigiảilàhiển nhiên hay dễ dàng thực
hiện. Ta gọinhững bài toán này là bài toán cơ sở.
Phạm Thế Bảo
14/04/2008
2
Mộtsố bài toán tiêu biểu
• MergeSort và QuickSort
ố
• Nhân s
ố
nguyên lớn
• Xếplịch thi đấuthể thao
• Bài toán con cân bằng
• …
Phạm Thế Bảo
MergeSort và QuickSort
• Chia tậpdữ liệulàm2tập con, quá trình chia
đế
khi
hỉ
ò
01
hầ
tử
Æ
dừ
(
bài
tá
đế
n
khi
c
hỉ
c
ò
n
01
p
hầ
n
tử
Æ
dừ
ng
(
bài
t
o
á
n
cơ sở), tổng hợp2tập con bằng cách trộncó
thứ tự Æ tậpdữ liệu đượcsắpxếp.
• Giống MergeSort nhưng cầnphầntử cầm canh
đứng
giữa
để
chia
thành
2
tập
con
:
một
tập
sẽ
đứng
giữa
để
chia
thành
2
tập
con
:
một
tập
sẽ
có các phầntử có giá trị nhỏ hơn hay bằng, tập
còn lạisẽ có các phầntử có giá trị lớnhơn.
Phạm Thế Bảo
14/04/2008
3
Bài toán nhân hai số nguyên lớn
• Trong các ngôn ngữ lậptrình,kiểudữ liệusố
nguyên
đều
có
miền
giá
trị
hạn
chế
nguyên
đều
có
miền
giá
trị
hạn
chế
,
ví dụ: Pascal, C số nguyên từ -32768 đến 32767
• Khi gặp ứng dụng cầnsố nguyên lớnhơn
(hàng chục hay hàng trămchữ số), chúng ta
phải đixâydựng cấutrúcdữ liệusố nguyên
lớn
Các
thao
tác
đi
kèm
là
:
cộng
trừ
nhân
lớn
.
Các
thao
tác
đi
kèm
là
:
cộng
,
trừ
,
nhân
,…
• Chúng ta xem xét cách nhân 02 số nguyên lớn
có n chữ số sao cho hiệuquả.
Phạm Thế Bảo
• Nếuchúngtadùngcáchnhânthôngthường,
nghĩalàtừng chữ số nhân với nhau rồicộng lại
thì chi phí là O(n
2
).
• Á
p
dụ
n
g
k
ỹ
t
h
uật
c
hi
a
để
t
r
ị
.
T
a
c
hi
a
0
2
số
p
dụ g
ỹ
tuật
ca
để
t ị
.
a
ca
0
số
nguyên X, Y thành các số nguyên lớncón/2
chữ số:X=A10
n/2
+B và Y=C10
n/2
+D
Ví dụ: A=1234 thì A=12x10
2
+34
Khi đóX.Y=AC10
n
+(AD+BC)10
n/2
+BD.
Giố
h
ê
l i
hi
iế
để
ó
bài
Giố
ng n
hư
tr
ê
nta
l
ạ
i
c
hi
at
iế
ptục
để
c
ó
bài
toán cơ sở dễ dàng thựchiện.
Phạm Thế Bảo
14/04/2008
4
• Theo cách làm trên thì phảithựchiện4phép
nhân các số nguyên lớnn/2chữ số (AC, AD,
BC, BD), sau đódùng3phépcộng các số
nguyên lớnnchữ số và2phépnhanvới10
n
và
ể
ổ
10
n/2
đ
ể
t
ổ
ng hợp.
• Phép cộng số nguyên lớncần O(n), phép nhân
10
n
có thể thựchiện đơngiảnbằng cách thêm
nchữ số 0 Æ cũng cần O(n). GọiT(n)làthời
gian
nhân
hai
số
nguyên
lớn
ta
có
phương
gian
nhân
hai
số
nguyên
lớn
,
ta
có
phương
trình đệ quy:
Phạm Thế Bảo
• Giảiphương trình ta có T(n) =
Æ không cảithiện!
• Viếtlại:
XY AC10
n
+[(A
B)(D
C)+AC+BD]10
n/2
+BD
X
.
Y
=
AC10
n
+[(A
-
B)(D
-
C)+AC+BD]10
n/2
+BD
Công thức này chỉ cần tính 3 phép nhân của các
số nguyên lớnn/2 chữ số: AC,BD và (A-B)(D-
C), 6 phép cộng trừ và 2 phép nhân với10
n
.
L
ập
lu
ậ
ntươn
g
t
ự
ta có
p
hươn
g
trình đ
ệ
q
u
y
:
ập
ậ
g
ự
p g
ệ
qy
T(1)=1
T(n)=
Phạm Thế Bảo
Nghiệm?
14/04/2008
5
Nghiệmcủaphương trình T(n)=
Æ cảithiệnhơn.
Thuậtgiải thô:
longDigit multi2Integer(longDigit X, longDogit Y, int n){
if( 1) th t X*Y
if(
n=
1)
th
en re
t
urn
X*Y
;
A=left(X,n/2);
B=right(X,n/2);
C=left(Y,n/2);
D=right(Y,n/2);
m1=multi2Integer(A,C,n/2);
2 lti2I t (A
BD
C
/2)
m
2
=mu
lti2I
n
t
eger
(A
-
B
,
D
-
C
,n
/2)
;
m3=multi2Integer(B,D,n/2);
return (m1*10
n
+(m1+m2+m3)*10
n/2
+m3);
}
Phạm Thế Bảo
Xếplịch thi đấuthể thao
• Xét việcxếplịch thi đấu vòng tròn mộtlượt
cho
n
đội
đá
banh
Mỗi
đội
thi
đấu
với
nhau
cho
n
đội
đá
banh
.
Mỗi
đội
thi
đấu
với
nhau
,
mỗi độichỉđấunhiềunhấtmộttrậnmộtngày.
Làm sao ta xếplịch thi đấuchosố ngày ít nhất.
• Ta có tổng số trận đấucủatoàngiảilà
nếunchẵn thì ta có thể sắpn/2cặpthiđấu
ộ
à
Æ
ầ
í
hấ
(
1
)
à
Nế
trong m
ộ
tng
à
y
Æ
c
ầ
n
í
tn
hấ
t
(
n-
1
)
ng
à
y.
Nếu
nlẻ thìtacóthể sắp (n-1)/2 cặpthiđấutrong
một ngày Æ cầnítnhất n ngày
Phạm Thế Bảo
14/04/2008
6
• Lịch thi đấulàmộtbảng n dòng và n-1 cộtvàđược
đánh số tứ 1trởđi, dòng i đạidiệnchođộithứ ivàcộtj
đạidiện cho ngày thi đấu j, ô(i,j) ghi độiphải thi đấu
với đội i trong ngày j.
• Dùng chiếnlượcchiađể trị: để sắplịch cho n đội, ta
sắ
p
cho n
/
2 đ
ộ
i
,
để sắ
p
l
ị
ch cho n
/
2 đ
ộ
itasắ
p
l
ị
ch cho
ắ
ấ
p
ộ
,
p
ị
ộ
p
ị
n
/
4 đội, … Æ s
ắ
plịch thi đ
ấ
ucho2đội(
b
ài toán cơ
sở).
• Từ lịch thi đấucủa2đội, chúng ta sắplịch thi đấucho
4 độinhư sau:
– Lịch thi đấu cho 4 độilàmộtbảng 4 dòng 3 cột.
– Lịch thi đấu cho 2 đội 1 và 2 trong ngày 1 chính là lịch thi
đấu
của
2
đội
(
bài
toán
cơ
sở
)
Vậy
ô(
1
1
)=
2
ô(
2
1
)=
1
đấu
của
2
đội
(
bài
toán
cơ
sở
)
.
Vậy
ô(
1
,
1
)=
2
,
ô(
2
,
1
)=
1
.
Tương tự cũng có lịch thi đấu cho 2 đội 3 và 4 trong ngày
1: ô(3,1)=4 và ô(4,1)=3. Ta có thể thấy ô(3,1)=ô(1,1)+2 và
ô(4,1)=ô(2,1)+2.
– Lịch thi đấucủa4đội, ta lấygóctrênbêntráicủabảng lắp
vào cho góc dướibênphảivàlấy góc dưới bên trái lắpcho
góc trên bên phải.
Phạm Thế Bảo
Ngày 1
Đội1 2
Đội2 1
Ngày 1 Ngày 2 Ngày 3
Đội1 2
Đội2 1
Đội3 4
Đội4 3
Ngày 1 Ngày 2 Ngày 3
Đội1 24
Đội2 13
Đội3 42
Đội4 31
Phạm Thế Bảo
Ngày 1 Ngày 2 Ngày 3
Đội1 234
Đội2 143
Đội3 412
Đội4 321
14/04/2008
7
Ngày 1 Ngày 2 Ngày 3 Ngày 4 Ngày 5 Ngày 6 Ngày 7
Đội1 234
Đ
ộ
i
2
1
4
3
Ngày 1 Ngày 2 Ngày 3 Ngày 4 Ngày 5 Ngày 6 Ngày 7
Đội1 234 67 8
Đ
ộ
i
2
1
4
3
5
8
7
Ngày 1 Ngày 2 Ngày 3 Ngày 4 Ngày 5 Ngày 6 Ngày 7
Đội1 234567 8
Đ
ộ
i
2
1
4
3
6
5
8
7
Đ
ộ
i
2
1
4
3
Đội3 412
Đội4 321
Đội5 678
Đội6 587
Đội7 856
Đ
ộ
i
8
7
6
5
Đ
ộ
i
2
1
4
3
5
8
7
Đội3 412 85 6
Đội4 321 76 5
Đội5 678 23 4
Đội6 587 14 3
Đội7 856 41 2
Đ
ộ
i
8
7
6
5
3
2
1
Đ
ộ
i
2
1
4
3
6
5
8
7
Đội3 412785 6
Đội4 321876 5
Đội5 678123 4
Đội6 587214 3
Đội7 856341 2
Đ
ộ
i
8
7
6
5
4
3
2
1
Phạm Thế Bảo
Đ
ộ
i
8
7
6
5
Đ
ộ
i
8
7
6
5
3
2
1
Đ
ộ
i
8
7
6
5
4
3
2
1
Bài tập: cài đặtchương trình
Bài toán con cân bằng
• Vớikỹ thuậtchiađể trị,nếu bài toán ban đầu
đ
thà h
á
bài
tá
ó
kí h
th ớ
ầ
đ
ược
thà
n
h
c
á
c
bài
t
o
á
nconc
ó
kí
c
h
th
ư
ớ
cg
ầ
n
bằng nhau thì hiểusuấtsẽ cao hơn.
• Ví dụ:MergeSortchialàm2tậpconbằng
nhau (n/2 phầntử -cóthể sai khác 1) thì độ
phức
tạp
là
O
.
Đối
với
QuickSort
,
nếu
phức
tạp
là
O
.
Đối
với
QuickSort
,
nếu
phân hoạch không tốtthìđộ phứctạpvẫnlà
O(n
2
), trường hợpxấunhất.
Phạm Thế Bảo