You are on page 1of 43

Wednesday, December 6, 2023  11:23:27 AM

Phâ n tích thuậ t toá n


Cá c đặ c trưng củ a thuậ t toá n
Kỹ thuậ t đá nh giá thuậ t toá n
Mô hình máy trừ u tượ ng
Tố c độ tă ng củ a hà m
Phâ n tích thờ i gian thự c hiện giả i thuậ t
© Lê Minh Hoà ng. All Rights Reserved.
Từ bà i toá n tớ i chương trình

Bà i toá n Chương trình


Xây dự ng cấ u trú c dữ liệu

Mô hình hó a Thiết kế Lậ p trình Kiểm thử


thuậ t toá n

2
Cá c đặ c trưng củ a thuậ t toá n
Tính đơn nghĩa
Cá c thao tá c phả i rõ rà ng, khô ng gây nhậ p nhằ ng, lộ n xộ n, tù y tiện, đa nghĩa.
Tính đú ng
Thuậ t toá n phả i cho kết quả mong muố n
Tính dừ ng
Thuậ t toá n khô ng đượ c rơi và o quá trình vô hạ n, phả i dừ ng lạ i và cho kết quả sau mộ t số hữ u hạ n
bướ c.
Tính phổ dụ ng
Thuậ t toá n dễ sử a đổ i để thích ứ ng vớ i yêu cầ u mớ i
Tính khả thi
Kích thướ c nhỏ , chạy trong thờ i gian cho phép, cà i đặ t đượ c trên máy
3
Tính đú ng đắ n củ a thuậ t toá n
Bà i toá n
Cho dãy và mộ t giá trị
Tìm phầ n tử đầ u tiên
Ý tưở ng về thuậ t toá n tìm kiếm nhị phâ n
Khoanh vù ng phạ m vi tìm kiếm
So sá nh vớ i phầ n tử đứ ng giữ a
Thu hẹp mộ t nử a phạ m vi tìm kiếm
4
Thuậ t toá n tìm kiếm nhị phâ n
input → a[0 … n-1], x; Tính bấ t biến lặ p (*)
i = 0; j = n - 1; Mọ i phầ n tử đứ ng trướ c (nếu có )
while (i ≤ j) đều
{
Mọ i phầ n tử đứ ng sau (nếu có ) đều
k = (i + j) / 2;
Chứ ng minh
if (a[k] < x) i = k + 1;
else j = k - 1; (*) đú ng trướ c vò ng lặ p
} Nếu (*) đú ng trướ c mộ t lượ t lặ p thì
if (i < n) output ← a[i]; sau lượ t lặ p đó (*) vẫ n đú ng
else output ← Not found; Cuố i cù ng (*)  ĐPCM

5
𝑖 𝑗
𝑎0 𝑎𝑛−1
i = 0; j = n - 1;
while (i ≤ j) (*)
{
k = (i + j) / 2; Đứ ng trướ c 
if (a[k] < x) i = k + 1;
else j = k - 1; Đứ ng sau 
}
if (i < n) output ← a[i]; (*) đú ng khi bướ c
else output ← Not found;
và o vò ng lặ p ()
6
𝑖 𝑘 𝑗
¿𝑥 𝑎𝑖 𝑎𝑘 𝑎𝑗 ≥𝑥
i = 0; j = n
¿
- 1;
𝑥
(*)
while (i ≤ j)
{ Đứ ng trướ c 
k = (i + j) / 2; Đứ ng sau 
if (a[k] < x) i = k + 1;
else j = k - 1; Trướ c mộ t lầ n lặ p (*) đú ng
} thì sau lầ n lặ p (*) cũ ng đú ng
if (i < n) output ← a[i];
else output ← Not found;
Nếu …

