ĐẠI HỌC HUẾ
TRƯỜNG ĐẠI HỌC KHOA HỌC
TIỂU LUẬN
MÔN HỌC:
PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁN
ĐỀ TÀI:
SỰ TĂNG TRƯỞNG HÀM
Giáo viên hướng dẫn Nhóm học viên thực hiện: Nhóm 7
TS. Hoàng Quang Thái Quang Hoàng
Hoàng Tuấn Hưng
Hoàng Hữu Chiến
Đoàn Văn Cự
Đặng Văn Vinh
Huế, 5/2012
MỤC LỤC
I. Hệ ký hiệu tiệm cận
Là các ký hiệu dùng để mô tả thời gian thực hiện tiệm cận của một thuật
toán, nằm trong các trường hợp xấu nhất, trung bình, hay tốt nhất.
Đánh giá thời gian hay còn gọi là độ phức tạp của thuật toán được định
nghĩa dưới dạng các hàm, mà miền của những hàm đó là tập hợp các số tự
nhiên N={1,2,3….}, dựa trên kích thước dữ liệu đầu vào.
1. Ký hiệu Θ : Tiệm cận
Định nghĩa: Với một hàm đã cho g(n), qua Θg(n) ta thể hiện tập hợp các
hàm:
2
Bởi vì Θ (g(n)) là một tập hợp nên ta có thể viết:
Hoặc
Với tất cả các giá trị n ≥ n
0
, giá trị của:
c
1
g(n ) ≤ f(n) ≤ c
2
g(n).
Ta nói rằng, g(n) là một tiệm cận ràng
buộc chặt chẽ (asymptotically tight
bound) của f(n).
2. Ký hiệu O : Tiệm cận trên
Các ký hiệu Θ là ký hiệu tiệm cận giới hạn của một hàm chặn trên và chặn
dưới. Khi chỉ có một tiệm cận chặn trên thì ta sử dụng ký hiệu O.
Định nghĩa: Với một hàm đã cho g(n), ta định nghĩa:
O(g(n)) = {f(n): tồn tại hằng số dương c và n
0
sao cho:
0 ≤ f (n) ≤ cg(n), với mọi n ≥ n
0
}
3
{ }
( ( )) ( ): , , ,0 ( ) ( ) ( ),
1 2 0 1 2 0
g n f n c c n c g n f n c g n n nΘ = ∃ ≤ ≤ ≤ ∀ ≥
( ) ( ( ))f n g n∈Θ
( ) ( ( ))f n g n=Θ
Với mọi giá trị n ≥ n
0
, giá trị của hàm f(n) ≤ cg(n).
+ Khi viết f(n) = O(g(n)) nghĩa là f(n) là
một phần tử của tập O(g(n)).
+ Lưu ý rằng f(n) = Θ(g(n)) suy ra f (n) =
O(g(n)), bởi vì ký hiệu Θ là một khái
niệm mạnh hơn ký hiệu O.
4
3. Ký hiệu Ω : Tiệm cận dưới
Định nghĩa: Ω(g(n)) = {f(n): tồn tại hằng số dương c và n
0
sao cho
0 ≤ c.g(n) ≤ f(n), với mọi n ≥ n
0
).
Định lý: Với hai hàm bất kỳ f(n) và g(n), f(n)=Θ(g(n)) khi và chỉ khi
f(n) = O(g(n)) và f(n) = Ω(g(n)).
Do hệ ký hiệu Ω mô tả một giới hạn dưới, ta cũng có thể sử dụng nó để giới
hạn thời gian thực hiện trong trường hợp tốt nhất của một thuật toán.
4. Ký hiệu o : Tiệm cận trên không chặt chẽ
Định nghĩa: o(g(n)) = {f(n): với mọi c>0, tồn tại một hằng n
0
>0 sao cho
0≤f(n)<cg(n) với mọi n ≥ n
0
).
5. Ký hiệu ω : Tiệm cận dưới không chặt chẽ
Định nghĩa: ω(g(n)) = {f (n): với mọi c > 0, tồn tại một hằng n
0
> 0 sao cho
0 ≤ c.g(n) <f (n) với mọi n ≥ n
0
).
Khi đó, f(n) lớn tùy ý so với g(n) khi n dần đến vô cực, nghĩa là
5
II. Các ký hiệu chuẩn và hàm thường dùng
1. Tính đơn điệu của hàm
Tính đơn điệu của hàm (Monotonicity)
- Hàm f(n) được gọi là đơn điệu tăng
nếu m ≤ n thì f(m) ≤ f(n)
- Hàm f(n) được gọi là đơn điệu giảm
nếu m ≤ n thì f(m)≥ f(n)
-Hàm f(n) được gọi là thực sự tăng
nếu m < n thì f(m) < f(n)
và thực sự giảm
nếu m < n thì f(m) > f(n)
2. Hàm sàn và hàm trần
∀ x
∈
R, định nghĩa:
- Hàm sàn của x là số nguyên lớn nhất nhỏ hơn hoặc bằng x, ký hiệu x.
- Hàm trần của x là số nguyên nhỏ nhất lớn hơn hoặc bằng x, ký hiệu x.
- ∀ x
∈
R , ta có: x-1< x
≤
x
≤
x < x+1.
- - ∀ n
∈
Z ta có: n/2 + n/2 = n.
- Hàm sàn f(x) = x và hàm trần f(x) = x đều là hàm đơn điệu tăng.
3. Logarit (Logarithms)
Với n > 0: phép toán logarit:
+ lg n = log
2
n (lôgarit cơ số 2)
+ ln n = log
e
n (lôgarit tự nhiên)
+ lg
k
n = (lg n)
k
(lôgarit mũ)
+ lg lg n = lg(lg n) (lôgarit kết hợp)
6
- Quy ước: lg n+k nghĩa là lg(n) + k , không phải là lg(n+k)
- Nếu b > 1 và n > 0 thì log
b
n là hàm thực sự tăng.
- Hàm f(n) là được giới hạn đa lôgarit nếu
f(n) = O(lg
k
n) với k bất kỳ.
- Ta có thể biểu diễn sự tăng trưởng của đa thức và đa lôgarit bằng cách thay
thế lg
n
cho n và 2
a
cho a ở phương trình
0lim
=
∞→
n
b
n
a
n
, dễ dàng ta có:
0
lg
lim
)2(
lg
lim
lg
==
∞→∞→
a
b
n
na
b
n
n
nn
- Kết luận rằng: lg
b
n = o(n
a
) với số mũ a > 0 thì mọi hàm đa thức dương
tăng nhanh hơn hàm các hàm đa lôgarit (n
a
tăng nhanh hơn lg
b
n khi n→∞).
7
III. Bài tập
1. Bài tập 3.1-1: Cho f(n) và g(n) là những tiệm cận không âm.
Bằng cách sử dụng định nghĩa cơ bản của ký hiệu Θ
Chứng minh rằng:
max(f(n),g(n)) = Θ(f(n) + g(n)).
Thật vậy, ta cần chứng minh:
T/h1: c
1
(f(n) + g(n)) ≤ max(f(n), g(n)) ≤ c
2
(f(n) + g(n))
với mọi n
0
sao cho n≥n
0
.
Chú ý max(f(n),g(n)) ≤ f(n) + g(n).
Vì vậy, khi c
2
= 1, vế bên phải đúng.
T/h 2: f(n) ≤ max(f(n), g(n)) và g(n) ≤ max(f(n), g(n))
⇒ f(n) + g(n) ≤ 2max(f(n), g(n))
⇒ (f(n) + g(n)) / 2 ≤ max(f(n), g(n)).
Vì vậy, khi c1 = 1/2, vế bên trái đúng.
Kết luận: Ta tìm được: c1=1/2; c2=1; với mọi n
0
8
2. Bài tập 3.1-2: Chứng minh rằng đối với bất kỳ hằng số thực a và
b, với b > 0, (n + a)
b
= Θ(n
b
).
Thật vậy, theo định nghĩa:
Θ(g (n)) = {f(n): tồn tại c
1
, c
2
, n
0
sao cho 0 ≤ c
1
g (n) ≤ f (n) ≤ c
2
g (n), ∀ n
≥ n
0
}.
⇒ 0 ≤ c
1
n
b
≤ (n + a)
b
≤ c
2
n
b
với mọi n ≥ n
0
và c
1
, c
2
, n
0
> 0,
Vì n
0
> 0,
⇒ |n + a| ≤ n + |a| ≤ 2n , với n
0
≥ |a|.
Do đó, (n + a)
b
≤ (2n)
b
= 2
b
n
b
với c
2
= 2
b
.
Tương tự ta có:
|n + a| ≥ n - |a| ≥ n / 2 , với n
0
≥ 2 |a|
Do đó (n + a)
b
≥ (n / 2)
b
= (1/2)
b
n
b
với c
1
= (1/2)
b
.
Vậy: c
1
= (1/2)
b
, c
2
= 2
b
, và n
0
≥ 2 |a|
ta có: (n + a)
b
= Θ(n
b
).
3. Bài tập 3.1.4: 2
n+1
=O(2
n
) ?, 2
2n
=O(2
n
) ?
* 2
n+1
=O(2
n
) ?
Ta có: 2
n+1
=2 . 2
n
Giả sử n
0
=1 và c=2 thì ta có
0 ≤ 2
n+1
≤ c(2
n
) với mọi n ≥ n
0
.
Theo định nghĩa: Khi 2
n+1
là một phần tử của tập O(2
n
) thì 2
n+1
=O(2
n
)
* 2
2n
=O(2
n
).
Giả sử: 2
2n
≤ c.2
n
(1)
Ta có: 2
2n
= 2
n
. 2
n
(2
2n
≥ 0 với n>0) (2)
Từ (1) và (2) 2⇒
n
≤ c ⇒ n ≤ lg c Nhưng n không phải là hằng số. Do đó
2
2n
=O(2
n
) không đúng.
9
4. Bài tập 3.1.5 (Chứng minh Định lý 3.1):Với hai hàm bất kỳ f(n) và
g(n), f(n)=Θ(g(n))
khi và chỉ khi f(n) = O(g(n)) và f(n) = Ω(g(n)).
* C/m: f(n)=Θ(g(n)) ⇒ f(n) = O(g(n)) và f(n) = Ω(g(n)).
Giả sử f(n) = Θ(g(n)) theo định nghĩa, tồn tại các hằng số dương c
1
, c
2
, và
n
0
sao cho 0 ≤ c
1
g(n) ≤ f(n) ≤ c
2
g(n), ∀ n ≥ n
0
. Từ đó ta có các bất đẳng
thức sau:
0 ≤ f(n) ≤ c
2
g(n) và 0 ≤ c
1
g(n) ≤ f(n).
- 0 ≤ f(n) ≤ c
2
g(n) => f(n) = O(g(n)) (với f(n) là một phần tử của tập
O(g(n))).
- 0 ≤ c
1
g(n) ≤ f(n) => Ω(g(n)) = {f (n): tồn tại hằng số dương c và n
0
sao
cho 0 ≤ cg(n) ≤ f(n), với mọi n ≥ n
0
). ⇒ f(n) = Ω(g(n)).
Từ đó ⇒ f(n)=Θ(g(n)) ⇒ f(n) = O(g(n)) và f(n) = Ω(g(n)). (1)
* C/m: f (n) = O(g(n)) và f(n) = Ω(g(n)) ⇒ f(n)=Θ(g(n)).
Giả thiết f(n) = O(g(n)) và f(n) = Ω(g(n)).
Theo định nghĩa:
Ta chỉ cần làm ngược từ phần đầu để đạt được f(n) = Θ(g(n)). (2)
Từ (1) và (2), định lý được chứng minh
5. Bài tập 3.1.6: Chứng minh rằng thời gian chạy của một thuật toán là
Θ(g(n)) nếu và chỉ nếu thời gian chạy trong trường hợp xấu nhất là
O(g(n)) và tốt nhất là Ω(g(n)).
Thật vậy, theo định lý 3.1 ta có f(n)=Θ(g(n)) khi và chỉ khi f(n) = O(g(n)) và
f(n) = Ω(g(n)).
10
6. Bài tập 3.1.7: Cải tiến để o(g(n)) ∩ ω (g(n)) = ∅
Cho f(n) = o(g(n)) và f(n) = ω(g(n)). với định nghĩa giới hạn của chúng là:
lim
n→∞
(f(n)/g(n)) = 0 và lim
n→∞
(f(n)/g(n)) = ∞ mà không đồng thời có
giá trị đúng bởi vậy nó không tồn tại hàm sao cho có o(g(n)) ω(g(n)).
Theo định nghĩa:
+ o(g(n)) = { f(n) | ∀ c > 0, n
0
> 0 sao cho 0 ≤ f(n) < c.g(n) ∀ n > n
0
}
+ ω(g(n)) = { f(n) | ∀ c > 0, n
0
> 0 sao cho 0 ≤ c.g(n) < f(n) ∀ n > n
0
}
Vì vậy o(g(n)) ∩ ω(g(n)) = { f(n) | ∀ c > 0, n
0
> 0 sao cho 0 ≤ c⋅g(n) < f(n)
< c⋅g(n) ∀ n > n
0
}
Nhưng bất đẵng thức này không chứa hàm f(n) nào nên nó phải là tập rỗng.
7. Bài tập 3.1.8: Ta có thể mở rộng ký hiệu tiệm cận trong trường hợp
của hai tham số n và m có thể tự do tiến về vô cực với tốc độc khác
nhau. Cho hàm g(n,m), ta định nghĩa O(g(n,m)) là tập hợp các hàm:
O(g(n,m)) = {f(n,m): có tồn tại hằng số dương c, n
0
, và m
0
sao cho 0 ≤
f(n,m) ≤ c.g(n,m) ∀n ≥ n
0
và m ≥ m
0
}.
Hãy cho các định nghĩa đúng Ω(g(n,m)) và Θ(g(n,m)).
Ta dễ thấy định nghĩa ở trên, ta dễ dàng chuyển giữa 1 và 2 tham số.
Ω(g(n,m)) = {f(n,m): tồn tại hằng số dương c, n
0
, và m
0
sao cho 0 ≤ cg (n,
m) ≤ f(n,m) ∀n ≥ n
0
và m ≥ m
0
}.
Θ(g(n,m)) = {f(n, m): tồn tại hằng số dương c
1
, c
2
, n
0
, và m
0
sao cho 0 ≤
c
1
g(n,m) ≤ f(n,m) ≤ c
2
g(n,m) ∀n ≥ n
0
và m ≥ m
0
}.
11
8. Bài tập 3.2.1: Hãy chỉ ra nếu f(n) và g(n) là các hàm đơn điệu
tăng, f(n) + g(n) và f (g(n)) cũng đơn điệu tăng, và nếu f(n) và
g(n) không âm, thì f(n) · g(n) là hàm đơn điệu tăng.
T/h 1: Giả thiết cho f(n) và g(n) là 2 hàm đơn điệu tăng, theo định nghĩa, ta
có:
m ≤ n ⇒ f(m) ≤ f(n) và g(m) ≤ g(n).
Cộng 2 vế BĐT trên ta được: f(m) + g(m) ≤ f(n) + g(n),
dễ thấy rằng f(n) + g(n) là đơn điệu tăng.
Cho g(m) = p và g(n) = q, khi g(m) ≤ g(n) =>thì p ≤ q và f(n) đơn điệu tăng
vì thế f(p) ≤ f(q) điều này có nghĩa là f(g(m)) ≤ f(g(n)) cho thấy f(g(n)) cũng
đơn điệu tăng.
Thứ 2, giả thiết f(n) và g(n) không âm, với mọi n, f(n) ≥ 0 và g(n) ≥ 0.
Ta có f(m) ≤ f(n) vì thế f(m)·g(n) ≤ f(n)·g(n) và g(m) ≤ g(n)
⇒ f(m) · g(m) ≤ f(m) · g(n).
⇒ f(m) · g(m) ≤ f(m) · g(n) ≤ f(n) · g(n)
ta thấy: f(m) · g(m) ≤ f(n) · g(n)
chỉ ra rằng f(n) · g(n) là đơn điệu tăng
9. Bài tập 3.2.2
Chứng minh
log
b
(1/a) =-log
b
(a) , log
b
(a) = 1/log
a
(b)
log ( ) log ( )
b b
c a
a c
=
* log
b
(1/a) = log
b
(a
-1
) = -log
b
(a)
* log
b
(a) = log
a
(a)/log
a
(b) = 1/log
a
(b)
10.Bài tập 3.2.3
Chứng minh
n! = o(n
n
), n! = ω(2
n
), và lg(n!) = Θ(n lgn)
* n! = o(n
n
)
Với mọi c>0, tồn tại n
0
sao cho 0 ≤ n! < cn
n
với mọi n ≥ n
0
Không mất tính tổng quát, giả sử:
12
log ( )
log ( ) log ( ) (log ( )log ( )) log ( )
c
b
b c b c b
c a c a a
a c c c
= = =
n! = a
1
. a
2
. · a
n
với a
1
= 1 và a
(i+1)
= a
i
+1, n
n
= b
1
. b
2
. · b
n
với b
1
= b
2
= = b
n
= n. Vì a
n
= b
n
nhưng a
j
< b
j
, 1 < j < n.
Suy ra: n! < n
n
, n ≥ 2. Với n
0
= 2, c=1 0 ≤ n! < cn
n
.
Vậy n! = o(n
n
).
* n! = ω(2
n
)
Tương tự như trên, ta có 2
n
= b1.b2…bn với b1 = b2 = ….= bn = 2
∀ c>0, tồn tại n
0
sao cho 0 ≤ c2
n
< n!
Với n
0
= 4 và c = 1, 0 ≤ c.2
n
< n!. Vậy n! = ω(2
n
).
* lg(n!) = Θ(n lg n)
Tồn tại c
1
, c
2
, và n
0
sao cho 0 ≤ c
1
nlg n ≤ n! ≤ c
2
nlg n, ∀ n > n
0
.
Sử dụng công thức xấp xỉ của Sterling ta có,
n! = sqrt(2πn)(n/e)
n
(1 + Θ(1/n)) ( theo 3.1-7)
⇒ lg(n!) = lg(sqrt(2πn)(n/e)
n
(1 + Θ(1/n))) = lg sqrt(2πn) + lg (n/e)
n
+ lg (1
+ Θ(1/n)) = Θ(sqrt(n)) + Θ(n lg n) + Θ(lg 1/n) = Θ(n lg n).
11.Bài tập 3.2.4
lg n!, lg lg n! có bị chặn không?
lg n!
Hàm f(n) được gọi là bị chặn nếu nó bị chặn trên bởi 1 đa thức. Có nghĩa là
tồn tại c, k, n
0
sao cho f(n) ≤ cn
k
,
n>n
0
.
⇒lg f(n) ≤ lg cn
k
= c
1
klg n (*)
do đó f(n) bị chặn nếu: lg f(n) = Θ(lg n)
Gán lg n = m ta có lglg n! = lg(m!) = Θ(m lg m) (đã chứng minh ở bài tập
3.2.3)
Do đó lglg n! = Θ(lg n * lglg n) = Θ(lg n * lg lg n) không đúng với điều
kiện (*). Vậy lg n! Không bị chặn
13
lg lg n!
Tương tự như trên, ta có:
lglg lg n! = Θ(lg lg n *lg lg lg n)
Mà lg lg n *lg lg lg n bị chặn trên bởi
(lg lgn)
2
=
(lg (lg n))
2
= lg
2
(lg n)
ta có lg
b
n = o(n
a
)
Suy ra lg lg n! bị chặn
12.Bài tập 3.2-5:
Tiệm cận nào lớn hơn: lg(lg* n) hay lg*(lg n)?
Ta có:
Gọi lg*n=i thì lg*(lgn)=i-1
Khi đó lg*(lg n) có số lần lặp lại ít hơn lg*n và có kết quả <=1
Vậy nếu lg* n = i thì lg*(lg n) = i – 1
và lg(lg* n) = lg(i)
Do đó lg*(lg n) có tiệm cận lớn hơn
14