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

TIỂU LUẬN MÔN THUẬT TOÁN NÂNG CAO Thuật toán sắp xếp Quicksort

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 (323.48 KB, 18 trang )

TRƯỜNG ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐH BÁCH KHOA ĐÀ NẴNG
TIỂU LUẬN MÔN
THUẬT TOÁN NÂNG CAO
Giảng viên hướng dẫn: Nguyễn Thanh Bình
Học viên : Võ Phi Thanh
Hoàng Công Tiến
Lê Công Vượng
Nguyễn Trần Sỹ
Nguyễn Thị Hà Phương
Lớp : Cao học KHMT K24
Tiểu luận thuật toán nâng cao
Đồng Hới, 12/2012
Thực hiện: Nhóm 1
2
Tiểu luận thuật toán nâng cao
LỜI MỞ ĐẦU
Hiện nay, trong tất cả các lĩnh vực kinh tế, văn hóa, nông nghiệp… công
nghệ thông tin thực sự gắn liền và góp phần làm tăng hiệu quả của các lĩnh vực
đó, cụ thể đã có nhiều phần mềm phục vụ trong văn hóa nghệ thuật giải trí như
phần mềm thống kê tin nhắn bình chọn, phần mềm xử lý hình ảnh, âm thanh;
trong nông nghiệp thì người ta chế tạo ra các phương tiện, máy móc phục vụ
cho mùa vụ…; trong trí tuệ nhân tạo thì có robot, máy móc tự động hóa…. Vậy
để có được những sản phẩm đó phải qua các bước khác nhau trong đó quan
trọng nhất là ý tưởng, hay là cách thức để cho sản phẩm đó hoạt động. Tóm lại
là thuật toán.
Trong tiểu luận của chúng tôi nghiên cứu về một số thuật toán nâng cao
nhằm giải quyết một vấn đề trong một số bước hữu hạn hoặc nhằm cung cấp
một kết quả từ một tập hợp của các dữ kiện đưa vào. Một số thuật toán như sau:
- Chứng minh sự đúng đắn
- Thuật toán sắp xếp Quicksort


- Thuật toán chia để trị
- Thuật toán quy hoạch động
Chúng em xin chân thành cảm ơn thầy Nguyễn Thanh Bình đã hướng dẫn
để tiểu luận của chúng em hoàn thành tốt hơn. Tiểu luận này còn nhiều thiếu
sót, rất mong quý thầy cô và các bạn đóng góp ý kiến. Chúng tôi xin chân thành
cảm ơn.
Thực hiện: Nhóm 1
3
Tiểu luận thuật toán nâng cao
MỤC LỤC
Thực hiện: Nhóm 1
4
Tiểu luận thuật toán nâng cao
CHƯƠNG 1. GIỚI THIỆU VỀ THUẬT TOÁN NÂNG CAO
1. 1. Khái niệm thuật toán
Thuật toán là một dãy xác định các thao tác cơ bản áp dụng trên dữ liệu
vào nhằm đạt được giải pháp cho một vấn đề
Hai vấn đề:
Tìm một phương pháp giải quyết vấn đề
- Giải pháp cho ax
2
+bx+c=0: rõ ràng và xác định
- Giải pháp cho ax
5
+bx
4
+cx
3
+dx
2

