Tải bản đầy đủ (.pdf) (241 trang)

Bài giảng cấu trúc dữ liệu và giải thuật 13

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 (13.16 MB, 241 trang )

Data structures &
Algorithms
Nguyễn Duy Hiệp

tinhocdaicuong.wordpress.com


Nội dung


Chương 1 – Các khái niệm cơ bản



Chương 2 – Giải thuật đệ quy



Chương 3 – Các cấu trúc dữ liệu cơ bản



Chương 4 – Cấu trúc cây



Chương 5 – Sắp xếp



Chương 6 – Tìm kiếm





Chương 7 – Đồ thị


Tài liệu


[1]. Cấu trúc dữ liệu và giải thuật, Đỗ Xuân Lôi, NXB

ĐHQGHN


[2]. Bài giảng cấu trúc dữ liệu và giải thuật, Nguyễn Đức
Nghĩa



[3]. Data structures and program design in C++, Robert L.
Kruse, Alexander J. Ryba.



[4] Algorithm in C, R. Sedgewick, Addison Wesley



[5]. Data structures and problem solving with C++, Mark
Allen Weiss



u cầu




Kiến thức cơ bản về tốn
Kỹ thuật lập trình cơ bản
Sử dụng được một trong các ngôn ngữ lập trình:





PASCAL
C/C++
Java
.Net


Đánh giá




Thi giữa kỳ (30%)
Thi cuối kỳ (70%):
 Thi


viết
 Sử dụng tài liệu
 Nội dung thi : tất cả những gì đã học !


Bài tập cộng điểm (0.5điểm/bài)
 Xem

thêm trên blog tinhocdaicuong.wordpress.com


1/10/2011

PhầnI– Giớithiệuvề
Thuậttốn
Chương 1.1

KHÁINIỆMCƠBẢN

Nộidung

1.1Thuậttốnlàgì?
• Thuật tốn: 

• 1.1. Thuật tốn là gì?

• thủ tục để thực hiện một nhiệm vụ cụ thể
• ý tưởng nằm sau các chương trình máy tính.

• 1.2 Tính chất của thuật tốn


• Thuật tốn phải giải quyết bài tốn tổng qt, và được định 
nghĩa rõ ràng. 

• 1.2 .1 Tính chính xác
• 1.2.2 Tính hiệu quả

• Một thuật tốn giải bài tốn đặt ra là một thủ tục xác định bao 
gồm một dãy hữu hạn các bước cần thực hiện để thu được 
đầu ra cho một đầu vào cho trước của bài tốn.

• 1.3 Chứng minh thuật tốn đúng 
• 1.4 Biểu diễn thuật tốn

Đầu vào

Đầu ra
Các bước
thực hiện

CuuDuongThanCong.com

1


1/10/2011

1.2.1Tínhchínhxác

1.1Thuậttốnlàgì?


• Thuật tốn phải cho đầu ra mong muốn ứng với bất cứ đầu 
vào hợp lệ nào của bài tốn.
• Tính chính xác khơng phải lúc nào cũng dễ thấy!

Bài tốn: sắp xếp
• Đầu vào: một dãy gồm n khóa  a1 , a2 ,.., an
• Đầu ra: một hốn vị có thứ tự của các khóa đầu vào trong đó

a '1  a '2  ..  a 'n

VD. Bài tốn chọn lịch xem phim
• Đầu vào: Một tập L gồm thời gian chiếu trong ngày của n bộ 
phim
• Đầu ra: Tập con của L chứa số bộ phim lớn nhất có thể xem 
(khơng được chồng nhau về thời gian)

Trường hợp cụ thể của bài tốn
• {14, 45, 68, 24, 54, 34}
• {Mike, Bob, Sally, Jill, Jan}
• Chúng ta chỉ quan tâm đến các thuật tốn chính xác và hiệu 
quả, và dễ cài đặt

P1
P2
P3

1.2.1Tínhchínhxác

Sherlock holmes


Up in the air 

Avatar
Angel and demon

One
Up

Madagasca 2
Alice in the wonderland

1.2.1Tínhchínhxác
• Thuật tốn 3. Duyệt tồn bộ: duyệt 2n tập con của n bộ phim 
trong L. Chọn ra tập con nào có số lượng phần tử lớn nhất. 
Đảm bảo thu được kết quả tối ưu
Thuật tốn chạy rất chậm, vd n =20 thì số tập con là 220

• Thuật tốn 1. Chọn bộ phim sớm nhất trong L mà khơng trùng 
với các bộ phim đã chọn trước đó. Lặp lại cho đến khi khơng 
thể chọn thêm.

• Thuật tốn 4. Thuật tốn tối ưu: sắp xếp các lịch chiếu phim 
theo thứ tự khơng giảm thời gian kết thúc. Lần lượt xem xét 
các phim trong danh sách đã sắp xếp, bổ sung vào danh sách 
xem bộ phim đang xét nếu nó khơng chồng lên các bộ phim đã 
có trong danh sách xem. 