7
𝑖 𝑘 𝑗
¿𝑥 𝑎𝑖 𝑎𝑘 𝑎𝑗 ≥𝑥
i = 0; j = n - 1;
≥𝑥
(*)
while (i ≤ j)
{ Đứ ng trướ c 
k = (i + j) / 2; Đứ ng sau 
if (a[k] < x) i = k + 1;
else j = k - 1; Trướ c mộ t lầ n lặ p (*) đú ng
} thì sau lầ n lặ p (*) cũ ng đú ng
if (i < n) output ← a[i];
else output ← Not found;
Nếu …

8
𝑗𝑖
¿ 𝑥 𝑎 𝑗 𝑎𝑖
i = 0; j = n - 1;
≥𝑥
(*)
while (i ≤ j)
Đứ ng trướ c 
{
Đứ ng sau 
k = (i + j) / 2;
if (a[k] < x) i = k + 1; Hiệu số giả m sau mỗ i lầ n lặ p,
else j = k - 1; vò ng lặ p kết thú c khi
}
(*): Mọ i phầ n tử đứ ng trướ c đều
if (i < n) output ← a[i];
(*): Do đứ ng sau 
else output ← Not found;
 là phầ n tử đầ u tiên
9
Đá nh giá giả i thuậ t
Tìm cá ch đá nh giá , ướ c lượ ng nguồ n tà i
nguyên cầ n phả i có khi thự c thi chương
trình cà i đặ t giả i thuậ t đó .
Tà i nguyên: thờ i gian, bộ nhớ , số lượ ng bộ
vi xử lý, tố c độ đườ ng truyền mạ ng…
10
Giả i thuậ t ≠ Chương trình
Đánh giá chương trình Đánh giá giải thuật
Thự c hiện sau khi cà i đặ t Thự c hiện trướ c khi viết
chương trình trên mộ t máy cụ
chương trình
thể
Nhằ m xá c định tính khả thi
Thử chạy vớ i mộ t và i bộ dữ liệu
cụ thể, đo thờ i gian thự c hiện, củ a giả i thuậ t, chọ n thuậ t
lượ ng bộ nhớ chiếm dụ ng trong toá n tố t nhấ t để cà i đặ t
trườ ng hợ p cụ thể
11
Tạ i sao cầ n đá nh giá giả i thuậ t
Giả sử
Tố c độ máy tính = ∞
Bộ nhớ máy tính = ∞ (miễn phí)
Có cầ n họ c về thuậ t toá n?

Vẫ n phả i tìm thuậ t toá n giả i quyết bà i toá n, chứ ng minh tính đú ng đắ n
và tính dừ ng củ a thuậ t toá n
Tuy vậy, ta có thể chọ n thuậ t toá n dễ cà i đặ t nhấ t để lậ p trình
12
Tạ i sao cầ n đá nh giá giả i thuậ t
Thự c tế
Tố c độ máy tính ngày cà ng nhanh, nhưng khô ng bao giờ là ∞
Bộ nhớ máy tính ngày cà ng rẻ, nhưng khô ng bao giờ trở thà nh miễn phí
⟶ Cầ n đá nh giá hiệu suấ t thuậ t toá n
Ví dụ :
Tìm kiếm trong dãy 1 tỉ phầ n tử đã sắ p xếp, tố c độ máy: 1 triệu phép so sá nh /
giây
Thuậ t toá n tìm kiếm tuầ n tự : 17 phú t
Thuậ t toá n tìm kiếm nhị phâ n: 30 micro giây
13
Tiêu chuẩ n “tố t” củ a giả i thuậ t
Giả i thuậ t cà i đặ t “ngắ n” khô ng hẳ n là “tố t”.
Đá nh giá giả i thuậ t thô ng qua chương trình: khó kiểm chứ ng
do có nhiều yếu tố khá c ả nh hưở ng tớ i chương trình:
Phầ n cứ ng
Phầ n mềm
Ngườ i lậ p trình
Tình trạ ng dữ liệu
14
Độ phứ c tạ p tính toá n
Quan sá t
Dữ liệu cà ng lớ n ⟶ chi phí (về thờ i gian, bộ nhớ …) cà ng lớ n
Dữ liệu kích thướ c . Chi phí là mộ t hà m xá c định dương
Phâ n tích độ phứ c tạ p tính toá n
Thự c hiện trên mô hình máy trừ u tượ ng.
Độ c lậ p vớ i phầ n cứ ng cụ thể.
Bả n chấ t: Khả o sá t tố c độ tă ng củ a theo tố c độ tă ng củ a .
Cá c tiêu chí đá nh giá
Độ phứ c tạ p tính toá n về mặ t thờ i gian: Thờ i gian thự c hiện giả i thuậ t
Độ phứ c tạ p tính toá n về mặ t khô ng gian: Lượ ng bộ nhớ cầ n huy độ ng trong giả i thuậ t
15
Ký phá p
: Kích thướ c dữ liệu, 𝑐 2 𝑓 ( 𝑛)