+ex=0: Không có giải pháp tổng quát
Tìm một giải pháp hiệu quả
Phân biệt giải thuật và chương trình: Chương trình là cài đặt thuật toán
bằng một ngôn ngữ lập trình. Thuật toán: Thủ tục tính toán nhận tập các dữ liệu
vào và tạo các dữ liệu ra
Thuật toán được gọi là đúng đắn nếu thuật toán dừng và cho kết quả đúng
với mọi dữ liệu vào
Thuật toán hằng ngày trong cuộc sống đơn giản chỉ là những công việc
với các bước tuần tự như nấu cơm, học bài… Thuật toán trong toán học/tin học
thì như là nhân hai ma trận, tính tích phân…
1.2. Các tính chất của thuật toán
o Tính tổng quát:
Thuật toán phải áp dụng cho tất cả các mẫu dữ liệu vào chứ không chỉ là
một mẫu dữ liệu vào cụ thể
Ví dụ: Sắp xếp giảm dần một dãy các giá trị
Dữ liệu vào: 6 8 4 5 2
Dữ liệu ra: 8 6 5 4 2
Phương pháp: So sánh hai phần tử liên tiếp nhau từ trái qua phải,
nếu không đúng thứ tự thì hoán đổi vị trí chúng
B1: 6  8 4 5 2
B2: 8 6  4 5 2
B3: 8 6 4  5 2
B4: 8 6 5 4 2
Dãy đã được sắp xếp nhưng thuật toán chưa tổng quát
o Tính hữu hạn
Thuật toán phải dừng sau một bước xác định
Ví dụ: nhập n
While (n<>0) n=n-2
Endwhile
Thuật toán này trong trường hợp n lẻ thì sẽ không dừng mà chạy vô hạn

o Tính không nhập nhằng
Thực hiện: Nhóm 1
5
Tiểu luận thuật toán nâng cao
Các thao tác trong thuật toán phải được đặc tả chặt chẽ. Ở mỗi bơpcs thực
thi thì bước tiếp theo phải được xác định rõ ràng
Ví dụ: x=0
aa: Tăng x lên 1 hoặc giảm x xuống 1
If (x >=-2) and (x<=2) then goto aa
Thuật toán nhập nhằng vì không biết là phải tăng x hay giảm x
o Tính hiệu quả
Thuật toán phải sử dụng hiệu quả nguồn tài nguyên máy tính đó là thời
gian và bộ nhớ
1.3. Đặc tả thuật toán
Có nhiều cách đặc tả thuật toán:
o Không hình thức: Sử dụng ngôn ngữ tự nhiên
o Nửa hình thức: Kết hợp ngôn ngữ tự nhiên và các ký hiệu toán học
bao gồm sơ đồ khối, ngôn ngữ giả,…
o Hình thức: Sử dụng các ký hiệu toán học của ngôn ngữ nào đó.
1.4. Phân tích và đánh giá các thuật toán
o Dựa vào các tính chất của thuật toán
o Chứng minh sự đúng đắn
o Đánh giá độ phức tạp
Thực hiện: Nhóm 1
6
Tiểu luận thuật toán nâng cao
CHƯƠNG 2. MỘT SỐ THUẬT TOÁN
2.1. Chứng minh sự đúng đắn:
Viết thuật toán tính n! và chứng minh nó đúng đắn.
Thuật toán:

giaithua (n)
Begin
If n=0 then gt:=1
else begin
i:=1; gt:=1;
While i<=n do
begin
gt:=gt*i;
i:=i+1;
end_While;
end_If;
return gt;
End.
Để chứng minh sự đúng đắn của thuật toán, chúng ta phải xác định được:
- Bất biến vòng lặp I
- Hàm dừng T(n)
2.1.1. Tìm bất biến vòng lặp I
giaithua (n)
Begin
If n=0 then gt:=1
else begin
i:=1; gt:=1;
While i<=n do
begin
{q=gt
k-1
*k, k=1 i}
gt:=gt*i;
i:=i+1;
{q=gt

k-1
*k, k=1 i}
end_While;
{i=n+1,q=gt
k-1
*k, k=1 i}
end_If;
return gt;
End.
Thực hiện: Nhóm 1
7
Tiểu luận thuật toán nâng cao
Bất biến vòng lặp:
I={q=gt
k-1
*k, k=1 i}
Chứng minh I đúng bằng quy nạp:
- i=1, k=1 1. Khi đó I={q=gt
0
*1, k=1}=1 nên I đúng
- Giả sử I đúng ở bước lặp i-1
Nghĩa là, I={gt
k-1
*k, k=1 i-1} đúng
- Ta chứng minh I đúng ở bước lặp i
Nghĩa là, I={gt
k-1
*k, k=1 i} đúng
Thật vậy, Vì q=gt
i-1