• Thuật tốn 2.  Chọn bộ phim có thời gian chiếu ngắn nhất 
trong L mà khơng trùng với các bộ phim đã chọn trước. Lặp lại 

cho đến khi khơng chọn thêm được.

• Có những bài tốn mà khơng tồn tại thuật tốn chính xác để 
giải!

CuuDuongThanCong.com

2


1/10/2011

1.2.1Tínhchínhxác

1.2.2Tínhhiệuquả

• Phân biệt giữa thuật tốn chính xác và khơng chính xác: đưa 
ra một ví dụ thuật tốn mà thuật tốn cho kết quả sai (phản ví 
dụ).

“Tại sao khơng chỉ sử dụng mỗi siêu máy tính? ”

• Siêu máy tính chỉ cho người giàu và những người q 
ngốc để có thể thiết kế một thuật tốn hiệu quả! 

• Chứng minh tính đúng đắn của thuật tốn: khó khăn hơn 
nhiều.

• Thuật tốn nhanh hơn chạy trên các máy tính chậm 
hơn sẽ thắng trong trường hợp dữ liệu đầu vào đủ lớn.


• Bài tập. Tìm các phản ví dụ cho các thuật tốn giải bài tốn 
hành trình du lịch tối ưu.

Bàitốncáitúi

Chọnđồvậtcógiátrịcaotrước

• Đầu vào: n đồ vật, mỗi đồ vật i có một trọng lượng wi và một 
giá trị ci. Một cái túi có thể chứa các đồ vật với trọng lượng tối 
đa là b
• Đầu ra: Cách chất các đồ vật vào túi sao cho trọng lượng tối đa 
khơng vượt q b, và tổng giá trị các đồ vật trong túi là lớn 
nhất. 


• Sắp xếp các đồ vật theo thứ tự giảm về giá trị.
• Lần lượt xét các đồ theo thứ tự này, cho đồ vật đang xét vào 
túi nếu nó cịn có thể chứa thêm được



• Xây dựng thuật tốn chất các đồ vào túi ?

CuuDuongThanCong.com

3


1/10/2011


Chọnđồvậttheotỉlệci/wi

Chọnđồvậttrọnglượngnhỏtrước
• Sắp xếp các đồ vật theo thứ tự tăng trọng lượng
• Lần lượt xét các đồ vật theo thứ tự này, chọn đồ vật đang xét 
vào túi nếu nó vẫn có thể chứa thêm

• Sắp xếp các đồ vật theo thứ tự giảm của tỉ lệ giá trị/ trọng 
lượng

• Lần lượt xét các đồ vật theo 
thứ tự này, chọn đồ vật đang
xét vào túi nếu nó vẫn có 
thể chứa thêm

Tìmphảnvídụ?

1.3Chứngminhtínhđúngđắn

Chứng minh thuật tốn sai bằng 
cách chỉ ra một phản ví dụ

• Thuật tốn được định nghĩa đệ quy:  Thuật tốn được định 
nghĩa lại bằng chính nó (với kích thước bài tốn nhỏ hơn)

• Tìm trong các trường hợp dữ liệu 
nhỏ

!


• Các ví dụ mà sát với các tiêu chuẩn 
lựa chọn của thuật tốn

1 ế
1 !   ế

0
0

• Chứng minh tính đúng đắn của thuật tốn 
đệ quy bằng phương pháp quy nạp

• Các ví dụ của các trường 
hợp cực trị (lớn nhất, nhỏ nhất …)
1

Khơng tìm được phản ví dụ khơng có nghĩa thuật tốn là đúng!

2

CuuDuongThanCong.com

4


1/10/2011

1.4Biểudiễnthuậttốn
• Cần biểu diễn các bước thực hiện tuần tự của thuật tốn một 

cách cụ thể.
• Biểu diễn bằng: 
Ngơn ngữ tự nhiên
Giả ngơn ngữ (pseudocode)
Lưu đồ
Ngơn ngữ lập trình cụ thể (C/C++, java,…)

Tính dễ dàng

Tính chính xác






CuuDuongThanCong.com

5


Bài tập chương 1
Phần 1
Bài 1. Chứng minh rằng
a. a + b có thể nhỏ hơn min(a, b).
b. a × b có thể nhỏ hơn min(a, b).
Bài 2. Bài tốn hành trình người du lịch: Cho vị trí n thành phố trong trong không gian. Từ một
thành phố ban đầu, một người du lịch muốn đi thăm tất cả n thành phố đó, sau đó quay trở lại
thành phố ban đầu. Hãy xây dựng hành trình của người du lịch sao cho qng đường người đó
phải đi là ngắn nhất.

