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; j
if (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; i
j=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; i
for (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