*i đúng (do gt
i-1
đúng ở bước lặp i-1 như giả
sử) nên q=gt
k-1
*k đúng (k=i). Do đó, I={gt
k-1
*k, k=1 i} đúng.
2.1.2. Tìm hàm dừng T(n)
giaithua (n)
Begin
If n=0 then gt:=1
else begin
i:=1; gt:=1;
While i<=n do
begin
gt:=gt*i;
i:=i+1;
{i
p
=i
p-1
+1}
end_While;
end_If;
return gt;
End.
Hàm dừng: T(n)=n-i
p
+1, Trong đó p là biến đếm vòng lặp

- Chứng minh T(p) luôn giảm: T(p)=n-i
p
+1, do i
p
=i
p-1
+1
nên T(p)=n-i
p
+1=n-(i
p-1
+1)+1=n-i
p-1
=(n-i
p-1
+1)-1=T(p-1)-1, Do đó T(p)>T(p-1) ,
hay T(p) luôn giảm
- Chứng minh: Nếu điều kiện c đúng (c=i<=n) thì T(p)>0, nếu T(p)=0 thì
điều kiện c sai.
Nếu n>=i
p
, điều kiện đúng (c đúng) thì T(n)=n-i
p
+1>0, Nếu T(p)=0, có
nghĩa là n=i
p
-1 nên n<i
p
có nghĩa là điều kiện sai.
2.2. Thuật toán chia để trị

2.2.1. Chứng minh có thể nhân hai đa thức (ax+b) và (cx+d) chỉ với 3 phép
nhân.
Thực hiện phép nhân hai đa thức trên ta sẽ có đa thức Ax
2
+ Bx +C.
Trong đó:
A= ac
Thực hiện: Nhóm 1
8
Tiểu luận thuật toán nâng cao
B= bc +ad
C= bd
Như vậy, nếu giữ nguyên các phép tính trên thì phải thực hiện:
+ 4 phép nhân,
+ 1 phép cộng
Để độ phức tạp của bài toán này giảm thì ta sẽ thực hiện biến đổi sao cho
giảm phép nhân, có thể tăng phép cộng, trừ lên. Ta thực hiện biến đổi B như
sau:
B= bc + ad = bc + ad +ac +bd – ac – bd =(bc + bd) + (ad + ac) – ac – bd = (a +
b)(c + d) – ac – bd
Vậy:
A= ac
B= (a + b)(c + d) – ac – bd
C= bd
Sau khi biến đổi, bài toán chỉ cần tính:
+ 3 phép nhân: ac, bd, (a + b)(c + d)
+ 2 phép cộng, 2 phép trừ
Vậy phép nhân hai đa thức này chỉ cần thực hiện 3 phép nhân.
+) Thuật toán nhân hai đa thức bằng cách chia đa thức thành hai nữa đa
thức, một nữa có bậc từ 1 đến n/2, một nữa có bậc từ n/2+1 đến n:

Function dathuc(M1, M2, n, x)
Begin
{M1, M2 là hai mảng lưu hệ số của hai đa thức}
If n=1 then return (M1[0]*M2[0])
Else
Begin
a:= M1[0]……M1[n/2];
b:= M1[n/2+1]…….M1[n+1];
c:= M2[0]……M2[n/2];
d:= M2[n/2+1]…….M2[n+1];
u:= dathuc(a, c, n/2,x);
q:= dathuc(b, d, n/2),x;
z:= dathuc(a+b, c+d, n/2,x);
return (u*x
n
+ (z-u-q)x
n/2
+q);
end;
end;
+) Thuật toán nhân hai đa thức bằng cách chia đa thức thành hai nữa đa
thức, một nữa có bậc chẵn, một nữa có bậc lẻ:
Function dathuc(M1, M2, n, x)
Begin
Thực hiện: Nhóm 1
9
Tiểu luận thuật toán nâng cao
{M1, M2 là hai mảng lưu hệ số của hai đa thức}
If n=1 then return (M1[0]*M2[0])
Else