: Thờ i gian thự c hiện,


𝑇 (𝑛)
: Hà m xá c định dương
𝑐 1 𝑓 ( 𝑛)

Nếu 𝑛0

16
Ký phá p
: Kích thướ c dữ liệu, : 𝑐𝑓 ( 𝑛 )

Thờ i gian thự c hiện, :


Hà m xá c định dương
𝑇 (𝑛)

Nếu 𝑛0

17
Ký phá p
: Kích thướ c dữ liệu, : 𝑇 (𝑛)

Thờ i gian thự c hiện, :


Hà m xá c định dương
𝑐𝑓 ( 𝑛 )

Nếu 𝑛0

18
Chứ ng minh Nếu
𝑐𝑓 ( 𝑛 )

Chọ n

𝑇 (𝑛)

𝑛0

19
Chứ ng minh Nếu

𝑇 (𝑛)
Chọ n

𝑐𝑓 ( 𝑛 )

𝑛0
20
Chứ ng minh Nếu
𝑐𝑓 ( 𝑛 )

𝑇 (𝑛)

𝑛0

21
Tố c độ tă ng củ a hà m
Ký pháp o nhỏ Ký pháp omega nhỏ

Nếu sao cho: Nếu sao cho:

22
Cá c hà m thô ng dụ ng để đá nh giá
Hà m lấy sà n và lấy trầ n
Hà m đa thứ c
Hà m mũ
Hà m logarithm
Hà m giai thừ a
Hà m Fibonacci:
Hà m lũ y thừ a lặ p, hà m logarithm lặ p, hà m ackermann
23
Mộ t số cô ng thứ c
Xét ký phá p
Quy tắ c bỏ hằ ng số :
Quy tắ c lấy max:
Quy tắ c cộ ng:
Quy tắ c nhâ n:
24
Nếu là đa thứ c bậ c củ a , viết thay vì trong ký phá p đá nh giá

Nếu ta có thể vết (khô ng cầ n cơ số logarithm) trong ký phá p


đá nh giá

Nếu thờ i gian thự c hiện giả i thuậ t khô ng phụ thuộ c kích thướ c
dữ liệu, ta có thể ký hiệu thờ i gian thự c hiện giả i thuậ t là hay
Về tố c độ tă ng

25
Phép toá n tích cự c (PTTC)
là phép toá n có thờ i gian thự c hiện hằ ng số
Tổ ng thờ i gian thự c hiện phép toá n là
Vớ i mọ i phép toá n khá c thì
Thờ i gian thự c hiện giả i thuậ t có thể đá nh giá qua
Bả n chấ t: Thay vì đá nh giá , ta đá nh giá vì chú ng
tương đương
26
Tính giá trị đa thứ c
Cho đa thứ c:

Input: Dãy , giá trị


Output: Giá trị
27
input → a[0...n], x;
Thuậ t toá n 1: Tính riêng từ ng s = 0;
hạ ng tử rồ i cộ ng lạ i for (i = 0; i <= n; i++)
{
Số lầ n thự c hiện phép toá n
t = a[i];
tích cự c: for (j = 1; j <= i;
: 0 lầ n j++)
: 1 lầ n t *= x;
… s += t;
: lầ n }
output ← s;
Tổ ng cộ ng:
28
Thuậ t toá n 2: Tính theo cô ng thứ c
Horner
input → a[0...n], x;
s = 0;
for (i = n; i >= 0; i--)
s = s * x + a[i];

