Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 17 -
IV. Phân tích thuật toán
Khi xây dựng được thuật toán để giải bài toán thì có hằng loạt vấn đề được
đặt
của bài toán hay không ?
tính hay không ?
hân tích đánh giá thời gian chạy của
ra để phân tích. Thường là các vấn đề sau :
- Yêu cầu về tính đúng đắn của thuật toán, thuật toán có cho lời giải đúng
- Tính đơn giản của thuật toán. Thường ta mong muốn có được một thuật
toán đơn giản, dễ hiểu, dễ lập trình. Đặc biệt là những thuật toán chỉ dùng một vài
lần ta cần coi trọng tính chất này, vì công sức và thời gian bỏ ra để xây dựng thuật
toán thường lớn hơn rất nhiều so với thời gian thực hiện nó.
- Yêu cầu về không gian : thuật toán được xây dựng có phù hợp với bộ nhớ
của máy
- Yêu cầu về thời gian : Thời gian chạy của thuật toán có nhanh không ?
Một bài toán thường có nhiều thuật toán để giải, cho nên yêu cầu một thuật toán
dẫn nhanh đến kết quả là một đòi hỏi đương nhiên.
. . . . . . .
Trong phần này ta quan tâm chủ yếu đến tốc độ của thuật toán. Ta cũng lưu
ý rằng thời gian chạy của thuật toán và dung lượng bộ nhớ nhiều khi không cân đối
được để có một giải pháp trọn vẹn. Chẳng hạn, thuật toán sắp xếp nội sẽ có thời
gian chạy nhanh hơn vì dữ liệu được lưu trử trong bộ nhớ trong, và do đó không phù
hợp trong trường hợp kích thước dữ liệu lớn. Ngược lại, các thuật toán sắp xếp
ngoài phù hợp với kích thước dữ liệu lớn vì dữ liệu được lưu trử chính ở các thiết bò
ngoài, nhưng khi đó tốc độ lại chậm hơn.
ác bước trong quá trình p1. C
thuật toán
Bước p ân tíc thời gian chạy của thuật toán là quan
âm đe kích t ước d như dữ liệu nhập của thuật toán và quyết
- đầu tiên trong việc h h
ta án h ữ liệu, sẽ được dùng
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 18 -
đònh phân tích nào là thích hợp. Ta có thể xem thời gian chạy của thuật toán là một
àm theo kích thước của dữ liệu nhập. Nếu gọi n là kích thước của dữ liệu nhập thì
thời gia hực h T của thuật toán được biểu diễn như một hàm theo n, ký hiệu là
: T(n).
- Bước thứ hai trong việc phân tích đánh giá thời gian chạy của một thuật
toán là nhân ra các thao tác trừu tượng của thuật toán để tách biệt sự phân tích và
sự cài đặt. Bởi vì ta biết rằng tốc độ xử lý của máy tính và các bộ dòch của các ngôn
ự xác đònh cần bao nhiêu micro giây chạy trên một máy tính cụ
ợc xác đònh bởi tính chất của thuật toán, còn yéu tố thứ hai
năng của máy tính. Điều này cho ta thấy rằng T(n) không
ùch tốt hơn là biểu diễn theo số các chỉ
thò t
Ví d
h
n t iện
ngữ lập trình cấp cao đều ảnh hưởng đến thời gian chạy của thuật toán, nhưng
những yếu tố này ảnh hưởng không đồng đều với các lọai máy trên đó cài đặt thuật
toán, vì vậy không thể dựa vào chúng để đánh giá thời gian chạy của thuật toán.
Chẳng hạn ta tách biệt sự xem xét có bao nhiêu phép toán so sánh trong một thuật
toán sắp xếp khỏi s
thể. Yếu tố thứ nhất dư
được xác đònh bởi tính
thể được biểu diễn bằng giây, phút được; ca
rong thuật toán.
ụ :
Xét :
for(i = 1; i < n; i++) (1)
) for(j = 1; j < n; j++) (2
Ký hiệu : T(n) là thời gian thực hiện câu lệnh (2) :
1 1 2 3 ……. . . n-1
(2) n n n n
nnT )( += nnn
naln
)1(
)1(
−=+
−
43421
L
)
- Bước thứ ba trong việc phân tích đánh giá thời gian chạy của một thuật
ët toán học với mục đích tìm ra các giá trò trung bình và
trường hợp xấu nhất cho mỗi đại lượng cơ bản. Chẳng hạn, khi sắp xếp một dãy các
phần tử, thời gian chạy to ển nhiên còn phụ thuộc vào tính chất của
như :
* Dãy c
* Dãy
của dãy có thứ tự ngẫu nhiên.
2.
toán là sự phân tích về ma
của thuật án hi
dữ liệu nhập
ó thứ tự thuận.
có thứ tự ngược.
* Các số hạng
Các ký hiệu tiệm cận
a) Ký hiệu O lớn (big – oh) :
Đònh nghóa :
Cho hàm f : N* ⎯⎯→ N
*
. Ta đònh nghóa :
O(f(n)) = {t : N* ⎯⎯→ N
*
| ∃ c∈ R
+
, ∃n
0
∈ N, ∀ n ≥ n
0
, t(n) ≤ cf(n)}
∈ ⇔ ∃ ∈ ∃n
0
∈ ∀ ≥
0
≤ cf(n) .
O(f(n)) gọi là cấp của f(n).
Với t : N* ⎯⎯→ N
*
t(n) O(f(n)) c R
+
, N, n n , t(n)
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 19 -
Nhận xét :
a) t(n) ∈ O(t(n))
) t(n)
t(n) ≤ cf(n) .
b ∈ O(f(n)) ⇒ ∃ c∈ R
+
, ∀ n ∈ N
,
Các tính chất :
Tính chất 1 :
f : N* ⎯⎯→Với mọi hàm N
*
:
∈•
)2(2
)( nnf
O
⇒ f(n) ∈ O(h(n)).
Tín h
O(g(n)) ⇔ g(n) ∈ O(f(n)) và f(n) ∈ O(g(n)).
n) ∉ O(f(n)).
⎪
⎩
⎪
⎨
⎧
∈•
⇒∈
)()(
)()(
22
nOnf
nOnf
Tính chất 2:
a) f(n) ∈ O(g(n)) và g(n) ∈ O(h(n))
b) g(n) ∈ O(h(n)) ⇒ O(g(n)) ⊆ O(h(n)).
ất 3: h c
a) O(f(n)) =
b) O(f( ) ⊂ O(g(n)) ⇔ f(n) ∈ O(g(n)) và g(n)
Tính chất 4:
a)
lim
()
()
n
fn
gn
→∞
= c ≠ 0 ⇔ O(f(n)) = O(g(n))
b) lim
()
fn
= 0 ⇒ O(f(n))
()
n
gn
→∞
⊂ O(g(n)) = O(g(n)± f(n))
Ví dụ :
- Hàm f(n) = 2n
5
+ 3n
3
+ 6n
2
+ 2 có cấp O(n
5
) vì :
lim
n
n
→∞
=≠20
5
.
- Hàm f(n) = 2
nnn+++236
532
2
n
là O(n! ) vì :
lim
!
n
n
n
→∞
=
2
0
.
- Hàm 2
n+1
∈ O(2
n
) .
b)
N ⎯⎯→ N
*
, Ta có :
:
Ký hiệu
Ω
:
Ký hiệu này dùng để chỉ chặn dưới của thời gian chạy của thuật toán
Ta đònh nghóa :
Ω (f(n)) = {t : N ⎯⎯→ N
*
| ∃ c∈ R
+
, ∃n
0
∈ N, ∀ n ≥ n
0
, t(n) ≥ cf(n)}
Tính chất 6:
Cho f, g :
f(n) ∈ O(g(n)) ⇔ g(n) ∈ Ω (f(n)).
c) Ký hiệu
θ
:
Đònh nghóa
(n)) = O(f(n)) ∩ Ω (f(n)).
ính ch át 7:
θ(f
T a
θ (g(n)) ⇔ ,d∈
n
0
∈ N, ∀ n ≥ n
0
≤ f(n) ≤ (n) .
3. ät số l các ật toa
f(n) ∈ ∃ c R
+
, ∃ , cg(n) dg
Mo ớp thu ùn
àu hết c thuật ùn được iới thiệ ng giáo h này tiệm tới một
trong các hàm sau :
Ha ác toa g u tro trìn cận
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 20 -
1 : Nếu át cả c chỉ th chương trình đều được thực hiện chỉ một vài
lần và ta nói thời gian cha ủa no ằng so
Logn hi th gian c ủa c trìn gari ïy
uộc l n trong các chương trình mà giải 1 bài tóan lớn bằng cách
chuyển ät hằng số nào
ến tính.
iải
g 1 cách độc lập, sau đó tổ hợp các lời giải.
) . 2
:
:
n \ Hàm
2
n
(1) ta ác ò của
ïy c ù là h á.
(2) : K ời hạy c hương h là Lo t. Thời gian cha
th oại này xuất hiệ
nó thành 1 bài toán nhỏ hơn, bằng cách cắt bỏ kích thước mo
đó. Cơ số Logarit có thể làm thay đổi hằng số đó nhưng không nhiều.
(3) n : Khi thời gian chạy của chương trình là tuy
(4) nLogn : Thời gian chạy thuộc loại này xuất hiện trong các chương trình
mà giải 1 bài toán lớn bằng cách chuyển nó thành các bài toán nhỏ hơn, ké đến g
quyết chún
(5) n
2
: Thời gian chạy của thuật toán là bậc 2, thường là xử lý các cặp phần
tử dữ liệu (có thể là 2 vòng lặp lồng nhau). Trường hợp này chỉ có ý nghóa thực tế
khi bài toán nhỏ.
(6) n
3
: Một thuật toán xử lý bộ ba các phần tử dữ liệu (có thể là 3 vòng lặp
lồng nhau) có thời gian chạy bậc 3. Trường hợp này chỉ có ý nghóa thực tế khi bài
toán nhỏ.
n
(7
Sau đây là các giá trò xấp xỉ của các hàm trên
n lg n Nlgn n
2
n
3
1 1 0 0 1 1 2
2 2 1 2 4 8 4
4 n 2 8 16 64 16
8 8 3 24 64 512 256
16 16 4 64 256 4096 65536
3 160 32768 2.147.483.648 2 32 5 1024
Dễ thấy rằng :
O(1) ⊂ O(lg n) ⊂ O(n) ⊂ O(nlgn) ⊂ O
Các hàm loại : 2
n
, n!, n
n
thường được gọi là các hàm loại mũ. thuật toán với
øi gian chạy có cấp hàm loại mũ thì tốc độ
Các hàm
n, Log ïi đa
thức. Thuật toán với thời gian chạy có cấp hàm đa thức thường chấp nhận được.
i chu
đánh giá độ phức tạp của thuật toán
thể c ụ thể. Giả sử thuật toán 1 đòi hỏi thời
n là
ia lớn thì
uật to án 2. Nhưng
n thu toán ïn, với C
1
= 200, toán 1
øi hỏi ời gia g khi đó thuật toá
dụ :
rực tiếp (Straight Se ection) : SSS
],. . .,x[n].
(n
2
) ⊂ O(n
3
) ⊂ O(2
n
).
thơ rất chậm.
loại : n
3
, n
2
, nLog
2
n,
2
n thường được gọi là các hàm loa
Gh ù :
Các hằng số bò bỏ qua trong biểu thức
có ó ý nghóa quan trọng trong ứng dụng c
gia C
1
n, còn thuật toán 2 đòi hỏi thời g n là C
2
n
2
. Dó nhiên là với n đủ
th án 1 nhanh hơn thuật to với n nhỏ thì có thể thuật toán 1 nhanh
hơ ật 2. Chẳng ha
n
C
2
= 10, và với n = 5, thì thuật
đo
í
th n 1000, tro n 2 chỉ có 250.
V
Thuật toán Chọn t l
Sắp xếp tăng dần dãy các khóa : x[1],x[2
Ý tưởng :
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 21 -
- Bước i chọn phần tử nhỏ nhất của
tử nhỏ nhất này cho x[i].
dãy x[i],x[i+1],. . .,x[n], đổi chỗ phần
- Lặp thao tác này với i = 1 n-1.
Thuật toán :
1 for (i =1;i <= n-1;i++)
{
2 k = i; Khởi động chỉ số của giá trò nhỏ nhất : (k
= = i)
3 a = x[i]; Lấy ra g iá trò của phần tử thứ i
4 for (j=i+1;j <= n; j++) Tìm phần tử nhỏ nhất trong mảng
x[i] x[n]
5 if (x[ j] < a)
{
6 a = x[j];
7 k = j; Giữ vò trí của phần tử nhỏ nhất
a là giá trò nhỏ nhất (Khi đó : x[k] = = a) }
8 x[k] = x[i]; Đổi vò trí của phần tử nhỏ nhất
9 x[i] = a; Cho phần tử a vò trí thứ i.
}
Độ phức tạp thuật toán:
Lệnh (1) thực hiện n lần, (Lần n để thoát khỏi for).
Mỗi lệnh (2), (3), (8), (9) thực hiện n-1 lần.
Lệnh (4) thực hiện n + (n-1) + +2 =
nn()
+
−
1
2
1
lần.
nn()
−
1
Lệnh (5) thực hiện A = (n-1)+(n-2)+ +1 =
2
lần. // So sánh
• Xét trường hợp xấu nhất :
Tức là lệnh (5) luôn thỏa điều kiện, tương ứng dãy có thứ tự ngược lại,
nn()
−
1
2
Mỗi lệnh (6), (7) thực hiện
lần.
o đó :
)
• Xét trường h
Tức là g ứng dãy có thứ tự thuận,
) và ) khô ù :
T(n) = n
+ 5n - 5 ∈ θ (n
2
).
ch thuật toán đệ qui.
D
T(n) = n + 4(n-1) + n(n+1)/2 - 1 + 3n(n-1)/2
= 2n
2
+ 4n - 5 ≤ 6n
2
.
2
T(n) ∈ θ (n
ợp tốt nhất
lệnh (5) luôn không thỏa điều kiện, tươn
(6 (7 ng thực hiện lần nào. Ta co
2
4. Phân tí
Phần lớn các thuật toán đều dựa trên sự phân rã đệ qui một bài toán lớn
thành các bài toán nhỏ, rồi dùng lời giải các bài toán nhỏ để giải bài toán ban đầu.
Thời gian chạy của thuật toán như thế được xác đònh bởi kích thước và số lượng các
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 22 -
b ùn con và giá phải trảài toa của sự phân rã. Nên các thuật toán đệ qui có thời gian
ời gian chạy cho các dữ liệu nhập có kíc
này được diễn dòch thành một công thức toán học gọi là công thức truy hồi. Do đó,
ạp cu thường phải giải các phương trình truy hồi. Có
, ta nghiên cứu các cách thường dùng sau.
A. Phương pháp thay thế
chạy phụ thuộc vào th h thước nhỏ hơn, điều
để tính
nhiều cách giải
độ phức t ûa thuật toán, ta
:
ức thường gặp sau đây được giải bằng phương pháp thay thế :
ệt qua dữ liệu nhập để bỏ bớt 1 phần tử .
T
N
= T
N-1
+ N
N-2
+ (N-1) +N
= T
N-2
3+ +(N-2) + (N-1) +N = . . .
= 1 + 2 + . . . + N
=
Dựa vào dạng truy hồi của phương trình để tính độ phức tạp của thuật toán
dực vào các kích thùc dữ liệu nhỏ hơn.
Một số công th
Công thức 1:
⎩
⎨
⎧
=
≥+
=
−
1;1
2;
1
N
NNT
T
N
N
Công thức này thường dùng cho các chương trình đệ qui mà có vòng lặp
duy
= T
2
)1( +NN
.
Công thức 2:
⎪
⎨
=
;0
2
N
T
N
⎩
=
1
huật toán đệ qui mà tại mỗi bước chia
⎪
⎧
≥+
2;1
NT
N
Công thức này thường dùng cho các t
dữ liệu nhập thành 2 phần .
Giả sử N = 2
n
, có :
.2
2
2
1
1
22
n
n
T
n
T
n
T
=
=
+
−
=
+
−
= L
T
N
= log
2
N .
Suy ra :
Công thức 3:
⎪
⎩
⎪
⎨
⎧
≥+
=
2;
2
NNT
T
N
=
1;0
N
N
Công thức này thường dùng cho các thuật toán đệ qui mà tại mỗi bước thực
hiện, chia đôi dữ liệu nhập nhưng có kiểm tra mỗi phần tử của dữ liệu nhập.
.2N
NNN
NT
N
≅+++= L
842
Công thức 4:
⎪
⎩
⎪
⎨
⎧
=
≥+
2;12
NT
N
=
1;0
2
N
T
N
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 23 -
Công thức này thường dùng cho các thuật toán theo phương pháp chia để
ò. tr
n
n
TTT
nnn −1
22
nn
n
TT
n
==++=+
−
=
+=
−
L11
2
2
1
2
1
2
2
2
1
222
n
2
2
=⇒
ình truy hồi
n
−
−2
n
nT
NNLogT
N
2
=⇒
B. Dùng phương trình đặc trưng để giải phương tr :
B1) Phương trình truy hồi tuyến tính thuần nhất với các hệ số không đổi :
Xét phương trình dạng :
0
110
=
+
+
+
−− knknn
tatata L (1)
Trong đố các
knnnit
i
−
−
= ,,1,, à các ẩn số.
(2)
=
−
−
−
0
0
1
1
1 kk
k
kn
aXaX L
X = 0 hiển nhiên là nghiệm của (2), nhưng ta quan tâm đến nghiệm của
hương trình :
(3)
Phương trình (3) gọi là phương trình đặc trưng bậc k của phương trình truy
TH1 : Tất cả các nghiệm của (3 ) đều là nghiệm đơn.
ả sử rằng
là các nghiệm đơn của (3), thì ta có thể kiểm tra
được , với c
1
, c
2
,
…
, c
k
là các hằng xác đònh
là nghiệm của (3).
ép của (3).
Với n > k, xét đa thức p bậc n :
1
XpXXXknaX
knkn
k
n −−−
=−++L
Vì u là nghiệm kép của (3), nên tồn tại đa thức r thỏa :
2
XruX −
=−++−
−− kn
k
n
knaun L
n
a (1).
lL
Đặt t
= X
n
, ta đưa (1) về dạng :
n
0)(
1
1
10
=++++
−
−−
kk
kkkn
aXaXaXaX L
⎢
⎣
+
0
k
aXa
⎢
⎡
⇔
X
=+++
p
0)(
1
1
10
=++++=
−
−
kk
kk
aXaXaXaXp L
hồi (1) .
Gi
k
XXX ,,,
21
L
∑
=
=
k
i
n
iin
Xct
1
từ k điều kiện ban đầu
TH2 : Phương trình (3 ) có nghiệm bội.
- Giả sử u là nghiệm k
)1()(
10
nanXaXq
n
−+= ))'(()(
)(Xp = )()(
Khi đó : 0)]'()([)(
2
=−=
−
XruXXXXq
kn
Do đó :
+
n
uanua 0)()1(
1
10
Tức là : t
= nu
n
cũng là nghiệm củ
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 24 -
- Tổng quát, nếu u là nghiệm bội m của (3) thì :
n n
, n
2
u
n
, . . ., n
m-1
u
n
cũng là nghiệm của (1)
i đó tổ hợp tuyến tính của c nghiệm này và các nghiệm khác của
rình đặc ưng (3) sẽ là nghiệm của (1).
0)2(8)1(6)( nTnTn
ìn :
t
n
= u , nu
Kh ác
phương t tr
Ví dụ 1 :
⎪
⎧
T =−+−−
⎪
⎩
= 2)1(T
⎨
= 1)0(T
Xét phương tr h
0)2(8)1(6)(
=
−
+
−
− nTnTnT
Đặt : X
n
= T(n)
=
Có các nghiệm :
2
= 4
Vậy
Do :
0
21
2
2
1
1
=+⇒=+⇒= ccXcXc
Ta có : 086
21
=+−
−− nnn
XXX
Phương trình đặc trưng : 6
2
+− XX 08
X
1
= 2, X
:
XcXcnT
2211
)( +=
nn
111)0(
212211
=+⇒=+⇒= ccXcXc
0
T
)1(T 24222
Vậy có :
⎩
⎨
=+ 242
21
cc
⎧
=+ 1
21
cc
⇒
.0,1
21
=
=
cc
Ví dụ 2 :
⎪
⎪
=
−−
0;0
(8)1(5
n
nTnT
⎪
⎩
2
⎪
=
1;1
n
⎨
⎧
=
≥−+−
=
2;
3);3(4)2
)(
n
nnT
nT
Ta có phương trình :
0)3(4)2(8)1(5)(
=
−
−
−
+−− nTnTnTnT
Phương trình đặc trưng tương ứng là :
0485
23
=−+− XXX
⇔ 0)2)(1(
2
=−− XX
Vậy ta có các nghiệm của phương trình đặc trưng : 1 (đơn), 2 (kép)
=++
2
122
321
21
ccc
uy ra :
Nên nghiệm chung là :
nnn
ncccnT 221)(
321
++=
Dựa vào các điều kiện đầu, ta có :
⎧
=+ 0
cc
⎪
⎩
=++ 84
321
ccc
⎪
⎨
2
1
;2;2
3
S
21
1
−==−= ccc
ậy :
1
−−
−n
n
V
2)( =
+n
nT 22
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 25 -
B2) Phư ng trì hồi tuyến tính không th
ương
ta
n
+++
−
L
ới b l thức bậc d theo n.
iến đo về da
í dụ :
3=
Ta có :
=−
+
−
3 cho (1) nhân do ;363)3(
1
1
n
nn
tt :
ược dạng thuần nhất :
ơ nh truy uần nhất với các hệ số không đổi :
Ph trình dạng :
0
ta
n
)(npbta
n
knk
=
−
11
V à hằng số, p là đa
B åi ïng thuần nhất.
V
nn
tt 2
1
−
−
n
⎢
⎢
⎣
⎡
=−
+
+
;32)2(
1
1
n
nn
tt :
của vế 2
Lấy (2) – (3), đ
065
11
=+
−
−+ nnn
ttt
5. Các phép toán trên các ký hiệu tiệm cận
a) Phép toán cộng :
θ (g(n))
θ( f(n)) + θ (g(n)) = ax(f(n),g(n))
- Đặc biệt , Nếu c là hằng số , thì :
(f(n)) (g(n))
Đặc
đánh giá thời gian thực hiện của thuật toán, ta chỉ cần
Sắp tăng dần các phần từ của dãy số x.
θ( f(n)) + θ (g(n)) = Max(θ( f(n)) ,
Nhận xét :
-
θ( f(n) + g(n)) = θ (M
θ( cf(n)) = θ( f(n))
b) Phép toán nhân :
θ θ = θ(f(n)g(n))
biệt :
θ( f(n)
2
) = (θ(f(n))
2
c) Phép toán tích cực :
Đó là lệnh trong thuật toán mà thời gian thực hiện nó không ít hơn thời gian
thực hiện các lệnh khác. Khi
quan tâm đến các bước thực hiện của phép toán này.
Ví dụ :
Dùng thuật toán chèn trực tiếp SIS (straight insertion Sort):
Ý tưởng :
Ở bước i , giả sử dãy : x[1], , x[i] đã có thứ tự. Tìm vò trí thích hợp của phần
tử x[i+1] để chèn nó vào dãy x[1], , x[i], kết quả là ta có dãy x[1], , x[i+1] có thứ
tự. Thực hiện thao tác trên với i = 1,2,, , n-1.
Thuật toán :
for (i =1; i<= n-1; i++)
{
a = x[i+1]; biến tạm a nhận giá trò của x[i+1]
x[0] = a;
j = i; Chuẩn bò cho a tiến về trái (khởi động j
While (a < x[j]) a còn < x[j], a còn tiến về trái
{
x[ j+1] = x[ j]; dời giá trò về phải
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 26 -
j = j-1; Chuẩn bò cho a tiến tiếp về trái
} a ≥ x[j]
x[j+1] = a; Chèn x[i+1] vào vò trí thích hợp - là sau
x[j].
}
Có thể xem phép toán tích cực ở đây là : a< x[j];
Trong trường hợp xấu nhất, tương ứng dãy giảm dần. Số lần thực hiện của
phép toán này là :
2
⋅ ⋅ ⋅ + n =
1
2
)1
+
(
−
+
nn
.
Vậy : T(n)
∈ θ (n
2
).
Trong trường hợp tốt nhất, tương ứng dãy tăng dần.Số lần thực hiện của
phép toán này là : n - 1
Vậy : T(n)
∈ θ (n).
6. Phân tích trường hợp trung bình
Ta biết rằng thời gian thực hiện thuật toán không phải chỉ phụ thuộc vào
ích thước dữ liệu mà còn phụ thuộc vào tình trạng dữ liệu nhập nữa. Chẳng hạn,
c l
õn khả năng tốt nhất hoặc xấu nhất của thuật
Bây giờ ta phân tích trong trường hợp ngẫu nhiên, tức là đánh giá độ phức
øi g thực hiện thuật oa .
Việc đánh giá trung bình thường khó và phức tạp đòi hỏi những công cụ
toán học tinh vi, hơn nữa việc tính trung bình có thể có nhiều cách quan niệm khác
nhau.Ở đây, việc đánh giá độ phức tạp thuật toán trong trường hợp trung bình ta
dựa trên cơ sở lý thuyết xác suất ( rời rạc ) .
í dụ
k
khi xếp tăng dần một dãy các số nguyên, thì các số đã có sẵn thứ tự tăng dần, hoặc
ngượ ại, hoặc ngẫu nhiên.
Phần trên ta đã xét trong như g
toán .
tạp trung bình thơ ian t ùn
V :
rí có thể chèn
x[i+1].
ûa mỗi vò trí được x[i+1] chèn vào là đồng đều. Tức là xác
Xét thuật toán chèn trực tiếp .
Xét bước thứ i của vòng lặp. Danh sách có i phần tử đã được sắp. Phần tử
x[i+1] có thể chèn vào i-1 khe giữa các x[j], j
∈ {1, i} và thêm 2 vò trí đầu cuối
nữa (Chèn trước x[1] và chèn sau x[i] ), tổng cộng là có i+1 vò t
Giả sử khả năng cu
suất của mỗi vò trí được x[i+1] chèn vào là
1+i
.
Gọi X
1
i
là biến ngẫu nhiên chỉ số lượng các phép toán so sánh cần thiết để
x[i+1] chèn vào vò trí thích hợp của nó trong mỗi bước. Ta có :
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 27 -
X
1
X
2
X
i
i+1 i 3 2 1
Vò trí
(Từ phải sang trái)
I i 3 2 1
X
i
1
1
+i
1
1
+i 1
1
+i 1
1
+
i
1
1
p
+
i
11
11
3
1
1
2
1
1
1)(
+
+
+
⋅++
+
+
+
+
+
=
i
i
iii
i
XE
L
1 ii
12
12
)1(
1
1
))1(21(
1
1
++−+++
+
=
iii
i
L
+
+=
+
+
+
⋅=
ii
i
iii
Nếu gọi Y là biến ngẫu nhiên xác đònh bởi tổng các so sánh trong sắp xếp
thì :
Y = X
1
Ta có :
E(Y) =
+
i
i
+ X +
2
⋅
⋅
⋅
+X
n-1
∑
−
=
E
1n
1i
)(
i
X
=
∑∑
−− 11 nn
ii
∑∑
−
=
−
=
+
−+=
1
1
1
1
)
1
1
1(
2
1
n
i
n
i
i
i
==
+
+
11
12
ii
i
n
n
n
nn
−+
−
⋅=
∑
1)1(1
i
i
H
nn
−+=
3
2
=
44
22
1
Trong đó :
∑
=
n
H
1
≤ lgn + 1 ; ( H
=
n
ic bậc n .)
i
i
1
Nên giá trò trung bình của các phép toán so sánh trong thuật toán tương
đương với
n
là số Harmon
n
2
, Vậy độ phức tạp trung bình của thuật toán là θ (n
2
4
).
V. Tối ưu thuật toán
Tiến trình tổng quát của việc tạo ra các sửa đổi ngày càng tiến bộ hơn cho
một thuật toán để sinh ra một phiên bản khác chạy nhanh hơn được gọi là tối ưu
thuật toán. Khi tối ưu một thuật toán ta thường dựa vào một nguyên lý, đó là
nguyên lý Profile : “ Tìm điểm mất thời gian nhiều nhất của thuật toán “.
Một số kỹ thuật sau thường dùng để tối ưu thuật toán :
1. Kỹ thuật tối ưu các vòng lặp
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 28 -
Đây là điểm quan tâm đầu tiên khi cải tiến thuật toán, vì vòng lặp là câu
änh thường làm tăng độ phức tạp của thuật toán. Việc cải tiến tập trung vào :
-
- trong một bước lặp để giảm số lượng các bước lặp.
ùch các lệnh không phụ thuộc vào chỉ số lặp ra khỏi vòng lặp.
:
le
Cố gắng giảm các vòng lặp lồng nhau.
Tăng số lệnh thực hiện
- Ta
. . .
Ví dụ 1
thuật toán tính giá trò của e
x
theo công thức gần đúng :
Xét
x
i
x
xx
n
i
i
n
!!
≥
∑
=++ ++ +
0
2
1
2
LL
!
huật t án 1 :T o { Tính từng số hạng rồi cộng lại.}
In ,put x n
∑
Ouput S =
n
i
x
=
; i<= n;i++)
{
p = 1;
S = S + p;
Ta thấy nó thực hiện được : 1+2+. . .+n =
i
i
1
!
.
Mô tả :
S = 1;
for( i = 1
for (j:= 1; j <= i ;j++ )
p = p*x/j;
}
Ta có thể coi phép toán tích cực ở đây là phép p := p*x/j .
nn()
+
1
2
lần.
)
∈ θ (n
2
).
Nên T(n
Thuật toán 2 :
Ta xem xét vòng lặp trong có cần thiết hay không ?
g lặp trong được dùng để tính
!i
x
i
Nhận xét rằng vòn , nhưng mỗi số hạng
ong to g, số å được tính dựa vào số hạng trước : tr ån hạng sau có the
x
⋅=
;
2!1!2
xx
2
;
L
nnn
−
)!1(!
xxx
⋅=
nnn −1
!i
x
i
Nên vòng lặp trong có thể bỏ đi vì có thể tính theo công thức trên. Vậy
u : thuật toán có thể viết lại như sa
S = 1;
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 29 -
p = 1;
for( i = 1; i<= n;i++)
{
p = p*x/i; //
!i
x
i
S = S + p;
}
Chẳng hạn có thể coi phép toán tích cực ở đây là phép p := p*x/i .
θ (n).
Do đó : T(n)
∈
Ví dụ 2 :
Ta xét thuật toán nhân 2 ma trận vuông cấp n.
1 :
put a,b
∈
Nh
+
n; k++)
c[i][j]
Theo TT1, mỗi lần ta chỉ tính 1 phần tử c[i][j] trong vòng lặp theo k. Giờ ta
trong trường hợp n chẵn, tính một lần 4 giá trò :
[i][j] c[i][j+1]
[i+1][j] c[i+1][j+1]
c[i][j] c[i][jj]
c[ii][j] c[ii][jj]
T2 :
han2(a,b,c)
≡
i = 1;
while (i < n)
{
ii = i+1;
j = 1;
while ( j < n )
{
jj = j+1;
c[i][j] = 0;
c[i][jj] = 0;
TT
In
)(nMat
N
Output c
∈ )(nMat
N
an1(a,b,c) ≡
for(i =1; i<=n; i+ )
1; j <= n; j++) for(j =
{
c[i][j] = 0;
for (k = 1; k <=
+= a[i][k]*b[k][j];
}
cải tiến,
c
c
T
N
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 30 -
c[ii][j] = 0;
c[ii][jj] = 0;
k = 1;
while (k < n)
{
kk = k+1;
c[i][j] = c[i][j] + a[i][k]*b[k][j] + a[i][kk]*b[kk][j];
c[ii][j] = c[ii][j]+a[ii][k b[kk][j];
c[ii][jj] = c[ii][j a[ii] b[k][jj] +
k = k+2;
j + 2;
i = i + 2;
hi n cha bước nhảy
Tối vie ẽ nhánh
c[i][jj] = c[i][jj]+a[i][k]*b[k][jj] + a[i][kk]*b[kk][jj];
]*b[k][j] + a[ii][kk]*
j]+ [k]*
a[ii][kk]*b[kk][jj];
}
j =
}
}
}
Giả t ết ün vì ta dùng 2
2. ưu äc r
- ái vơ kết hợp bằng ép toán &&, nên viết theo thứ tự xác
át sa ảm dần :
&& A
n
ác su c A
i
giảm dần .
- ái vơ ểu thức logic kết hợp bằng phép toán ||, nên viết theo thứ tự xác
ất đúng giảm dần :
A
1
|| A
2
|| || A
n
Đo ùi biểu thức logic ph
sua i gi
A
1
&& A
2
&&
X ất sai của cá
Đo ùi bi
su
Xác suất đúng của các A
i
giảm dần :
. . .
BÀI TẬP
Bài 1 :
của các thuật toán sau :
Xác đònh độ phức tạp
gt (n) ≡
if (n == 0 || n == 1)
return 1;
else
return (n * gt(n-1)) ;
r = m%n;
while(r)
{
m = n;
n = r;
r = m%n;
}
return n
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 31 -
ài 2
B :
c thuật toán sau trong trường hợp tốt nhất, xấu nhất :
Min = a[i];
Csmin = i ;
Max = a[n-i+1];
Csmax = n-i+1;
for (j = i ;j <= n-i+1; j++)
{
if (a[j] < Min)
{
Min = a[j];
csmin = j ;
}
if (a[j] > Max)
{
Max = a[j];
csmax = j;
}
}
Hoán vò a[i] và a[csmin];
if (csmax != i)
Hoán vò a[csmax] và a[n-
I+1];
}
else
{
Hoán vò a[csmax] và a[n-
I+1];
Hoán vò a[i] và a[csmin];
}
}
Tính độ phức tạp của cá
for (i = 1; i <= n/2; i++)
{
if (csmin == n-i+1)
{
Bài 3 :
Tính thời gian thực hiện trung bình của các phép toán so sánh trong các
thuật toán :
1. Đổi chỗ trực tiếp.
2. Chọn trực tiếp.
Bài 4 :
Xác đònh T(n) , với :
Fib(n) ≡
if ( n < 2 )
return 2;
else
return Fib(n-1)+Fib(n-2);
Fibo(n) ≡
i = 1; j = 0;
for( k =1 → n)
{
j = i + j;
i = j – i;
}
return j;
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -
Sưu tầm bởi:
www.daihoc.com.vn
Thiết kế và đánh giá thuật toán - 32 -
1.
⎪
⎨
⎧
=
>=−−−
1)0(
1,0)2(48)1(3)(
T
nnTnTnT
⎪
⎩
=
2)1(
T
2.
⎪
⎩
= 1)1(
2
T
⎧
−+−=
),2()1()(
nnTnTnT
⎪
⎨
⎧
> 1), n
n
.
⎪
⎨
>
0(
1
T
.
⎪
⎨
⎧
>+
0(
1;1)1
T
n
Bài 5
+= (4)( TnnT
3
⎪
⎩
=
=
1)1(
1)
T
−=
(2)(
nTnT
4
⎪
⎩
=
=
1)1(
0)
T
:
Cải tiến thuật øng phương pháp tìm kiếm
nhò phân để xác đònh
đã có thứ tự a
1
,…, a
i-1
.
Thuật toán ca ò phân. Hãy thiết kế, cài đặt và đánh giá
độ phức tạp thời gian
Bài 6
toán chèn trực tiếp bằng cách : Du
vò trí cần chèn của a
i
trong dãy con
ûi tiến gọi là chèn nh
của thuật toán.
:
Tìm các ví du bằng cách nào đó ), số lần
thực hiện của thuật toán giả tiệm cận, hoặc về tỉ lệ )
ï về các thuật toán mà khi cải tiến (
m đáng kể ( về độ phức tạp
Trần Tuấn Minh Khoa Toán-Tin
Simpo PDF Merge and Split Unregistered Version -