Begin
If (n mod 2 = 0) then
Begin
a:= M1[n]……M1[2]M1[0];
b:= M1[n-1]…….M1[1];
c:= M2[n]……M2[2]M2[0];
d:= M2[n-1]…….M2[1];
end
else
begin
a:= M1[n-1]……M1[2]M1[0];{hệ số chẵn}
b:= M1[n]…….M1[1]; {hệ số lẻ}
c:= M2[n-1]……M2[2]M2[0];
d:= M2[n]…….M2[1];
end;
u:= dathuc(a, c, n/2,x);
q:= dathuc(b, d, n/2,x);
z:= dathuc(a+b, c+d, n/2);
return (u*x
n
+ (z-u-q)x
n/2
+q);
end;
end;
2.2.2. Chứng minh hai số nguyên được biểu diễn n bit có thể được nhân bởi
thuật toán có độ phức tạp O(n
log3
).
Giả sử, hai số nguyên n bit là X và Y. Phân tích X, Y thành hai phần mỗi

phần có n/2 bit. Xét đối với n=2
k
. Ta có:
X = A.2
n/2
+ B
Y = C.2
n/2
+ D
X.Y = AC2
n
+ (AD + BC)2
n/2
+ BD
Ta cũng thực hiện phép biến đổi như phần chứng minh ở trên, thì:
X.Y = AC2
n
+ ((A + B)(C + D) – AC – BD)2
n/2
+ BD
Và bài toán sẽ thực hiện:
+ 3 phép nhân n/2 bit: AC, BD, ((A + B)(C + D)
+ 6 phép cộng, trừ n/2 bit
+ 2 phép chuyển (nhân lũy thừa bậc hai)
Tính độ phức tạp:
Thực hiện: Nhóm 1
10
Tiểu luận thuật toán nâng cao
C(n)=3C(
2

n
) + 2*
2
n
+ 1
=3(3C(
4
n
)+2*
4
n
+1) +2*
2
n
+1
=3
2
C(
4
n
)+6* +3 +2*+1
=3
2
(3C(
8
n
)+2*
8
n
+1)+6*

4
n
+3 +2*
2
n
+1
=3
3
C(
8
n
)+9*
4
n
+3
2
+ 3*
2
n
+3 +n +1
=3
i
C(
2
i
n
)+
1
0
3

i
k
k

=

+n*
1
0
3
2
k
i
k

=
 
 ÷
 

Đặt n = 2
i
 i = logn
C(n) = 3
logn
C(1) +
log 1 1
1 3
1 3
n− +



+
log 1 1
3
1
2
3
1
2
n− +
 

 ÷
 

= 3
logn
+
1
2
(3
logn
– 1) + 2
log
3
1
2
n
 

 

 ÷
 ÷
 ÷
 
 
=n
log3
+
1
2
(n
log3
– 1) + 2
3
log
2
1n
 

 ÷
 
Vậy O(n
log3
).
2.3. Tính độ phức tạp của thuật toán Quicksort
2.3.1. Phân tích độ phức tạp: trường hợp tốt nhất:
Trường hợp tốt nhất xảy ra với Quicksort là khi mỗi lần phân hoạch chia tập tin
ra làm hai phần bằng nhau.

điều này làm cho số lần so sánh của Quicksort thỏa mãn hệ thức truy hồi:
C
N
= 2C
N/2
+ N.
Số hạnh 2C
N/2
là chi phí của việc sắp thứ tự hai nửa tập tin và N là chi phí của
việc xét từng phần tử khi phân hoạch lần đầu.
2.3.2. Phân tích độ phức tạp: trường hợp xấu nhất :
Một trường hợp xấu nhất của Quicksort là khi tập tin đã có thứ tự rồi.
Khi đó, phần tử thứ nhất sẽ đòi hỏi n so sánh để nhận ra rằng nó nên ở đúng vị
trí thứ nhất. Hơn nữa, sau đó phân đoạn bên trái là rỗng và và phân đoạn bên
phải gồm n – 1 phần tử. Do đó với lần phân hoạch kế, phần tử thứ hai sẽ đòi hỏi
n-1 so sánh để nhận ra rằng nó nên ở đúng vị trí thứ hai. Và cứ tiếp tục như thế.
Như vậy tổng số lần so sánh sẽ là:
n + (n-1) + … + 2 + 1 = n(n+1)/2 =
(n
2
+ n)/2 = O(n
2
).
Độ phức tạp trường hợp xấu nhất của Quicksort là O(n
2
).
Thực hiện: Nhóm 1
11
Tiểu luận thuật toán nâng cao
2.3.3. Độ phức tạp trường hợp trung bình của Quicksort :

Cách 1:
Công thức truy hồi chính xác cho tổng số so sánh mà Quick sort cần để
sắp thứ tự N phần tử được hình thành một cách ngẫu nhiên:
C
N
= (N+1) + (1/N) ∑ (C
k-1
+ C
N-k
)
với N ≥ 2 và C
1
= C
0
= 0
Số hạng (N+1) bao gồm số lần so sánh phần tử chốt với từng phần tử
khác, thêm hai lần so sánh để hai pointer giao nhau. Phần còn lại là do sự
kiện mỗi phần tử ở vị trí k có cùng xác xuất 1/N để được làm phần tử
chốt mà sau đó chúng ta có hai phân đoạn với số phần tử lần lượt là k-1
và N-k.
Chú ý rằng, C
0
+ C
1
+ … + C
N-1
thì giống hệt
C
N-1
+ C

N-2
+… + C
0
, nên ta có
C
N
= (N+1) + (1/N) ∑ 2C
k-1

Ta có thể loại trừ đại lượng tính tổng bằng cách nhân cả hai vế với N và
rồi trừ cho cùng công thức nhân với N-1:
NC
N
– (N-1) C
N-1
= N(N+1) – (N-1)N + 2C
N-1

Từ đó ta được
NC
N
= (N+1)C
N-1
+ 2N
Chia cả hai vế với N(N+1) ta được hệ thức truy hồi:
C
N
/(N+1) = C
N-1
/N + 2/(N+1)

= C
N-2
/(N-1) + 2/N + 2/(N+1) .
. = C
2
/3 + ∑ 2/(k+1)
C
N
/(N+1) ≈ 2 ∑ 1/k ≈ 2 ∫ 1/x dx = 2lnN
Suy ra:
C
N
≈ 2NlnN
Cách 2:
Cũng như trong các thuật toán sắp xếp khác, hai yếu tố đóng vai trò quyết
định trong việc đánh giá độ phức tạp của Thuật toán QuickSort là A
N
, số phép
so sánh khóa, và B
N
, số phép đổi chỗ (hoán vị 2 mẫu tin). Ta sẽ phân tích hai
đại lượng này dưới đây:
a)
( )
N
N
A mean A
=
Gọi
Nk

