TRUONG DAI HOC CONG NGHE THONG TIN KHOA KHOA HOC MAY TINH BAI TAP MON PHAN TICH VA THIET KE THUAT TOAN HOMEWORK #03: DO PHUC TAP VA CAC KY HIEU TIEM CAN GV hướng dẫn: Huỳnh Thị Thanh
Trang 1
TRUONG DAI HOC CONG NGHE THONG TIN
KHOA KHOA HOC MAY TINH
BAI TAP MON PHAN TICH VA THIET KE THUAT TOAN
HOMEWORK #03: DO PHUC TAP VA CAC KY HIEU TIEM CAN
GV hướng dẫn: Huỳnh Thị Thanh Thương
Nhóm thực hiện:
2 Thái Ngọc Quân 22521189
3 Nguyễn Phú Tài 22521280
4 Huỳnh Nhật Minh 22520862
TP.HCM, ngày 29 tháng 4 năm 2024
Trang 21 Bài tập 1
Quy ước: Mỗi tháng có 30 ngày, mỗi năm có 365 ngày
Bảng kết luận:
1 second | 1 minute 1 hour 1 day 1 month Ì year 1 century
log n 2105 26x10 23.6+100 8.641010 22.59+10°2 23.1510°2 23.1510
vn 10 3.6 * 1012 | 1.3 + 10 | 7.46 x 102! | 6.72 + 1022 | 9.95 x 1028 | 9.95 x 1079
n 108 6* 10" | 3.6x10? | 8.64% 10° | 2.59 x 1012 | 3.15 x 1013 | 3.15 x 1018 nlogn | 6.24 + 101 | 2./8x+108 [1.33 x108 | 2.76 «10° | 7.19 x 1019 | 7.98 x 101 | 6.86 x 1013
Giải thích: Đề yêu cầu xác định giá tri n lớn nhất của thuật toán có thể giải trong thời gian
t, vi f(n) là thời gian giải quyết bằng thuật toán đó (tính bằng micro giây) Ta có thể tìm bằng cách giải phương trình ƒ(n) = ‡
Vì một số phương trình quá khó giải ra nghiệm chính xác như moợøn hay n! nén stt dung code
để xấp xỉ nghiệm Ý tưởng chính là dùng phương pháp tìm kiếm nhị phân để tìm kiếm trong
khoảng 0 đến k (với k đủ lớn để tìm thấy xấp xỉ nghiệm)
Code bằng python:
1mport math
# Hàm tính log 2(n)
def log2(n):
return math.log(n) / math.log(2)
# Danh sách các hàm ƒ(n)
complexities = [lambda n: math.sqrt(n),
lambda n: n,
lambda n: n * log2(n),
Trang 3lambda n: 2 ** n,
lambda n: math.factorial(n)]
# Gidt han trén k cho moti ham, dd Lén dé tim dudc nghiém
max_bound = [1e40, 1e20, 1e20, 1e10, 1e10, 100, 100]
# Thời gian thực thú
times = [1000 * 1000, # 1 second
1000 * 1000 * 60, # 1 minute
1000 * 1000 * 60 * 60, # 1 hour
1000 * 1000 * 60 * 60 * 24, #1 day
1000 * 1000 * 60 * 60 * 24 * 30, # 1 month
1000 * 1000 * 60 * 60 * 24 * 365, #1 year
1000 * 1000 * 60 * 60 * 24 * 365 * 100] #1 century
# Logn = t co thé giải ma n = 2ˆt, để tránh uượt qua gidi han tinh toán nên
# dua truc tiép t vao két quad in ra
print(' '.join(map(lambda v: !2^(' + !{:.2e}'.format(v) + ')', times)))
# Duyét qua các hàm phúc tap
for k in range(len(complexities)):
c = complexities [k]
vals = []
# Duyệt qua tưng mốc thời gian để tầm nghiệm tương ting udi ham phúc tap for t in times:
# St dung tim kiém nhi phan
# Khdi tao left, right cdu tim kiém nhi phan
1, r = 0, int (max_bound [k] )
# Khdi tao max_n dé luu gid tri lén nhét cia n thỏa phương trinh
max_n = 0
Trang 4mid = (1 + r) //2
# Tính thồi gian thực thú của hầm phúc tạp
val = c(mid)
# Néu gid tri nay la vd cing hodce Lớn hon thai moc thdi gian t thi dat lai
# gidi han trén, néu không thà đặt Lại qiối hạn dudt
if val == float('inf') or val > t:
r=mid- 1
else:
1 =mid + 1
max_n = max(max_n, mid)
vals append (max_n)
# In ra céc gid tri n tuong ting vdi moc thồi gian
if k < 3:
print(' '.join(map(lambda v: '{:.2e}'.format(v), vals)))
else:
print(' '.join(map(lambda v: str(int(math.floor(v))), vals)))
2 BAi tập 2
Với mỗi nhóm hàm bên dưới, hãy sắp xếp tăng dần "theo Big-O nhỏ nhất", có giải thích ngắn gọn cách so sánh
Group 1:
fn) = (sto)
fo(n) = ni fx(n) =~
fa(nn) = 10° nr
fs(n) = nlogn
Trang 5h(n) = rl — n(n — 1)(n — 2) (n — 99)(r — 100)!
n(n — 1)(n — 2) (n — 99)
nh 100
~ Toor = O(n”)
fo(n) = ni = O(n!)
ƒs(n) = - =nt= O(n")
fa(n) = 10! n = O(n')
fs(n) = nlogn = O(n'*") (logn < n°, ¢ vat bé)
= lã < qi< < ƒU <5
Group 2:
fi (n) — am
fo(n) = 2100000
fa(n) = () fa(n) = n/n
Ta có:
ft (n) = 2210een9 = Ó(1)
fo(n) — 9 100000n — (21000007)
„ — 2)! ~
faln) = n/n = O(n?)
=fi<fa<fa<fr
Trang 6fi (n) = nv
fo(n) = 2”
fa(n) = n°?
filn) = 0G +0)
¿=1
Ta cd:
filn) = (228")VF = gvA log — 202113)
fo(n) = O(2") = 20%
fa(n) — (2192")19,an/2 — glOlogn+n/2 _ o(v2"**) — 20319), < rất nhỏ
= fi<fi<fa<h
Group 4:
fe(n) =n”
fr(n) =a”
fs(n) = 2 fo(n) = nilesn
Ta có:
fo(m) = 2l08nY” — avPlogn — oO(n°}1/2)
Fe(n) = 200
fa(n) = 2182" = gr*tog2 _ 90%n*)
fo (m) — glog nt les ne 24logrn loga rr — 200)
=> fo<fe<fi<fs
Trang 7fo(n) = nv fr(n) = nie" fa(n) = 29⁄2 fo(n) = 3X" fo(m) = 472
Ta có:
fe(n) = glognv® _ avnlogn — 90(n*+1/?)
glog nies n = glognlogn — 2O(22)
alogäv® _ avflog8 _ 2O(m1⁄2)
So
1
fio(n) — gloxan? =9 log4 —_ 2O(n1⁄4)
rh
7(n) =
fa(n) =
(n) =
= f7< fio<fo<fe<fs
Group 6:
fi (n) = 10999999 Tg),
fo(n) = 10000000n fa(m) = 1.000001" faln) =?
Ta có:
fi (n) — 2°99 Tog, — O(n 299999 Fe)
= 10000000n = O(n)
rh
a(n) =
ƒs(n) = 1.000001” = O(2”)
Jin) O(n?)
=> <ƒ2< 2q <
Trang 8film) =n"
fo(n) =x”
fain) = (")
fan) = vav"
fa(n) = (,." 1)
fe(n) = gllogn)*
fain) =n'(“1)
Ta cd:
fal) = (2b8")F = green — 200°)
fo(n) = 20
nl mí — l)(n — 2)(n — 3)(n — 4)(n — 5)! faln) = 5l(n— 5)! ` “ — = “
— nín — L{n — An — 3)(n — 4) = O(n?)
fa(n) = 2003)
m mín — l)(n — 2)(n— 3 4
I) = ai = wat a ——
fo(n) = 20°
fr(n) = 20°)
4 gntn — (nm — 2)(n—3 8 fg(n) =n Tin — TJ =n ( M 1 \\ ) = O(n")
=>fi<fr<fe<fi<fowfs < fy < fe
Ma fs > fis fs < fr
>Í.<Xä< 1< 1ä <ữ<fä< h< b
Trang 93 BAi tap 3
Chitng minh, dùng định nghĩa của các ký hiệu tiệm cận (không dùng lim)
a nttntl € O(n?)
Gia st nt +n +1 € O(n?)
=> deo € R+,n9 € N sao cho: nttn+1<en? Yn > nọ
Sr? + — Ị + <e Vn > no
Điều này vô lý vì: về trái là hàm "` liên tục mà e là hằng số, nên nếu với giá trị hằng số e bất
kì, luôn tồn tại n đủ lớn để #2 + ~ A+ 5 z>e€
Vậy: nh+nm +1 #£ O(n?)
b O(Cf(n)) = O(f (n) véi Ơ là hằng số
Ta cần chứng mình Ó(Cƒf(n)) C O(f(n)) va O(f(n) C O(Cf(n))
« O(Cƒ(n))C O((n))
Xét ham bat ki g(n) € O(C f(n)):
=> dk € Rt,ng EN sao cho: g(n) <kCf(n), Vn > no
Dat t = kC’, => dt € Rt,no € N sao cho: g(n) <tf(n), Vn > no
Tit day, theo dinh nghia Big-O, ta c6 g(n) € O(f(n)) > O(Cf(n)) c O(f(n))
© O(n) COLES (n))
Xét ham bat ki g(n) € Ó(ƒ(n)):
=> dk € Rt, ne € N sao cho: g(n) <kf(n), Va > nọ
Dat t = ẹ => dt € RT, nạ € Ñ sao cho: g(n) < tƠƒ(n), Vn > nọ
Từ đây, theo định nghĩa Big-O, ta có g(n) € Ó(Cf(n)) > O(f(n)) C O(Cf(n))
= OCF (m)) = OF (r)
c- Nếu ƒ(n) € O(g(n)) va gín) € O(H(n)) thi f(n) € O(A(n))
Theo giả thiết, ta có:
- #(n) € O(g(n)) nên dei € R!,mị € N thỏa ƒ(n) < crg(n) Vn > nị
- g(n) € O(h(n)) nên 3œ € Rt, ny € N thoa g(n) < ceh(n) Vn > neo
= fn) < eesh(n) Yn > max(mị, mạ)
Dat co = cic, => co € RT và nạ = max(m, nạ), nạ € N
Theo định nghia ctla Big — O, ta c6 f(n) € O(h(n))
Trang 10d max(ƒ(n),g(0))= (fn) + g(n))
Để mệnh đề trên đúng, thì đe, c2 € Rt, no € N sao cho:
Chon ¢ = 0.5,c2 = 1, no € N ta được:
0.5(F(n) + 9(n)) < 0.5(nax(f(n),9l
e gín) € O(0(n)) = O(g(n)) C O(i(n)
Ta c6: g(r) € O(h(n)) nén de, € Rtn, € N thỏa g(n) < eì.hín) Vn> mị Xét hàm bat ki f(n) € O(g(n), = deo € Rt,n2 € N théa f(n) < cog(n) Vn > mạ
11)) + mae( f(r), g(n))) = mae f(n), 9(n)) )= fn) + g(n)
(dpem)
Đặt cọ = Gi@, nạ = max(n1, 2), => dco € Rt,no € N théa f(n) < coh(n) Vn > no Theo định nghia Big-O, f(n) € O(h(n)) => O(0(n)) C O(h(n))
£ Ô(g(ø)) = O(g(ø)) P19(g(n))
Ta cần chứng mình ©(g(n)) C O(g(n)) NQ(g(n)) va O(g(n)) n1 Ô(g(n)) C O(g(n))
Xét ham bat ki f(n) € O(g(n)):
=> dei, co € Rt, no € N sao cho: cig(n) < f(m) < cog(n), Vn > no
Dat h = 1, dh € Rt, no € N sao cho: cig(n) < f(n), Vn > nạ
Theo dinh nghia Big-Q, ta c6 f(n) €
< œg(n), Vn > no
(g(r
Dat & = co, => dk € Rt, € N sao cho: f(n
Theo định nghĩa Big-O, ta có ƒ(n) € O(g(
(1),(2) = f(r) € O(g(r)) NQ(g(m)) > ©(g0n)
eO(g(n)) NQX(g(n)) C O(g(n))
Xét hàm bất kì ƒ(n) € O(g(n)) N Q(g(n)):
=> đe, cœ¿ € Rt,ny,ne € N sao cho:
( 9(n) <f(n), Va > ny Lin <S œg(m), Vn > nạ
Đặt nọ = maz(m, nạ), => đei, ca € R†, nạ € Ñ sao cho:
cg(m) < f(n) <cg(n), Yn > nạ
Trang 11Theo định nghĩa Big-©, ta có ƒ(ø) € O(g(n)) > O(g(n)) N Q(g(n)) C O(g(n))
=> O(g(n)) = O(g(n)) NQ(g(n)) (dpem)
g nt+vO(Inn) = O(n? Inn)
Với g(n) € Ol(lnn), theo dinh nghia Big — O, de € N,no € R* sao cho:
g(n) <e¢-lnn (Vn > nạ)
& n’g(n) <e-n? Inn (Wn > ne) (nhan 2 vé véi n?) entrg(n)<nte-rilnn<nrlnn+e-n? Inn (Yn > 2)
Đặt £ = c+ l,nạ = 2:
=> die Rtn) © N sao cho: n+n?g(n) < tnẦnlnn
Do đó: ø + n2g(n) € O(n? Inn) > n+ n72O(Inn) = O(n? Inn) (dpem)
4 Bai tap 4
Các khẳng định bên dưới là đúng hay sai? Vi sao?
a.Néu f(n) = O(g(n)) va g(n) = O(A(n)), thi h(n) = O(f(n))
f(n) = O(g(n)) = 3 c¡,ca € Rt va ny € N sao cho:
cị * g(n) <S ƒ(n) <€ c *g(n) Vn > ny > ƒứ) < g(m) < Jn) Yn > mị (1)
g(n) = O(A(n)) = 3 œ,cạ € Rt va ng € N sao cho:
ca * h(n) < g(n) <cg* h(n) Vn > nạ => a) <A(n) < sta) Yn > ng (1)
(1)(2) => | Ƒ(m) <A(n) < p(n) Yn > maa(nyz, 12)
C24 CC
Đặt ft = ——,t¿ = ——, tạ = rna#(m, nạ)
C1 CoÓA
= Sty, ty € Rt,no € N sao cho tif(n) < h(n) < tof (n)
Theo dinh nghia Big-O, h(n) € O(f(n))
b fn) = O(g(n)) và gín) = O(/fn) thì ƒ(n) = gín)
Theo định nghia Big-O, ta c6:f(n) = O(g(n)) Khi dé, de € Rt, no € N sao cho:
Ẩn) < eg[n) Vn > nọ
Tương tự nếu g(n) = O(f(n)) Khi đó, đc € R†,m € N sao cho:
gln) < ci.ƒ(n) Yu > m1
Giả sử : ƒ(n) = nỄ và g(n) = 4n? +5
Trang 12=> f(n) = O(g(n)) khi e = 1, nạ = 1 và g(n) = O(ƒ(n)) khi ei = 1,1m = I > ƒ(n) = g(n) ©® nỀ = 4n? + 5 (sai)
Do đó, khẳng định sai
c fn) +O(ƒ(n)) = ©(/0n))
Đặt g(n) = O(ƒ(n)) Khi đó, 3c € R†,nạ € N sao cho:
gln) <e.fln) Yn >
Giả sử tất cả các hàm đều không âm, khi đó c là hằng số dương
Chọn c= 1, ta có g(n) < f(n) Vn > no
Vì các hàm đều không 4m, ta cé f(n) < f(n) + g(n) < 3ƒ(n) Vn > no
hay f(n) + O0) = Ô(7(0))
Khăng định trên đúng với mọi hàm không âm
d.21" = O(2")
Giả sử khẳng định trên đúng = 3e € R†, nạ € Ñ sao cho 2!9* < ¿x 2" nu > nọ
219% < ¿+ 2 œ 29" < c, Điều này vô lý bởi vì 2" tăng liên tục khi n tăng nên ta không thể chọn hằng số e
Do đó, khẳng định sai
e 22110 — (25)
Giả sử giả thiết là đúng
Theo Big — O, ta c6é 2°†19 = @(2"), khi đó 3e € R†, nạ € N sao cho 2°41 < c2" Vụ > nọ Nhận thấy: 2"†!9 < œ2" @ 2210 < c2" œ 2!0 <6
= kha thi, vi de € R* sao cho 2" < é, chọn e= 219 +1,
Do đó khẳng định trên là đúng
f log, n = O(log, 7)
Nếu khẳng định trên là đúng thì:
đei, œ € RT,nọ € Ñ sao cho:
clog, n < log„m < œlogyn, Ø0 > nạ (*)
1 Chon ¢, = ¢2 = ——,no = 1, thay vào (%):
log, a
1
—— log,n < log, n <
log, a 08p 0 = 20841 = logy ø log,n, ø > 1
Trang 13= log, n < log, n <log„n, >1 (ding)
Vậy khẳng định trên là đúng
5_ Bài tập 5
Ước lượng nhanh độ phức tạp của giải thuật đệ quy dùng Định lý Master
1.7(n) = 3T(§) +n?
Ta có:
- 0 = 3,6 = 2, n!094 = plese
Ta thay: f(n) =n? € O(nie984*) 6 = 0,25
Và a.ƒ() < e.ƒ(n) (vì 3.(8)? = 0, 75.n? < en?,c = 0,75)
=> Ap dụng case 3 của dạng tổng quát
Ta được: 7 (5) = Đ(ƒ(n)) = O(n?)
2.7(n) =7T() +n?
Ta có:
-a=7,b = 3, f(n) =n? € O(n?) d = 2
Ta thay: a < b4, nén Ap dung case 1 của dạng đơn giản
Ta dude: T(n) = O(n?)
3 T(n) =3T(3)+5
Ta có:
-a=3,b=3
- f(n)=% € O(n!) sd=1
Nhận thấy: ø = ð', nên Ap dung case 2 của dạng đơn giản
Ta được: 7ø) = ©(nlog n)
4, T(n) = 167T(4)+n
Ta có:
-a=16,b=4
- fn) =n€ On!) sd=1
Trang 14Ta được: 7(n) = ©(n 98%) = O(n?)
5 T(n) = 27(4) +n
Ta có:
-a=2,b=4
- f(n) = n°! € O(n?!) > d=0.51
Ta thay: a < b4, nén Ap dung case 1 của dạng đơn giản
Ta duge: T(n) = O(n)
6 T(n) = 37(3) +n
Ta có:
-a@=3,b=2
- ƒ(n)=n€(n!)= d= 1
Nhận thấy: a > 64, nén Ap dung case 3 của dạng đơn giản
Ta được: 71x) = Q(n S83)
7.7(n) = 3T() + n
Ta có:
-ø=3,b=3,n2%% — n
Ta thay: f(n) = /n € O(n'*),€ = 0,4
=> Ap dụng case 1 của dạng tổng quát
Ta được: 7 (5) = Đ(n9%4) = Đ(n)
8.7(n) = 47(5) ten
Ta có:
-ø= 4,b= 3, (n) = eœn € Q(n!) sd=1
Ta thay: a > b', nên ta áp dụng case 3 của dạng đơn giản
Ta được: 7 (5) = Đ(n9%%) = O(n?)
9 7n) = 471) + 5n
Trang 15-a=4,b=4
- f(n) =5n€ O(n!) > d=1
Nhận thấy: ø = Ù', nên áp dụng case 2 của dạng đơn giản
Ta dude: T(n) = O(nlog n)
10 T(n) = 5T(4) + 4n
Ta có:
-a=5,b=4
- ƒ(n) = 4n € ©(n!) > d=1
Nhận thấy: a > Ù#, nên áp dung case 3 của dạng đơn giản
Ta dude: T(n) = Q(n S85)
11.7(n) = 47 (3) +5.n
Ta có:
- a= 4,6 = 5, n!094 = plead
Ta thay: f(n) = 5.n € O(nie%4t) 6 = 0,1
Và a.ƒ(š) < e.ƒ(n) (vi 4.(5.2) = 4.n < 5.c.n,¢ = 2)
=> Ap dụng case 3 của dạng tổng quát
Ta duge: T(n) = O(f(n)) = O(5.n)
12 T(n) = 257 (2) +?
Ta có:
-a=25,b=5, f(n) =n? € O(n?) > d=2
Ta thấy: ø = 64, nén áp dụng case 2 của dạng đơn giản
Ta duge: T(n) = O(n? log n)
13 T(n) = 107(%) + 17n!?
Ta có:
-a=10,b=3
- f(n) =17n'? € O(n!?) > d= 1.2