output ← s;

Số lầ n thự c hiện phép toá n tích


cự c: lầ n
Thờ i gian thự c hiện giả i thuậ t:
29
Đá nh giá theo tình trạ ng dữ liệu
Khô ng gian cá c bộ dữ liệu kích thướ c
, gọ i là thờ i gian thự c hiện vớ i dữ liệu và o
Thờ i gian thự c hiện lâ u nhấ t trên mộ t bộ dữ liệu củ a :
Thờ i gian thự c hiện nhanh nhấ t trên mộ t bộ dữ liệu củ a :
Thờ i gian thự c hiện trung bình trên cá c bộ dữ liệu củ a :
Đá nh giá thờ i gian thự c hiện giả i thuậ t qua tố c độ tă ng củ a hà m , và
gọ i là đá nh giá trong trườ ng hợ p xấ u nhấ t, tố t nhấ t và trung bình.

30
Thuậ t toá n tìm kiếm tuầ n tự
Bà i toá n
Cho và mộ t giá trị
Tìm phầ n tử đầ u tiên
Thuậ t toá n tìm kiếm tuầ n tự :
Thử so sá nh vớ i lầ n lượ t
Dừ ng lạ i ngay khi gặ p
31
Thuậ t toá n tìm kiếm tuầ n tự
input → a[0…n-1], x;
Phép toá n tích cự c:
i = 0;
while (i < n && a[i] Phép so sá nh
< x)
Trườ ng hợ p tố t nhấ t
++i;
if (i < n) output ← : (1 PTTC).
a[i]; Trườ ng hợ p xấ u nhấ t
else output ← Not
found; : ().
32
Giả sử chắ c chắ n vớ i xá c suấ t tìm thấy input → a[0…n-1], x;
ở mọ i vị trí như nhau… i = 0;
: Số lầ n thự c hiệ n PTTC while (i < n && a[i] <
Nếu : lầ n
x)
Nếu : lầ n
++i;

Nếu : lầ n
if (i < n) output ←
Xá c suấ t để là a[i];
Trung bình số PTTC bằ ng giá trị kỳ else output ← Not
vọ ng củ a biế n ngẫ u nhiê n 𝑛 𝑛
found;
1 1 𝑛 ( 𝑛+1 ) 𝑛+1
𝐸 [ 𝐶 ] =∑ 𝑃𝑟 𝑖 𝑐 𝑖 = ∑ 𝑖= =
𝑖=1 𝑛 𝑖=1 𝑛 2 2
33
Có thể input → a[0…n-1], x;
i = 0;
TH 1: : số PTTC bằ ng TH tố t
while (i < n && a[i] < x)
nhấ t.
++i;
TH 2: : số PTTC trung bình bằ ng if (i < n) output ← a[i];
TH 3: : số PTTC bằ ng TH xấ u else output ← Not found;
nhấ t.
TH1 TH2 TH3

−∞

Pr=0.5
𝑎0

Pr=0.0
𝑎 𝑛 −1

Pr=0.5
+∞
𝐸 [𝐶 ]
34
Đá nh giá giả i thuậ t chia để trị
Giả i thuậ t chia để trị
Giả i bà i toá n mang bả n chấ t đệ quy
Phâ n rã bà i toá n lớ n thà nh cá c bà i toá n con đồ ng dạ ng
Phố i hợ p nghiệm củ a cá c bà i toá n con để đượ c nghiệm củ a bà i toá n lớ n
Mộ t số cá ch cà i đặ t giả i thuậ t chia để trị: Giả i thuậ t đệ quy (QuickSort, thá p Hà
Nộ i...), Quy hoạ ch độ ng, Tham lam,…
Đá nh giá giả i thuậ t chia để trị
đượ c cho bở i cô ng thứ c truy hồ i
đượ c tính qua cá c vớ i
35
Đá nh giá TT tìm kiếm nhị phâ n
input → a[0…n-1], x;
i = 0; j = n - 1; Tư tưở ng: Sau mỗ i bướ c lặ p,
while (i ≤ j)
{ phạ m vi tìm kiếm () thu gọ n
k = (i + j) / 2;
if (a[k] < x) i = k lạ i cò n mộ t nử a ()
+ 1;
else j = k - 1; Cô ng thứ c truy hồ i
}
if (i < n) output ←
a[i];
else output ← Not found;