P
là xác suất để
kA
N
=
. Trong bước phân chia đầu tiên
Nrl
==
,1
. Số
phép so sánh khóa trong vòng lặp Repeat…Until là N+1 nên
0
=
k
N
P
nếu
rNk
+<
. Cũng trong bước này, nếu giả thiết dữ liệu hoàn toàn ngẫu nhiên,
mẫu tin R[1] sẽ được dời đến đúng vị trí S với xác suất
N
1
. Khi ấy ta được 2
mảng con cần xử lý tiếp là (1, S-1) và (S+1, N). Trong việc sắp xếp mảng
Thực hiện: Nhóm 1
12
Tiểu luận thuật toán nâng cao
con (1, S-1) số phép so sánh cần thiết có thể lấy giá trị tùy ý
10

−−≤≤
Nkh

với xác suất
1,S h
P

. Đồng thời việc sắp xếp mảng (S+1, N) cần đúng k-N-1-h
phép so sánh. Do đó ta có công thức truy chứng:
(7)
1
1, , 1
1 0
1
N k N
Nk S h N S k N h
S h
P P P
N
− −
− − − − −
= =
=
∑ ∑
Gọi
)(zA
N
là hàm sinh của phân bố xác suất
kNk
P }{

.
Ta có do (7)
1
1
1 1
1, , 1
1 1 0
1
1, ,
1 0 0
( )
1
1
k
N Nk
k N
N k N
N k N
S h N S k N h
S k N h
N k
N k
S h N S k h
S k h
A z P z
z P P z
N
z P P z
N
≥ +

− −
+ − −
− − − − −
= ≥ + =
+
− − −
= ≥ =
=
=
=

∑ ∑ ∑
∑ ∑∑
(8)
1
1
1
1
( ) ( ) ( )
N
N
N S N S
s
A z z A z A z
N
+
− −
=
=


Suy ra:
1
1
1
1 1
1
' (1) ( 1 ' (1) ' (1))
1 1
1
N
N
N S N S
S
N N
S N S
S S
A A N A A
N
N A A
N N
− −
=
− −
= =
= = + + +
= + + +

∑ ∑
1
0

2
1
N
N S
S
A N A
N

=
= + +

Đây chính là công thức truy chứng với kết quả là
1
3
2( 1)( ) 2 ( )
2
N
N
A N H NLn N
+
= + − ≈
Vậy
( log )
N
A O N N
=
Mặt khác ta có:
1
1
1

1
1 1
1 1
1
0 1 0
2( 1)
'' ( 1) ( )
2 1
( '' (1) '' (1))
4( 1) 2 2
( 1) '' (1)
N
S N S
N
S
N N
S N S
S N S
S S
N N N
s S
N S S
S S S
N
A N N A A
N
A A A A
N N
N
N N A A A A

N N N
− −
=
− −
− −
= =
− −


= = =
+
= + + +
+ + +
+
= + + + +

∑ ∑
∑ ∑ ∑
Thực hiện: Nhóm 1
13
Tiểu luận thuật toán nâng cao
Như thế
'' (1)
N N
x A
=
thỏa hệ thức truy chứng (17) với hệ số
N
f
Với điều kiện

đầu
1
'' 0A
=
thì hệ thức (25), Ngoài ra ta có :
1
2
1
1
1
1
1
'' (1) 4( 1)( 2) 12( 1)( 2)
2
16( 1)( 2) 4( 1) 8
N
N k N
k
N
N k
k
A N N H N N H
N k
N N N H H
+
+
=

+
=

= + + − + +
+ −
+ + + − + +


Suy ra:
2
1
1
1
1
1
2 2
1 1
2 2
1
1
1
( ) '' (1)
1
4( 1)( 2) 12( 1)( 2)
2
16( 1)( 2) 4( 1) 8
2( 1) 3( 1) 4( 1)
12( 1) 9( 1)
1 1
4( 1)( 2) 4( 1)
2
2( 1)
N N

N N
N
k N
k
N
N k
k
N N
N
N
N
k h k
Var A A A A
N N H N N H
N k
N N N H H
N H N N H
N H N
N N N H
h N k
N H
+
=

+
=
+ +
+
+
= >

= + −
= + + − + +
+ −
+ + + − + +
+ + − + − +
+ + − +
= − + + + +
+ −
− +


∑∑
1
2
1
1
2 1
2 2
1 1
1 1
1 1
7( 1) 13( 1) 8
12( 1)( 2)( ) 12( 1)
7( 1) 4( 1) 10( 1)
1 1
( 1) 8 4( 1)( 2)
2
N
N k
k

N N N
N N
N N
k
k k h k
N N H
N N H H N H
N N H N H
N H N N
h N

+
=
+ +
+ +
− +
= = >
+ + + + +
− + + − + +
= + + + + +
+ + + − + +
+

∑ ∑∑
Do đó:
1
2 2
1 1
1
2

( ) 7( 1) 4( 1) 10( 1) ( 1) 8
7 ( log( ))
N
N N N k
k
c Var A N N H N H N H
N O N N

+ +
=
≤ ≤ + + + + + + + +
= +

Như thế độ lệch б=O(N) khá bé so với
( log )
N
A O N N
=
b)
( )
n
N
BmeanB
=
Gọi b
Nst
là xác xuất để trong phép phân chia mảng (1,N), mẩu tin X[1] được dời
đến vị trí đúng là S, và có t mẩu tin bên trái được đổi chỗ với t mẩu tin bên phải.
Ta có:
( )( )