Tìm các phản ví dụ cho các thuật tốn sau:
Gọi L là danh sách các thành phố
(a)

Thuật toán 1. NearestNeighbor(L)
Chọn và thăm thành phố khởi đầu p0 từ L
p = p0
i=0
Trong khi vẫn tồn tại thành phố chưa thăm
i=i+1
Chọn pi là thành phố chưa thăm mà gần nhất với thành phố vừa thăm pi−1
Thăm pi
Trở về p0 từ thành phố pn−1

(b)

Thuật toán 2. ClosestPair(P)
Gọi n là số lượng thành phố trong L.
For i = 1 to n − 1 do
d=∞
Với mỗi cặp (s, t) trong tập các cặp thành phố có thể
Nếu dist(s, t) ≤ d thì sm = s, tm = t, và d = dist(s, t)
Kết nối (sm, tm) bởi 1 cạnh
Kết nối hai điểm cuối cùng bằng 1 cạnh
Trong đó dist(s,t) là khoảng cách giữa 2 thành phố s và t.

Bài 3. Cho một tập các số nguyên S = {s1, s2, . . . , sn}, và một giá trị đích T, Tìm một tập con của
S sao cho tổng các số trong tập con đó đúng bằng T. Ví dụ, Tồn tại một tập con trong S = {1, 2,
5, 9, 10} mà tổng là T = 22 nhưng lại không tồn tại với T = 23.
Tìm các phản ví dụ cho các thuật tốn sau


CuuDuongThanCong.com


(a) Lần lượt chọn các phần tử trong S theo thứ tự từ trái qua phải nếu chúng phù hợp (thuật
toán first-fit).
(b) Lần lượt chọn các phần tử trong S theo thứ tự từ nhỏ đến lớn (thuật toán best-fit).
(c) Lần lượt chọn các phần tử trong S theo thứ tự từ lớn nhất đến nhỏ nhất.
Bài 4. Bài toán tập bao trùm (set cover problem) được định nghĩa như sau:
Cho một tập S gồm các tập con S1, ..., Sm của tập vũ trụ U = {1, ..., n}. Tìm số lượng tập con nhỏ
nhất T ⊂ S sao cho ∪ti∈Tti = U. Ví dụ, có các tập con, S1 = {1, 3, 5}, S2 = {2, 4}, S3 = {1, 4}, và S4 =
{2, 5} Tập con bao trùm sẽ là S1 và S2.
Tìm một phản ví dụ của thuật tốn tìm các tập bao trùm sau: Lựa chọn tập con có số lương
phần tử lớn nhất (có độ bao phủ lớn nhất), và sau đó loại bỏ các phần tử của tập đó trong tập
vũ trụ U. Lặp lại việc thêm các tập con chứa số lượng các phần tử chưa bị bao phủ phần tử lớn
nhất cho tới khi tất cả các phần tử của tập vũ trụ được bao phủ.
Bài 5. Chứng minh các khẳng định sau bằng phương pháp quy nạp
a)
b)
c)






n

i = n(n + 1) / 2 với mọi n≥0


i =1
n 3
i =1

i = n 2 (n + 1) 2 / 4 với mọi n≥0

n
i =1

i (i + 1)(i + 2) = n(n + 1)(n + 2)(n + 3) / 4

1
n
với mọi n≥1
=
i =1
i (i + 1) n + 1
e) n3 + 2n chia hết cho 3 với mọi n≥0
d)

n

Bài 6. Tốc độ truy cập ổ đĩa cứng thường được tính theo milliseconds (phần ngìn của giây) hay
microseconds (Phần triệu của giây)? Tốc độ truy cập trên RAM là khoảng bao nhiêu? Số lượng
chỉ lệnh - instructions mà một CPU có thể thực hiện trong 1 năm là bao nhiêu nếu máy đó được
chạy liên tục trong suốt thời gian.
Bài 7. Một thuật toán sắp xếp cần 1 giây để sắp xếp 1,000 phần tử trên một máy tính, thời gian
nó cần để sắp xếp 10,000 Phần tử sẽ là bao nhiêu nếu:
(a) thuật tốn sắp xếp có thời gian thực hiện tỉ lệ bình phương với kích thước dữ liệu, và
(b) thuật tốn sắp xếp có thời gian thực hiện tỉ lệ cỡ n log n với kích thước dữ liệu? (n là kích

thước dữ liệu – số phần tử cần sắp xếp)
Bài 8. Cài đặt 2 thuật toán người du lịch ở trong bài 2. Trong thực tế thì thuật tốn nào là tốt
hơn? Bạn có thể đề xuất một thuật tốn tốt hơn khơng ?
Bài 9. Cài đặt thuật tốn tối ưu để chọn ra số lượng bộ phim xem được nhiều nhất đã được mô
tả trong slide

CuuDuongThanCong.com


