BÀI TẬP MÔN PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁN
by
Hoàng Quang Khải - 21520952
Lê Tuấn Vũ - 21521679 Nguyễn Nhật Minh - 21521135
Lê Tiến Quyết - 21520428
Faculty of Computer Science
Homework #01: Đánh giá thuật toán dùng kỹ thuật toán sơ cấp
GV hướng dẫn:
Huỳnh Thị Thanh Thương
TPHCM, March 9, 2023
Trang 21 Tính tổng hữu hạn
a) 1+3+5+7+ .+999 = n(2a1+ (n − 1)d)
500(2 + 499.2)
b) 2 + 4 + 8 + 16 + + 1024 = a(1 − r
n+1)
2(1 − 29+1)
1 − 2 = 2046 c)
n+1
X
i=3
1 = n + 1 − 3 + 1 = n − 1
d)
n+1
X
i=3
i =
n+1
X
i=1
i −
2
X
i=1
i = (n + 1)(n + 2)
2 n
2+ 3n − 4
e)
n−1
X
i=0
i(i + 1) =
n−1
X
i=0
(i2+ i) =
n−1
X
i=0
i2 +
n−1
X
i=0
i
= n(n − 1)(2n − 1)
n(n − 1)
n(n + 1)2
3 f)
n
X
j=1
3j+1 = 3
n
X
j=1
3j = 3
n
X
j=0
3j − 30
!
= 3 3n+1− 1
3 − 1 − 1
= 3
n+2− 9 2
= 9
2(3
n− 1)
g)
n
X
i=1
n
X
j=1
ij =
n
X
i=1
in(n + 1)
n(n + 1) 2
n(n + 1)
(n2+ n)2
4 h)
n
X
i=1
1 i(i + 1) =
n
X
i=1
i 1
i + 1
= 1
1−1
2+
1
2−1
3+ .+
1
n + 1
n + 1 i) X (j2 + j) = (22 + 2) + (32+ 3) + (52+ 5) = 48
Trang 3m
X
i=1
n
X
j=0
100
X
k=0
(i+j) = 101
m
X
i=1
n
X
j=0
(i+j) = 101
m
X
i=1
i(n + 1) + n(n + 1)
2
= 101 m(n + 1)(m + 1)
mn(n + 1) 2
= 101
2 m(n+1)(m+n+1)
i ← 1;
while i ≤ n do
while j ≤ i2 do
j ← j + 1;
end
end
Gọi αi là số lần lặp của vòng lặp while nhỏ với điều kiện j ≤ i2 (αi ≥ 1)
Vì αi là số con j mà j chạy từ 1 → i2 với bước tăng là 1
Do đó, αi nhận các giá trị {1, 4, 9, , i2} → αi = i2
Kết luận
Gán(n) = 2 + 2n +
n
X
i=1
2αi = 2 + 2n + 2
n
X
i=1
i2 = 2 + 2n + n(n + 1)(2n + 1)
3
= 2n
3+ 3n2+ 7n + 6 3
Sosánh(n) = n + 1 +
n
X
i=1
(αi+ 1) = n + 1 +
n
X
i=1
i2 +
n
X
i=1
1
= 2n + 1 + n(n + 1)(2n + 1)
2n3+ 3n2+ 13n + 6
6
Trang 43 Đếm số phép gán và so sánh
i ← 1;
while i ≤ n do
while j ≤ i2 do
j ← j + 1;
end
end
Gọi αi là số lần lặp của vòng lặp while nhỏ với điều kiện j ≤ i2 (αi ≥ 1)
Vì αi là số con j mà j chạy từ n − i2 → i2 với bước tăng là 1
Do đó, αi nhận các giá trị {n − i2, , i2}
⇒ αi = i2− (n − i2) + 1 = 2i2− n + 1
Với αi ≥ 1 ⇔ n − i2− i2 ≤ 0 ⇒ i ≥r n
2
(i ≥ 1)
Ta có:
Gán(n) = 2 + 2n +
n
X
i=1
2αi = 2 + 2n + 2
n
X
i=1
(2i2− n + 1)
= 2 + 2n + 2
n
X
i=⌈√n
2⌉ (2i2− n + 1)
Sosánh(n) = n + 1 +
n
X
i=1
(αi+ 1) = n + 1 +
n
X
i=1
αi+
n
X
i=1
1
= 2n + 1 +
n
X
i=⌈√n
2⌉ (2i2− n + 1)
Trang 5Đặt t = n2, ta được:
n
X
i=⌈√n
2⌉
(2i2− n + 1) =
n
X
i=t
(2i2− n + 1) =
n
X
i=t
(−n + 1) + 2
n
X
i=t
i2
= (−n + 1)(n − t + 1) + 2
n
X
i=1
i2− 2
t−1
X
i=1
i2
= (−n + 1)(n − t + 1) + n(n + 1)(2n + 1)
3 Kết luận
Gán(n) = 2 + 2n + 2(−n + 1)(n − t + 1) + 2
3[n(n + 1)(2n + 1) − t(t − 1)(2t − 1)]
= 4 + 2(−n + 1)(n − t) + 2
3[n(n + 1)(2n + 1) − t(t − 1)(2t − 1)]
Sosánh(n) = 2n + 1 + (−n + 1)(n − t + 1) + 1
3[n(n + 1)(2n + 1) − t(t − 1)(2t − 1)]
= 2 + n + (−n + 1)(n − t) + 1
3[n(n + 1)(2n + 1) − t(t − 1)(2t − 1)] Với t =pn2
float Function Alpha (float x, long n)
float z ← 0;
while i ≤ n do
float t ← 1;
while j ≤ i do
j ← 2j;
end
i ← i + 1;
end
return z;
Trang 6Gọi αi là số lần lặp của vòng lặp while nhỏ với điều kiện j ≤ i (αi ≥ 1)
Vì αi là số con j mà j chạy từ 1 → i với tỉ lệ bước tăng là 2
Và j nhận các giá trị {1, 2, 4, 8, 16, , 2k}, k ∈ N
Do đó: αi là số phần tử của tập {k ∈ N | 2k≤ i} ⇒ 0 ≤ k ≤ log2i
⇒ αi = ⌊log2i⌋ + 1
Kết luận
Gán(n) = 2 + 4n +
n
X
i=1
2αi = 2 + 4n + 2
n
X
i=1
(⌊log2i⌋ + 1)
= 2 + 4n + 2
n
X
i=1
⌊log2i⌋ + 2
n
X
i=1
1 = 2 + 6n + 2
n
X
i=1
⌊log2i⌋
≈ 2 + 6n + 2n log n
Sosánh(n) = n + 1 +
n
X
i=1
(αi+ 1) = n + 1 +
n
X
i=1
⌊log2i⌋ +
n
X
i=1
2
= 3n + 1 +
n
X
i=1
⌊log2i⌋ ≈ 3n + 1 + n log n
i ← 1;
while i ≤ n do
while j ≤ 2i do
j ← j + 2;
end
while k > 0 do
k ← k/2;
end
end
Trang 7Gọi αi là số lần lặp của vòng lặp while nhỏ với điều kiện j ≤ 2i.
Vì αi là số con j mà j chạy từ n − i → 2i với bước tăng là 2
Do đó:
αi là số phần tử của tập {n − i, n − i + 2, , 2i} = 2i − (n − i)
= 3i − n + 2
2 Với αi ≥ 1 ⇔ n − i ≤ 2i ⇔ i ≥ n
3. Vậy:
αi =
0, i <
ln 3 m
3i − n + 2
ln 3 m
Gọi βi là số lần lặp của vòng lặp while nhỏ với điều kiện k > 0
Vì βi là số con j mà j chạy từ i → 1 với tỉ lệ bước giảm là 1
2.
Do đó:
βi là số phần tử của tập
i, i
2,
i
4, ,
i
2k | k ∈ N, i
2k ≥ 1
⇒ 0 ≤ k ≤ log2i Vậy:
βi = ⌊log2i⌋ + 1
Ta có
Gán(n) = 2 + 3n +
n
X
i=1
2αi+
n
X
i=1
2βi
= 2 + 3n +
n
X
i=⌈n
3⌉ (3i − n + 2) + 2
n
X
i=1
(⌊log2i⌋ + 1)
= 2 + 5n +
n
X
i=⌈n
3⌉ (3i − n + 2) + 2
n
X
i=1
⌊log2i⌋
Trang 8Sosánh(n) = n + 1 +
n
X
i=1
(αi+ 1) +
n
X
i=1
(βi+ 1)
= n + 1 +
n
X
i=1
αi+
n
X
i=1
βi+ 2
n
X
i=1
1
= 3n + 1 + 1
2
n
X
i=⌈n
3⌉ (3i − n + 2) +
n
X
i=1
(⌊log2i⌋ + 1)
= 4n + 1 + 1
2
n
X
i=⌈n
3⌉ (3i − n + 2) +
n
X
i=1
⌊log2i⌋
Đặt t =n3, ta được:
n
X
i=⌈n
3⌉
(3i − n + 2) =
n
X
i=t
(−n + 2) + 3
n
X
i=t
i
= (−n + 2)(n − t + 1) + 3
2(n − t + 1)(n + t) Kết luận
Gán(n) = 2 + 5n + (−n + 2)(n − t + 1) + 3
2(n − t + 1)(n + t) + 2
n
X
i=1
⌊log2i⌋
= 4 +15
2 n +
1
2n
2+1
2t(2n − 1) −
3
2t
2 + 2
n
X
i=1
⌊log2i⌋
≈ 4 + 15
2 n +
1
2n
2+ 1
2t(2n − 1) −
3
2t
2+ 2n log n
Sosánh(n) = 4n + 1 + 1
2(−n + 2)(n − t + 1) +
3
4(n − t + 1)(n + t) +
n
X
i=1
⌊log2i⌋
= 2 + 21
4 n +
1
4n
2+ 1
4t(2n − 1) −
3
4t
2+
n
X
i=1
⌊log2i⌋
≈ 2 + 21
4 n +
1
4n
2+1
4t(2n − 1) −
3
4t
2+ n log n
Trang 96 Đếm số phép gán và so sánh
count ← 0;
while i ≤ 4n do
y ← i − 2n;
j ← 1;
while j ≤ x do
j ← j + 2;
end
if x > 0 then
if y > 0 then
end
end
end
Gọi αi là số lần lặp của vòng lặp while nhỏ với điều kiện j ≤ x
Vì αi là số con j mà j chạy từ 1 → x với bước tăng là 2
Do đó:
αi là số phần tử của tập {1, 3, 5, , x} = x − 1
x + 1
2 ≈lx
2 m
≈ (n − i)(i − 3n)
2
Với αi ≥ 1 ⇔ n + 1 ≤ i ≤ 3n − 1
Trang 10αi =
0, i ≤ n hoặc i ≥ 3n
(n − i)(i − 3n)
2
, n + 1 ≤ i ≤ 3n − 1
Ta có bảng xét dấu:
i
x = (n − i)(i − 3n)
y = i − 2n
Kết luận
Gán(n) = 2 + 4 × 4n +
4n
X
i=1
2αi+ [3n − 1 − (2n + 1) + 1]
= 17n + 1 + 2
3n−1
X
i=n+1
(n − i)(i − 3n)
2
≈ 17n + 1 +1
3n(4n
2− 1) = 4
3n
3+50
3 n + 1
Sosánh(n) = 4n + 1 +
4n
X
i=1
(αi+ 1) + 4n + [3n − 1 − (n + 1) + 1]
= 14n +
3n−1
X
i=n+1
(n − i)(i − 3n)
2
≈ 14n +1
3n(4n
2− 1) = 41
3 n +
4
3n
3
Trang 117 Đếm số phép gán và so sánh
count ← 0;
while i ≤ 4n do
y ← i − 2n;
j ← 1;
while j ≤ x do
if i ≥ 2y then
end
end
end
Gọi αi là số lần lặp của vòng lặp while nhỏ với điều kiện j ≤ x
Vì αi là số con j mà j chạy từ 1 → x với bước tăng là 1
Do đó:
αi là số phần tử của tập {1, 2, 3, , x} = x = (n − i)(i − 3n)
Với αi ≥ 1 ⇔ n + 1 ≤ i ≤ 3n − 1
Vậy:
αi =
0, i ≤ n hoặc i ≥ 3n (n − i)(i − 3n), n + 1 ≤ i ≤ 3n − 1
Ta có bảng xét dấu:
i
x = (n − i)(i − 3n)
y = i − 2n
Để câu lệnh count ← count − 2 được thực hiện ⇔ i ≤ 2y ⇔ i ≤ 2(i − 2n)
⇔ i ≤ 4n ⇒ Câu lệnh luôn được thực hiện khi while i ≤ 4n thoả mãn
Trang 12Ta có
Gán(n) = 2 + 4 × 4n +
4n
X
i=1
2αi = 2 + 16n + 2
3n−1
X
i=n+1
(n − i)(i − 3n)
Sosánh(n) = 4n + 1 +
4n
X
i=1
(αi+ 1) +
4n
X
i=1
αi
= 8n + 1 + 2
3n−1
X
i=n+1
(n − i)(i − 3n)
Xét:
3n−1
X
i=n+1
(n − i)(i − 3n) =
3n−1
X
i=n+1
(−3n2+ 4ni − i2)
= −3n2
3n−1
X
i=n+1
1 + 4n
3n−1
X
i=n+1
i −
3n−1
X
i=n+1
i2
= −3n2(2n − 1) + 4n × 2n(2n − 1) −
3n−1
X
i=1
i2+
n
X
i=1
i2
= 10n3− 5n2−3n(3n − 1)(6n − 1)
n(n + 1)(2n + 1)
4n3− n 3 Kết luận
Gán(n) = 2 + 16n + 2
3(4n
3− n) = 6 + 46n + 8n
3
3
Sosánh(n) = 1 + 8n + 2
3(4n
3 − n) = 3 + 22n + 8n
3
3
Trang 138 Đếm số phép gán và so sánh
count ← 0;
while i ≤ 3n do
y ← i − n;
j ← 1;
while j ≤ x do
if j ≥ n then
end
end
if y > 0 then
if x > 0 then
end
end
end
Gọi αi là số lần lặp của vòng lặp while nhỏ với điều kiện j ≤ x
Vì αi là số con j mà j chạy từ 1 → x với bước tăng là 1
Do đó:
αi là số phần tử của tập {1, 2, 3, , x} = x = 2n − i
Với αi ≥ 1 ⇔ i ≤ 2n − 1
Ta có bảng xét dấu:
i
x = 2n − i
y = i − n
Gọi βi là số lần câu lệnh if j ≥ n thoả mãn
Trang 14βi = số phần tử của tập hợp {n, n + 1, , x} = x − n + 1
= 2n − i − n + 1 = n − i + 1 Với βi ≥ 1 ⇔ i ≤ n
Từ bảng xét dấu:
x > 0 ⇔ 1 ≤ i ≤ 2n − 1
y > 0 ⇔ n + 1 ≤ i ≤ 3n
x > 0
y > 0 ⇔ n + 1 ≤ i ≤ 2n − 1
Kết luận
Gán(n) = 2 + 4 × 3n +
3n
X
i=1
βi+
3n
X
i=1
αi+ [2n − 1 − (n + 1) + 1]
= 1 + 13n +
n
X
i=1
(n − i + 1) +
2n−1
X
i=1
(2n − i)
= 1 + 13n + (n + 1)
n
X
i=1
1 −
n
X
i=1
i + 2n
2n−1
X
i=1
1 −
2n−1
X
i=1
i
= 1 + 13n + n(n + 1) −n(n + 1)
2 + 2n(2n − 1) −
2n(2n − 1) 2
= 5n
2+ 25n + 2 2
Sosánh(n) = 3n + 1 +
3n
X
i=1
(αi+ 1) +
3n
X
i=1
αi+ 3n + [3n − (n + 1) + 1]
= 1 + 8n +
3n
X
i=1
1 + 2
3n
X
i=1
αi
= 1 + 11n + 2
2n−1
X
i=1
(2n − i)
= 1 + 11n + 4n
2n−1
X
i=1
1 − 2
2n−1
X
i=1
i
= 1 + 11n + 4n(2n − 1) − 2 × 2n(2n − 1) = 4n2+ 9n + 1
Trang 159 Đếm số phép gán và so sánh
res ← 0;
while i≤ n do
k ← 1;
while j ≤ i do
k ← k + 2;
j ← j + k;
end
end
Gọi αi là số lần lặp của vòng lặp while nhỏ với điều kiện j ≤ i
Vì αi là số con j mà j chạy từ 1 → i với bước tăng là một cấp số cộng với
số hạng đầu là u1 = 3 và công bội d = 2
Do đó:
αi là số phần tử của tập {1, 4, 9, , i} = số phần tử của tập {m ∈ N∗ | m2 ≤ i} Vậy:
αi =j√
ik Kết luận
Gán(n) = 2 + 3n +
n
X
i=1
3αi = 2 + 3n + 3
n
X
i=1
j√
ik
= 2 + 3n +1
2√n−2√n2− 3√n + 6n + 5
Sosánh(n) = n + 1 +
n
X
i=1
(αi+ 1) = 2n + 1 +
n
X
i=1
αi
= 2n + 1 +
n
X
i=1
j√
ik
= 2n + 1 + 1
6√n−2√n2− 3√n + 6n + 5
Trang 1610 Đếm số phép gán và so sánh
i ← 1;
idx ← −1;
while i ≤ n do
while j ≤ n do
if (i = j) AND (i + j = n + 1) then
idx ← i;
end
j ← j + 1;
end
end
if idx ̸= −1 then
sum ← sum − a[idx][idx];
end
Để gán idx ← i :
i = j
i + j = n + 1 ⇔ 2i = n + 1 ⇔ n lẻ Nhận xét:
TH 1: n lẻ → tồn tại duy nhất 1 trường hợp thoả mãn điều kiện để idx ← i,
khi đó:
Gán(n) = 3 + 2n + (1 + 2n2) + 1 = 2n2+ 2n + 5
Sosánh(n) = n + 1 + n(n + 1) + 2n2+ 1 = 3n2 + 2n + 2
TH 2: n chẵn → không tồn tại trường hợp thoả mãn điều kiện ⇒ idx ← −1,
khi đó:
Gán(n) = 3 + 2n + 2n2
Sosánh(n) = n + 1 + n(n + 1) + 2n2+ 1 = 3n2 + 2n + 2
Kết luận
Gán(n) = 2n2 + 2n + 5, n lẻ
2n2 + 2n + 3, n chẵn Sosánh(n) = 3n2+ 2n + 2