SN
t
S
tNst
SNS
N
b
−−
−−=
1
)!()!1(
!
1
Thực hiện: Nhóm 1
14
Tiểu luận thuật toán nâng cao
( )( )
( )
1
1
1


−−
=
N
S
SN
t
S

t
N
Tương tự như trong a) ta có:
( )
∑∑
=

=
−−
++=
N
S
S
t
SNS
Nst
N
BBtbB
1
1
0
1
Thay thế giá trị của b
Nst
vào ta được:
(9)
( ) ( )( )
( )
( )( )
SN

t
S
t
S
t
N
S
SNS
SN
t
N
S
S
t
S
t
N
N
S
BBtBN


=

=
−−

=

=

−−

∑∑∑∑
++=
1
0
1
1
1
1
1
0
11
1
Với N,S cố định sao cho 1≤S≤N, số cách chọn tùy ý một tập con S-1 phần tử
của {1,2,…,N-1} cũng là số cách chọn 1 tập con E có S-1-t phần tử của {1,2,
…,S-1} và 1 tập con có t phần tử của {S,…,N-1} với 0≤t≤S-1 tùy ý. Do đó:
( )( ) ( )
1
1
1
0
1
1



=
−−
−−

=

N
S
S
t
SN
t
S
tS
hay:
(10)
( )( ) ( )
1
1
1
0
1 −