Bài 10. Viết hàm thực hiện phép chia số nguyên mà khơng dùng các tốn tử / hoặc *. Hãy tìm
các thực hiện nhanh nhất.
Bài 11. Bạn có 25 con ngựa. Tại mỗi lần đua thì chỉ có thể cho tối đa 5 con ngựa tham gia. Bạn
phải xác định 3 con ngựa là nhanh nhất, nhì và ba trong 25 con ngựa. Hãy tìm số lượng vịng
đua tối thiểu để có thể thực hiện việc này.

CuuDuongThanCong.com


1/10/2011

REVIEW
• Bài tốn: Cho một tập các số ngun S = {s1, s2, . . . , sn}, và 
một giá trị đích T. Tìm một tập con của S sao cho tổng các số 
trong tập con đó đúng bằng T. 
Ví dụ, Tồn tại một tập con trong  S = {1, 2, 5, 9, 10} mà tổng là 
T = 22 nhưng lại khơng tồn tại với T = 23.

PHÂN TÍCH 
THUẬT TỐN


Tìm phản ví dụ cho các thuật tốn sau 

REVIEW

NƠI DUNG

• (a) Lần lượt chọn các phần tử trong S theo thứ tự từ trái qua 
phải nếu chúng phù hợp (thuật tốn first‐fit).









• (b) Lần lượt chọn các phần tử trong S theo thứ tự từ nhỏ đến 
lớn (thuật tốn best‐fit).
• (c) Lần lượt chọn các phần tử trong S theo thứ tự từ lớn nhất 
đến nhỏ nhất.

Phân tích thuật tốn
Mơ hình RAM
Tốt nhất, tồi nhất, trung bình
Ký hiệu O‐lớn
Phân tích tiệm cận
Tốc độ tăng và tính thống trị
Một số tính chất của phân tích O‐lớn


CuuDuongThanCong.com

1


1/10/2011

PHÂN TÍCH THUẬT TỐN?

PHÂN TÍCH THUẬT TỐN?

Bài tốn: tìm phần tử lớn nhất thứ k 
• Đầu vào: Dãy số gồm n số ngun  , , . . , , và số ngun k
(0< k ≤ n)
• Đầu ra: Giá trị phần tử lớn nhất thứ k trong dãy.

• Đánh giá hiệu quả của thuật tốn mà khơng cần cài đặt. 
• 2 mơ hình :
• Mơ hình RAM (Random Access Machine)
• Phân tích tiệm cận độ phức tạp trong trường hợp tồi nhất

Có 2 thuật tốn A, B để giải bài tốn.
Với n = 100,000, k=100
• A cài đặt bằng C chạy mất 12 s
• B cài đặt bằng java chạy mất 19 s
Thuật tốn A tốt hơn B ?

• Đánh giá thuật tốn: dự đốn các tài ngun mà thuật tốn 
cần.
• Tài ngun: Thời gian CPU, bộ nhớ, băng thơng, phần cứng…


MƠ HÌNH RAM

TỐT NHẤT, TỒI NHẤT VÀ TRUNG BÌNH

• Thực hiện thuật tốn trên một máy tính giả định gọi là Random 
Access Machine hoặc RAM.
• Mỗi phép tính đơn giản (+, *, –, =, if, call) thực hiện trong 1 đơn vị 
thời gian (hoặc 1 bước).
• Vịng lặp, hàm, thủ tục: là kết hợp của nhiều phép tính đơn lẻ
• Mỗi bước truy cập bộ nhớ mất 1 đơn vị thời gian 
• Ln có đủ bộ nhớ cần thiết để thực hiện thuật tốn

• Phân tích thuật tốn 
trong trường hợp 
tổng qt, với một 
đầu vào bất kỳ thỏa 
mãn
Phân tích trường 
hợp: tốt nhất, tồi nhất 
và trung bình

• Đánh giá thời gian thực hiện thuật tốn bằng cách đếm số đơn 
vị thời gian cần.

CuuDuongThanCong.com

2



1/10/2011

TỐT NHẤT, TỒI NHẤT VÀ TRUNG BÌNH

KÝ HIÊU O LỚN

• Độ phức tạp trong trường hợp tồi nhất (worst‐case complexity):  
Là số lượng bước lớn nhất thuật tốn cần thực hiện với bất cứ 
đầu vào kích thước n nào.
• Độ phức tạp trong trường hợp tốt nhất (best‐case complexity): 
Là số lượng bước nhỏ nhất thuật tốn cần thực hiện với bất cứ 
đầu vào kích thước n nào.
• Độ phức tạp trong trường hợp trung bình (average‐case 
complexity): Là số lượng bước trung bình thuật tốn cần thực 
hiện trên tất cả các trường hợp đầu vào kích thước n.

• Khó xác định chính xác các hàm đánh giá độ phức tạp trong 
trường hợp tốt nhất, tồi nhất, trung bình