36
Đoá n:
Cầ n chứ ng minh vớ i mộ t sự lự a chọ n hằ ng số và
ngưỡ ng
CM quy nạ p: chọ n và là m TH cơ sở , giả sử điều cầ n
CM đú ng vớ i Ta chứ ng minh vớ i

Chọ n lớ n á t đi đạ i lượ ng , ta có
37
Đoá n:
Cầ n chứ ng minh vớ i mộ t sự lự a chọ n hằ ng số
và ngưỡ ng
CM quy nạ p:

Chọ n để nhỏ hơn đạ i lượ ng , ta có


38
Định lý Master
Cô ng thứ c truy hồ i có dạ ng

có thể là hay đều đượ c


Liên hệ vớ i thuậ t toá n chia để trị
Thuậ t toá n chia để trị phâ n rã bà i toá n lớ n kích thướ c thà nh bà i toá n con kích
thướ c
Đi giả i cá c bà i toá n con theo phương phá p tương tự (chia để trị)
Sau đó phố i hợ p nghiệm củ a cá c bà i toá n con lạ i để đượ c nghiệm củ a bà i toá n
lớ n, thờ i gian phố i hợ p nghiệm là
39
Định lý Master
Cô ng thứ c truy hồ i có dạ ng

có thể là hay đều đượ c


Khi đó :
Nếu vớ i hằ ng số , thì
Nếu thì
Nếu vớ i hằ ng số và vớ i hằ ng số và vớ i mọ i giá trị đủ lớ n thì
40
Đá nh giá bù trừ
Bà i toá n

Hãy cho biết chỉ số nhữ ng phầ n tử củ a dãy có mặ t trong dãy .


Sử dụ ng thuậ t toá n tìm kiếm nhị phâ n
Xét lầ n lượ t cá c phầ n tử trong dãy
Vớ i mỗ i phầ n tử , dù ng thuậ t toá n tìm kiếm nhị phâ n xá c định phầ n tử đó
có trong dãy khô ng?
41
Đá nh giá bù trừ
Bà i toá n

Hãy cho biết chỉ số nhữ ng phầ n tử củ a dãy có mặ t trong dãy .


Sử dụ ng thuậ t toá n tìm kiếm tuầ n tự
Duyệt cá c chỉ số trong dãy , tạ i mỗ i bướ c
Tìm phầ n tử đầ u tiên trong dãy mà bằ ng thuậ t toá n tìm kiếm tuầ n tự . Xá c định
có bằ ng khô ng?
Bướ c sau, việc tìm kiếm sẽ tiếp tụ c từ vị trí chứ khô ng cầ n tìm từ đầ u dãy
42
input → a[0...n - 1], Phép toá n tích cự c thự c hiện bao
b[0...n - 1], nhiêu lầ n thì tă ng lên bấy nhiêu đơn
x; vị
i = 0;
khở i tạ o bằ ng 0 và đến khi kết thú c
for (q = 0; q < n; ++q)
thuậ t toá n, giá trị củ a khô ng vượ t quá
{
Số lầ n thự c hiện phép toá n tích cự c
while (i < n && a[i] <
b[q]) (++i) khô ng vượ t quá

++i; Thờ i gian thự c hiện giả i thuậ t


if (i < n && a[i] == Mỗ i lầ n tìm kiếm tuầ n tự (đá nh giá bù
b[q]) trừ (). Tố t hơn thuậ t toá n tìm kiếm
output ← b[q]; nhị phâ n
}
43

You might also like