=

=

N
S
SN
t
S

t
S
t
Mặt khác:
( )( ) ( )
( ) ( )
!

1
1
0
1
0
1
t
tSNSN
tt
S
t
S
t
SN
t
S
t
S
t
−−−
=



=


=

∑∑
( )
( )
( ) ( )
( )
!1
1
1
0
1

−−−−
−=


=

t
tSNSN
SN
S
t
S
t

( )
( )( )
SN
t
S
t
S
t
SN
−−


=


−=
1
1
1
0
1
Lý luận tương tự như trên
( )( )
SN
t
S
t
S
t
−−



=


1
1
1
0
1
là số cách chọn tập hợp con S-i phần tử
của tập hợp N-2 phần tử. Do:
(11)
( )( )
( )
( )
2
2
1
0
1 −



=

−=

N
S

SN
t
S
t
S
t
SNt
( )( )
( )
1
1
1
1



−−
=
N
S
N
SNS
Từ (9), (10), (11), ta có:
( )( )

=
−−







++

−−
=
N
S
SNSN
BB
N
SNS
N
B
1
1
1
11
=
( ) ( )
∑∑∑

===
+






+
1
01
2
1
2
11
1
1
1
N
S
N
S
N
S
B
NN
N
S
NN
S
NN
N


=
+

=

1
0
2
6
2
N
S
SN
B
N
N
B
Đây là hệ thức truy chứng đã giải trong ví dụ 3 chương I với kết quả là:
Thực hiện: Nhóm 1
15
Tiểu luận thuật toán nâng cao
( ) ( ) ( )
NNNHNB
N
N
ln
3
1
13
4
1
1
3
1
1

≈+−+=
+
Tóm lại độ phức tạp trung bình của thuật tóan Q là O(N logN)
Trường hợp xấu nhất và tốt nhất:
Khi mảng đã được xếp thứ tự tăng thì ở mỗi bước phân chia, phần tử bé nhất
được giữ nguyên chỗ và ta được một mảng con với 1 phần tử ít hơn trước. Do
đó cần đến N bước mới chấm dứt thuật tóan. Suy ra số phép so sánh là
N(N+1)=O(N
2
). Đó chính là trường hợp xấu nhất đối với phép so sánh trong khi
số phép dời chỗ lại ít nhất và bằng N.
Để tránh nghịch lý trên, ta có thể chọn khóa cầm canh cho phép phân chia là
khóa của phần tử giữa














+
2
rl