• Mỗi độ phức tạp là một hàm của thời gian và kích thước đầu vào
120

12.4

43

• Có rất nhiều điểm lồi: thời gian thực hiện biến đổi trong một số trường 
1
hợp đầu vào đặc biệt. VD tìm kiếm nhị phân nếu đầu vào 
2

• Để chính xác thì cần phân tích rất tỉ mỉ. 
120

43

9

• Ký hiệu O lớn: đơn giản phân tích, bỏ qua những thành phần 
mà khơng ảnh hưởng đến khi so sánh các thuật tốn
Trong phân tích O lớn 

• Các ký hiệu tiệm cận 
trong thực tế

9

12.4

PHÂN TÍCH TIÊM CẬN

2

, ,

3

và 

5 là tương đương


dùng để phân tích độ phức tạp 

Cận trên, cận dưới để đánh giá 
cho độ phức tạp của hàm

Định nghĩa O lớn chính thức:
: nghĩa là  .
là giới hạn trên của 
. Do vậy 

tồn tại hằng số  sao cho 
.
ln đúng với mọi 
Ω
: nghĩa là  .
là giới hạn dưới của 
. Do vậy 

.
ln đúng với mọi 
tồn tại hằng số  sao cho 

Θ
: nghĩa là  .
là giới hạn trên, và  .
là 
. Do vậy tồn tại hằng số và  sao cho 
giới hạn dưới của 
.
và 

.
ln đúng với mọi 
. Nói 
cách khác  
là giới hạn chặt của 
Với  ,

,

là các hằng số dương khơng phụ thuộc vào , và 

0
Ο lớn

Ω lớn

Θ lớn

CuuDuongThanCong.com

3


1/10/2011

KÝ HIÊU O LỚN

OMEGA LỚN

Ví dụ



2

1.5
vì chọn 



2 thì 2

2

4

4

vì chọn 

1

2

4

1 thì 

2

4


1.5 thì 

5




vì chọn 
5 khi 
50

c

5 khi 

2
4
10/ nếu 



vì với bất kỳ hằng số c nào thì 
5 khi 

4

2

THETA LỚN


vì với bất kỳ giá trị  thì
5 khi  đủ lớn (
100 nếu 
1) 
vì với bất kỳ hằng số c nào thì 
5 khi 
5

VÍ DỤ



vì cả Ο, Ω đều đúng

Khẳng định sau đúng hay sai? Tại sao ?



vì chỉ Οđúng

•2
•3

vì chỉ Ω đúng


Để chứng minh 




Θ

1, 



thì cần chỉ ra 

Θ 2
Θ 3
Ο

Ο
Ω

CuuDuongThanCong.com

4


1/10/2011

TỐC ĐƠ TĂNG VÀ QUAN 
HÊ THỐNG TRỊ

TỐC ĐƠ TĂNG VÀ QUAN HÊ THỐNG TRỊ
• O lớn nhóm các hàm thành các lớp hàm. 
4 và 100.3
3 là thuộc lớp hàm Θ

• Hai hàm  , thuộc hai lớp khác nhau có quan hệ theo các ký hiệu 
tiệm cận Ω, Ο khác nhau
• Các lớp hàm thơng dụng:

• Tốc độ tăng của một số hàm 
thơng dụng










Hàm hằng 
1. Thời gian thực hiện là hằng số VD hàm tính tổng 2 số
Hàm loga 
. VD tìm kiếm nhị phân
Hàm tuyến tính 
. VD Tìm giá trị lớn nhất trong dãy số
Hàm siêu tuyến tính 
. VD QuickSort, MergeSort
Hàm bậc hai 
. VD Sắp xếp nổi bọt (bubble sort )
Hàm bậc ba 
.
,  là hằng số >1.
Hàm mũ 

Hàm giai thừa 
!

TỐC ĐƠ TĂNG VÀ QUAN HÊ THỐNG TRỊ

CÁC PHÉP TÍNH VỚI O LỚN

• Quan hệ thống trị: 
!≫


≫ log ≫ ≫ log ≫ 1
• Giới hạn và quan hệ thống trị của các hàm


thống trị 

• Cộng hai hàm

0

nếu  lim


VD. 
3

khơng thống trị 
thống trị 


!≫

.

5 vì  lim
vì  lim


Ο

→ Ο max

,

•Ω

Ω

→ Ω max

,

•Θ

Θ

→ Θ max

,


• Nhân hàm

3



•Ο

0




≫ log ≫ ≫
≫ log
≫ log ≫ log /loglog ≫ loglog ≫ 1

•Ο



→Ο

•Ω



→Ω

•Θ




→Θ

là một hằng số dương bất kỳ

CuuDuongThanCong.com

5


1/10/2011

CÁC PHÉP TÍNH VỚI O LỚN