K
của mảng con (l,r). Khi ấy chỉ có log
2
N bước
chia nếu mảng ban đầu đã có thứ tự. Do đó số phép so sánh là (N+1)log
2
N trong
khi số phép dời chỗ chỉ là log
2
N. Đây chính là trường hợp tốt nhất cho cả số
phép so sánh và phép dời chỗ. Chú ý rằng nếu mảng được sắp xếp thứ tự giảm,
với cách chọn phần tử cầm canh như trên, số phép so sánh vẫn là (N+1)log
2
N
trong khi số phép dời chỗ không tệ lắm: N+log
2
N.
Ta cũng có thể xây dựng ví dụ trong đó cả số phép so sánh lẫn dời chỗ đều là
O(N
2
) bằng cách chọn phần tử ở giữa của mảng con tận cùng bên phải là phần
tử lớn nhất trong khi phần tử ở giữa của các mảng con khác được đặt đúng chỗ.
2.4. Thuật toán quy hoạch động
2.4.1. Bài toán
Trước tiên các bài hát trên CD sẽ được lưu trong mảng A và được sắp
xếp theo chiều giảm dần. Như vậy, khi muốn lưu các bài hát lên băng cát-xét
trên cả hai mặt và với thời lượng tối đa thì ta sẽ lưu lần lượt các bài hát đó vào
mặt 1, nếu mặt 1 không đủ chứa bài hát tiếp theo thì sẽ được lưu ở mặt thứ 2.
Xét hết n bài hát trên đĩa, tuy nhiên số bài hát lưu trên băng cát-xét <n.
Như vậy thời lượng lưu bài thứ i lên băng chính bằng thời lượng i-1 bài

hát + A[i].
Time(i,t1,t2)= 0 if i=0
Time(i-1,t1,t2-A[i])+A[i] else if t2- A[i]>=0
Time(i-1,t1-A[i],t2) +A[i] else
Ta có hệ thức truy hồi sau:
C(n)=C(n-1)+A[n]
= C(n-2) + A[n-1] +A[n]
Thực hiện: Nhóm 1
16
Tiểu luận thuật toán nâng cao
=
0
[ ]
n
i
A i
=

2.4.2. Thuật toán đệ quy tính hệ thức truy hồi
Function Time(i,t1,t2);
Begin
If i=0 then begin t1:=0;
t2:=0;
Time:=0;
end
else if t2-A[i]>=0 then
Time(i,t1,t2)=Time(i-1,t1,t2-A[i])+A[i]
Else Time(i,t1,t2)=Time(i-1,t1-A[i],t2)+A[i];
End;
2.4.3. Đánh giá độ phức tạp thuật toán đệ quy tính hệ thức truy hồi

Dựa vào hệ thức truy hồi và bài toán cho A[i]=1 \
1,i n∀ =
C(n)=C(n-1)+A[n]
= C(n-2) + A[n-1] +A[n]
=
0
[ ]
n
i
A i
=

= n
Vậy độ phức tạp O(n)
2.4.4. Thuật toán quy hoạch động
Function Time(n,d);
Begin
S:=0; t1:=0; t2:=0;
KT[i]=False \
1,i n∀ =
For i:= 1 to n do
If KT[i]=False then
begin If A[i]+t1<d then
Begin t1:=t1+A[i];
B[i]:=1;
{Mảng B lưu bài hát đó nằm ở mặt nào}
S:=S+A[i];
End
Else if A[i]+t2<d then
Begin t2:=t2+A[i];

B[i]:=2;
S:=S+A[i];
Thực hiện: Nhóm 1
17
Tiểu luận thuật toán nâng cao
End
Else B[i]=0;
KT[i]:=True;
End;
Time:=S;
Return;
2.4.5. Đánh giá độ phức tạp của thuật toán quy hoạch động
C(n)=n
Thực hiện: Nhóm 1
18
Tiểu luận thuật toán nâng cao
TÀI LIỆU THAM KHẢO
1. Nguyễn Thanh Bình, “Thuật toán nâng cao”, Trường ĐHBK Đà Nẵng,
2007.
2. Website: Tailieutonghop.com, “Thuật toán nâng cao”
3. Website: Kenhsinhvien.net, “Thuật toán nâng cao trong C++”
Thực hiện: Nhóm 1
19

×