MỘT SỐ TÍNH CHẤT

• Nhân hai hàm
•Ο

∗Ο

→Ο



•Ω

∗Ω


→Ω



•Θ

∗Θ

→Θ



Tính truyền ứng – transitivity
Ο
và 
• Nếu 
Ω
và 
• Nếu 
• Nếu 
Θ
và 

Ο
Ω
Θ

Tính đối xứng – symmetry 
Θ

khi và chỉ khi 


thì 
thì 
thì 

Ο
Ω
Θ

Θ

Tính đối xứng chuyển vị ‐ transpose symmetry
Ο
khi và chỉ khi 
Ω


MỘT SỐ TÍNH CHẤT

Thuật tốn sắp xếp lựa chọn – Selection Sort

Chứng minh 
Ο
Nếu 
Ta có


Suy ra


Chọn 
Vậy 

MỘT SỐ VÍ DỤ

và 

Ο
Ο

tức là 
tức là 

và 

với 
max ,

Ο

thì 

Ο

selection_sort(int s[], int n)
{
int i,j; /* counters */
int min; /* index of minimum */
for (i=0; i

min=i;
for (j=i+1; jif (s[j] < s[min]) min=j;
swap(&s[i],&s[min]);
}
}

với 
với 
max
thì 

,
khi 

Ο

CuuDuongThanCong.com

6


1/10/2011

MỘT SỐ VÍ DỤ

MỘT SỐ VÍ DỤ

• Lệnh được lặp lại nhiều nhất chính là lệnh if


• Phân tích chi tiết hơn

0 lệnh if lặp 
2 lần (từ 1 tới n‐1)

1 lệnh if lặp 
3 lần (từ 2 tới n‐1)

Phân tích trong trường hợp tồi nhất
• Vịng lặp ngồi lặp n lần (từ 0 tới n‐1)




2 lệnh if lặp 1 lần (từ n‐1 tới n‐1)

1 lệnh if lặp 0 lần
• Số lần lặp của if sẽ là 
2
3
⋯ 1 0

• Vịng lặp trong lặp n lần ứng với mỗi lần lặp của vịng ngồi
• Vậy số lượng bước (thời gian) cần thực hiện trong trường 
hợp tồi nhất là 
→Ο

• Vậy 

2


1 /2

Θ

MỘT SỐ VÍ DỤ

MỘT SỐ VÍ DỤ

• Sắp xếp chèn – Insertion Sort
for (i=1; ij=i;
while ((j>0) && (s[j] < s[j‐1])) {
swap(&s[j],&s[j‐1]);
j = j‐1;
}
}

• Phân tích trong trường hợp tồi nhất

1 lệnh cơ sở lặp 1 lần

2 lệnh cơ sở lặp 2 lần 


2 lệnh cơ sở lặp 
2 lần 

1 lệnh cơ sở lặp 
1 lần

• Số lần lặp của lệnh cơ sở sẽ là 
1 2 ⋯
2
1
• Vậy 

• Lệnh được lặp nhiều nhất là 2 lệnh bên trong while : lệnh cơ sở

1

/2

Ο

CuuDuongThanCong.com

7


1/10/2011

Mơtsốcơngthứchaydùng
• ∑ 1
• ∑

1
1

2 ..


• ∑

1

• ∑

1



..

2



..
3

..
với 

• ∑

nếu 

• ∑

2




1

1
..

CuuDuongThanCong.com

8


Bài tập chương 1
Phần 2
Bài 1. Xác định giá trị trả về của các hàm sau (dưới dạng 1 hàm của n), và phân tích thời gian thực hiện
trong trường hợp tồi nhất sử dụng ký hiệu O-lớn.
a) Hàm mystery
int mystery(int n)
{
int r = 0;
for (int i = 1; ifor (int j = i + 1; j<=n; j++)
for (int k = 1; k<=j; k++)
r = r + 1;
return r;
}

b) Hàm pesky
int pesky(int n)
{

int r = 0;
for (int i = 1; i<= n; i++)
for (int j = 1; j<= i; j++)
for (int k = j; k<= i + j; k++)
r = r + 1;
return r;
}

c) Hàm prestiferous
int prestiferous(int n)
{
int r = 0;
for (int i = 1; i<= n; i++)
for (int j = 1; j<= i; j++)
for (int k = j; k<= i + j; k++)
for (int l = 1; l<= i + j − k; l++)
r = r + 1;
return r;
}

d) Hàm conundrum
int conundrum(int n)
{
int r = 0;
for (int i = 1; i<= n; i++)
for (int j = i + 1; j<= n; j++)
for (int k = i + j − 1; k<= n; k++)
r = r + 1;

CuuDuongThanCong.com



}

return r;

Bài 2. Xác định mối quan hệ giữa các cặp hàm 𝑓(𝑛), 𝑔(𝑛). Các mối quan hệ có thể có là
𝑓(𝑛) = Ο(𝑔(𝑛)), 𝑓(𝑛) = Ω(𝑔(𝑛)), 𝑓(𝑛) = Θ(𝑔(𝑛)).
a) 𝑓(𝑛) = log 𝑛2, 𝑔(𝑛) = log 𝑛 + 5.
b)
c)
d)
e)
f)
g)
h)

𝑓(𝑛) = √𝑛, 𝑔(𝑛) = log 𝑛2 .
𝑓(𝑛) = log 2𝑛, 𝑔(𝑛) = log 𝑛.
𝑓(𝑛) = 𝑛, 𝑔(𝑛) = log 2𝑛.
𝑓(𝑛) = 𝑛 log 𝑛 + 𝑛, 𝑔(𝑛) = log 𝑛.
𝑓(𝑛) = 2𝑛 , 𝑔(𝑛) = 10𝑛2
𝑓(𝑛) = 10, 𝑔(𝑛) = log 10
𝑓(𝑛) = 2𝑛 , 𝑔(𝑛) = 3𝑛

Bài 3. Với mỗi cặp hàm 𝑓(𝑛), 𝑔(𝑛) sau thì quan hệ nào là đúng trong các quan hệ sau 𝑓(𝑛) = Ο(𝑔(𝑛)),
𝑔(𝑛) = Ο(𝑓(𝑛)), hoặc cả hai.
a) 𝑓(𝑛) = 𝑛(𝑛 − 1)/2, 𝑔(𝑛) = 6𝑛
b) 𝑓(𝑛) = 𝑛 + 2√𝑛, 𝑔(𝑛) = 3𝑛
c) 𝑓(𝑛) = 𝑛 + √𝑛, 𝑔(𝑛) = 𝑛2


d) 𝑓(𝑛) = 𝑛log𝑛, 𝑔(𝑛) = 𝑛√𝑛/3

e) 𝑓(𝑛) = 𝑛 + log𝑛, 𝑔(𝑛) = 3√𝑛 + 10
f) 𝑓(𝑛) = (log𝑛)2 , 𝑔(𝑛) = 𝑛log√𝑛

g) 𝑓(𝑛) = 4𝑛 + 3log𝑛, 𝑔(𝑛) = 𝑛2 + √𝑛

Bài 4. Chứng minh

a) 2𝑛2 + 3𝑛 − 6 = Θ(𝑛2 )
b) 𝑛2 + 2√𝑛 = Ο(2𝑛 )
c) 𝑛3 − 3𝑛 + 3𝑛2 − 1 = Ω(𝑛2 )

Bài 5. Xác định mối quan hệ giữa các cặp hàm 𝑓(𝑛) và 𝑔(𝑛) sau đây
a) 𝑓(𝑛) = 𝑛2.5 + 3(𝑛 − 1), 𝑔(𝑛) = 6𝑛
b) 𝑓(𝑛) = 𝑛2 + 3√𝑛 − 1), 𝑔(𝑛) = 𝑛3
c) 𝑓(𝑛) = 2𝑛2.5 + 𝑛, 𝑔(𝑛) = √𝑛5

Bài 6. Chứng minh

a) Nếu 𝑓1 (𝑛) = Ο(𝑔1 (𝑛)), và 𝑓2 (𝑛) = Ο(𝑔2 (𝑛)) thì 𝑓1 (𝑛) + 𝑓1 (𝑛) = Ο(𝑔1 (𝑛) + 𝑔2 (𝑛))
b) Nếu 𝑓1 (𝑛) = Ω(𝑔1 (𝑛)), và 𝑓2 (𝑛) = Ω(𝑔2 (𝑛)) thì 𝑓1 (𝑛) + 𝑓1 (𝑛) = Ω(𝑔1 (𝑛) + 𝑔2 (𝑛))
c) Nếu 𝑓1 (𝑛) = Ο(𝑔1 (𝑛)), và 𝑓2 (𝑛) = Ο(𝑔2 (𝑛)) thì 𝑓1 (𝑛) ∙ 𝑓1 (𝑛) = Ο(𝑔1 (𝑛) ∙ 𝑔2 (𝑛))

Bài 7. Chứng minh

CuuDuongThanCong.com



a) 𝑎0 + 𝑎1 𝑥 + 𝑎2 𝑥 2 +. . +𝑎𝑛 𝑥 𝑛 = Ο(𝑥 𝑛 ) với 𝑛 > 1, và các hằng số 𝑎0, 𝑎1, . . , 𝑎𝑛 là các hằng số bất kỳ
b) (𝑛 + 𝑎)𝑘 = Θ(𝑛𝑘 ) với 𝑘 ≥ 1, và 𝑎 là hằng số bất kỳ

Bài 8. Sắp xếp các hàm dưới đây theo thứ tự tăng dần độ phức tạp

a) 𝑛, √𝑛, 𝑛 + 3𝑛1/2 , lg𝑛, 𝑛log𝑛, 𝑛 + 3ln𝑛, 𝑛2 + 3𝑛1.5, loglog𝑛, 2𝑛3 + loglog𝑛, 𝑛3 ,
𝑛 − 2𝑛2 + 3𝑛2.5, 𝑛!, (ln𝑛)2 , 𝑛 + 2𝑛 log 𝑛5, 2𝑛
b) 6𝑛, (2 + 𝑎)10 , (𝑛 + 3)2 ,

𝑛+2𝑛
, 𝑛!,
𝑛

𝑛loglog𝑛,

𝑛+5𝑛3
, (1/3)𝑛
lg𝑛

Bài 9. Những khẳng định sau đây là đúng hay sai, tại sao?
a)
b)
c)
d)

với 𝑎 là hằng số bất kỳ

3𝑛 = Ο(2𝑛 )
log(5𝑛 ) = Ο(ln 2𝑛 )
3𝑛 = Ω(2𝑛 )

log(5𝑛 ) = Ω(ln 2𝑛 )

Bài 10. Tìm dạng hàm 𝑔(𝑛) đơn giản mà 𝑓(𝑛) = Θ(𝑔(𝑛)) cho các hàm 𝑓(𝑛) sau đây
a) 𝑓(𝑛) = ∑𝑛𝑖=1

1
𝑖
2

b) 𝑓(𝑛) = ∑𝑛𝑖=1 𝑖
c) 𝑓(𝑛) = ∑𝑛𝑖=1 log 𝑖
1

d) 𝑓(𝑛) = ∑𝑛𝑖=1 � �
𝑖
e)
f)
g)
h)

𝑓(𝑛) = ∑𝑛𝑖=1 log(𝑛!)
𝑓(𝑛) = ∑𝑛𝑖=1 √𝑖
𝑓(𝑛) = ∑𝑛𝑖=1 2𝑖
𝑓(𝑛) = ∑𝑛𝑖=1 3𝑖 + 22𝑖

Bài 11. Tìm các hàm 𝑔(𝑛) đơn giản mà 𝑓(𝑛) = Θ(𝑔(𝑛)) cho các hàm 𝑓(𝑛) sau đây
a) 𝑓(𝑛) = 2𝑛 + 𝑛2
b) 𝑓(𝑛) = 𝑛2 + 𝑛√𝑛 + log 𝑛
c) 𝑓(𝑛) = log 20𝑛 + 𝑛2
2

3

d) 𝑓(𝑛) = ( )𝑛 + 𝑛3

Bài 12. Chứng minh rằng

12 − 22 + 32 − 42 + ⋯ + (−1)𝑛−1 𝑛2 = (−1)𝑛−1 𝑛(𝑛 − 1)⁄2

Bài 13. Xem xét đoạn chương trình in ra xâu “Hello” sau
for (i=1; i<=n; i++)
for (j=i; j<=2*i; j++)
printf("Hello");

CuuDuongThanCong.com


Gọi 𝑇(𝑛) là số lần thực hiện lệnh in ra màn hình. Hãy

a) Xác định hàm 𝑇(𝑛) theo 𝑛.
b) Biểu diễn dạng rút gọn của 𝑇(𝑛) theo ký hiệu O lớn.

Bài 14. Xem xét đoạn chương trình in ra xâu “Hello” sau
for (i=1; i<= n/2; i++)
for (j=i; j<= n-i; j++)
for (k=1; k<= j; k++)
printf("Hello");

Gọi 𝑇(𝑛) là số lần thực hiện lệnh in ra màn hình. Hãy

a) Xác định hàm 𝑇(𝑛) theo 𝑛.

b) Biểu diễn dạng rút gọn của 𝑇(𝑛) theo ký hiệu O lớn.

Bài 15. Bài toán khớp xâu:

Đầu vào: Một xâu 𝑡 và một mẫu (xâu con) 𝑝
Đầu ra: 𝑝 có xuất hiện trong 𝑡 hay khơng, nếu có thì tại vị trí nào.

Ví dụ. 𝑡 = 𝐴𝐵𝐵𝐴𝐴𝐵𝐶𝐷𝐵𝐵𝐴 và 𝑝 = 𝐴𝐵𝐶𝐷

0 1 2 3 4 5 6 7 8 9 0
0 A B C
1
A
2
A
3
A B
4
A B C D
A B B A A B C D B B A

int findmatch(char *p, char *t)
{
int i,j; /* counters */
int m, n; /* string lengths */
m = strlen(p);
n = strlen(t);
for (i=0; i<=(n-m); i=i+1) {
j=0;
while ((j

j = j+1;
if (j == m) return(i);
}
return(-1);
}

CuuDuongThanCong.com


×