You are on page 1of 8

Chương 1

LÝ THUYẾT TẬP HỢP

1.1 Khái niệm tập hợp


- Lý thuyết tập hợp được nhà toán học người Đức tên là Cantor xây dựng.
- Tập hợp là một tổng thể các đối tượng (được gọi là các phần tử của tập hợp) có cùng chung một tính chất chung nào đó.
- Kí hiệu:
+ Tập hợp: Kí hiệu bằng chữ in hoa. Ví dụ: A, B, C, D,...
+ Phần tử: Kí hiệu bằng chữ thường. Ví dụ: x, y, z,....

1.2 Các cách biểu diễn của tập hợp


- Phương pháp liệt kê:
+ A = {1, 3, 5, 7, 8}
+ B = { xuân, hạ, thu, đông }
- Mô tả tính chất: X = {x|P (x)} (X là tập hợp chứa các phần tử x có tính chất P ).
+ A = {n|n = 2k + 1, 0 < k < 4}
+ B = {x|x là các mùa trong năm}
- Giản đồ Venn: Thường sử dụng để mô tả mối tương quan giữa các tập hợp, không chú ý đến số lượng hay tính chất
của các phần tử.

1.3 Lực lượng của tập hợp


- Đối với tập hữu hạn: Là số lượng phần tử của tập hợp.
+ A = {1, 3, 5, 7, 8} thì lực lượng của A là |A|=5
+ B = { xuân, hạ, thu, đông } thì lực lượng của B là |B|=4
- Đối với tập vô hạn: Phân biệt giữa vô hạn đếm được và vô hạn không đếm được.
+ A = {2, 3, 5, ....} thì |A| hay tập N, Z vô hạn đếm được.
+ B = {x|x ∈ [0, 1]} thì |B| hay tập R, vô hạn không đếm được.
- Tập rỗng là tập không có phần tử nào và kí hiệu là ∅.

1.4 Tập hợp con và tập hợp bằng nhau


1.4.1 Tập hợp con
Định nghĩa: Cho trước hai tập hợp A và B. Ta nói rằng A là tập hợp con của B nếu như mỗi phần tử của A đếu là phần tử
thuộc tập B.
- Kí hiệu: A ⊆ B
- Cho trước tập hợp A, ta kí hiệu tập tất cả các tập hợp con của A là P(A).
Ví dụ: Cho A={1;2}
P(A)={ ∅, {1}, {2}, {1,2}}

1
Tính chất: Quan hệ "chứa nhau" (⊆) của tập hợp là một quan hệ có tính chất phản xạ và bắc cầu.
+ Với mọi tập hợp A ta có A ⊆ A.
+ Nếu A ⊆ B và B⊆ C thì A ⊆ C.

1.4.2 Tập hợp bằng nhau


Định nghĩa: Cho trước hai tập A và B là hai tập hợp bằng nhau khi và chỉ khi A là tập hợp con của B và B là tập hợp con
của A.
- Kí hiệu: A=B
- Nếu A ⊂ B và B ⊂ A thì A = B.
Tính chất: Quan hệ "bằng nhau" của tập hợp là một quan hệ tương đương:
- Với mọi tập A thì ta có A= A (tính phản xạ)
- Nếu A = B thì B = A (tính đối xứng)
- Nếu A = B và B = C thì A = C (tính bắc cầu)

1.5 Các phép toán của tập hợp


1.5.1 Phép hợp
Định nghĩa: Cho trước tập hợp A và tập hợp. Hợp của tập hợp A và tập hợp B là tập hợp chứa tất cả các phần tử thuộc A
hoặc thuộc B và chỉ nhứng phần tử đó mà thôi.
- Hợp của tập hợp A và tập hợp B được kí hiệu bởi A ∪ B.
- A ∪ B ={x | x ∈ A hoặc x ∈ B }
Tính chất:
- Luật đồng nhất: A ∪ ∅ ≡ A với mọi tập hợp A.
- Luật nuốt: A ∪ U ≡ U với mọi tập A ⊆ U.
- Luật lũy đẳng: A ∪ A ≡ A với mọi tập hợp A.
- Luật giao hoán: A ∪ B ≡ B ∪ A với mọi tập A, B.
- Luật kết hợp: (A ∪ B) ∪ C≡ A ∪ (B ∪ C) với mọi tập hợp A, B, C.
Bảng thuộc tính:
- Để chỉ một phần tử thuộc tập hợp, dùng số 1.
- Để chỉ một phần tử không thuộc một tập hợp, dùng số 0.

A B A∪B B∪A
1 1 1 1
1 0 1 1
0 1 1 1
0 0 0 0

1.5.2 Phép giao


Định nghĩa:Cho trước tập hợp A và tập hợp B. Giao của tập hợp A và tập hợp B là tập hợp chứa tất cả các phần tử vừa
thuộc tập hợp A vừa thuộc tập hợp B, và chỉ những phần tử đó mà thôi.
- Kí hiệu: A ∩ B.
- A ∩ B= { x | x ∈ A và x ∈ B }
Tính chất:
- Luật nuốt: A ∩ ∅ ≡ ∅ với mọi tập A.
- Luật đồng nhất: A ∩ U ≡A với mọi tập A ⊆ U.
- Luật lũy đẳng: A ∩ A ≡ A với mọi tập hợp A.
- Luật giao hoán: A ∩ B ≡ B ∩ A với mọi tập A, B.
- Luật kết hợp: (A ∩ B) ∩ C≡ A ∩ (B ∩ C) với mọi tập hợp A, B, C.
- A ∪ (B ∩ C) ≡ ( A ∪ B) ∩ ( A ∪ C)
- A ∩ (B ∪ C) ≡ ( A ∩ B) ∪ ( A ∩ C)
Lập bảng thuộc tính

2
1.5.3 Phép trừ
Định nghĩa: Cho trước tập hợp A và tập hợp U chứa tập hợp A. Khi đó ta nói hiệu U - A là phần bù của tập A trong tập
hợp U và kí hiệu là U - A bởi CA (U ) hoặc AU .
Ví dụ:
Cho A={0,1,2,3}; U=N. Vậy Ā={4,5,6,...}
Tính chất
- Luật bù: A ≡ A.
- Luật De Morgan cho giao: A ∩ B ≡ A ∪ B
- Luật De Morgan cho hợp: A ∪ B ≡ A ∩ B.
Định nghĩa: Hiệu đối xứng của hai tập hợp A và B là tập hợp chứa các phần tử chỉ thuộc đúng một trong hai tập hợp A
và B (hoặc thuộc A hoặc thuộc B) và chỉ chứa đúng các phần tử này.
- Kí hiệu: A∆B hoặc A ⊗ B.
- A ⊗ B = (A − B) ∪ (B − A)

1.6 Các hằng đẳng thức


Tên gọi Tương đương
Luật đồng nhất A∩A≡A∪A≡A∩U ≡A∪∅≡A≡A
Luật nuốt A ∪ U ≡ U ; A ∩ ∅ ≡ ∅; A ∪ A ≡ U ; A ∩ A = ∅
Luật hấp thụ A ∩ (A ∪ B) ≡ A; A ∪ (A ∩ B) ≡ A
Luật giao hoán A ∪ B = B ∪ A; A ∩ B = B ∩ A
Luật kết hợp (A ∩ B) ∩ C ≡ A ∩ (B ∩ C); (A ∪ B) ∪ C ≡ A ∪ (B ∪ C)
Luật phân phối A ∩ (B ∪ C) ≡ (A ∩ B) ∪ (A ∩ C); A ∪ (B ∩ C) ≡ (A ∪ B) ∩ (A ∪ C)
Luật De Morgan (A ∩ B) ≡ A ∪ B; (A ∪ B) ≡ A ∩ B

1.7 Tích Descartes


Định nghĩa: Cho A và B là hai tập hợp. Tích Descartes của A và B là tập hợp các cặp (a, b) với a ∈ A và b ∈ B.
- A × B = {(a, b)|a ∈ A, b ∈ B}
- A = ∅ hoặc B = ∅ thì A × B = ∅.
Định lý: Cho A1 , A2 , ..., An là các tập hữu hạn, khi đó |A1 × A2 × ... × An | = |A1 |.|A2 |...|An |, với |Ai | là số phần tử
(lực lượng) của tập hợp Ai , i = 1, 2, ..., n.
- Lưu ý: Tích Descartes không có tính giáo hoán như nhiều phép toán khác của tập hợp.

1.8 Biểu diễn tập hợp trên máy tính


- Xét một tập U đủ lớn để chứa các tập hợp đã cho, ví dụ là hợp của các tập hợp cho trước.
- Biểu diễn tập hợp A ứng với xâu a1 a2 a3 ...an với:
+ n là số phần tử của U.
+ ai = 0 nếu phần tử thứ i không thuộc A.
+ ai = 1 nếu phần tử thứ i thuộc A.
- Dễ thấy ∅ là xâu gồm toàn các bit 0.
- Ví dụ: Cho A = {1, 2, 4} và B = {1, 3, 5}. Biểu diễn xâu A và B.
U = {1, 2, 3, 4, 5} → n = 5. Biểu diễn xâu A: 11010; xâu B: 10101.
- Cách biểu diễn tập hợp bằng các xâu bit giúp chúng ta dễ dàng thực hiện các phép toán hợp, giao và trừ của tập hợp.

1.9 Luyện tập


1. Chứng minh luật De Morgan A ∩ B = A ∪ B
2. Bằng bảng thuộc tính hãy chứng minh:
a. A ∪ (B ∩ C) ≡ (A ∪ B) ∩ (A ∪ C)
b. A ∩ (B ∪ C) ≡ (A ∩ B) ∪ (A ∩ C)

3
3. Cho tập hợp E có n phần tử.
a. Tính |P (E)|.
b. Chứng minh rằng A ⊂ B ⇔ P (A) ⊂ P (B)
4. Cho A, B, C, D là các tập con của tập hợp U. Rút gọn các biểu thức tập hợp sau:
a. (A ∩ B) ∪ (A ∩ B ∩ C ∩ D) ∪ (A ∩ B)
b. A ∪ (A ∩ B) ∪ (A ∩ B ∩ C) ∪ (A ∩ B ∩ C ∩ D)
5. Cho A = {+, −}; B = {a, b, c}; C = {1, 2, 3}. Hãy xác định
a. A × B × C
b. A × C × B

4
Chương 2

THUẬT TOÁN

2.1 Định nghĩa


- Thuật toán (Algorithm) là một dãy các quy tắc nhằm xác định một dãy các thao tác trên đối tượng sao cho sau một
số hữu hạn bước thực hiện sẽ đạt được mục tiêu đặt ra.

Các đặc trưng (tính chất) cơ bản của thuật toán là:
a. Yếu tố input, output:
+ Đầu vào (Input): Mỗi thuật toán có một giá trị hoặc một bộ giá trị đầu vào từ một tập xác định đã được chỉ rõ.
+ Đầu ra (Output): Từ các giá trị đầu vào, thuật toán cho ra các giá trị cần tìm gọi là kết quả của bài toán.
b. Tính dừng: Sau một số hữu hạn bước thao tác thuật toán phải kết thúc và cho kết quả.
c. Tính xác định: Các thao tác phải rõ ràng, cho cùng một kết quả dù được xử lý trên các bộ xử lý khác nhau (hai bộ
xử lý trong cùng một điều kiện không thể cho hai kết quả khác nhau).
d. Tính hiệu quả: Sau khi đưa dữ liệu vào cho thuật toán hoạt động phải đưa ra kết quả như ý muốn.
e. Tính tổng quát: Thuật toán phải được áp dụng cho mọi bài toán cùng dạng chứ không phải chỉ cho một tập đặc biệt
các giá trị đầu vào.

2.2 Các cách mô tả thuật toán


Có nhiều cách mô tả thuật toán như:
- Mô tả bằng ngôn ngữ tự nhiên.
- Mô tả bằng sơ đồ khối.
- Mô tả bằng giả mã (Pseudo - code).
- Mô tả bằng ngôn ngữ lập trình nào đó,...
Ví dụ thuật toán
-Thuật toán: Tìm số nguyên lớn nhất trong danh sách n số nguyên (chưa sắp xếp).
• Mô tả thuật toán sử dụng ngôn ngữ tự nhiên:
+ Nếu không có số nào trong danh sách thì không có số lớn nhất.
+ Giả sử số đầu tiên là số lớn nhất trong danh sách.
+ Với mỗi số còn lại trong danh sách nếu số này lớn hơn số lớn nhất hiện tại thì coi số này là số lớn nhất trong
danh sách.
+ Khi tất cả các số trong danh sách đều được xem xét, số lớn nhất hiện tại là số lớn nhất trong danh sách.
Nhận xét: Mô tả bằng ngôn ngữ tự nhiên dài dòng và ít được sử dựng.
• Mô tả thuật toán sử dụng giả mã
Algorithm LargestNumber
Input: A list of numbers L.
Output: The largest number in list L.

5
largest ← null
for each item in L do
if item > largest then
largest ← item
return largest
Nhận xét:: Mô tả thuật toán bằng giả mã dễ hiểu, hay được sử dụng và không phụ thuộc vào ngôn ngữ lập trình.

2.3 Độ phức tạp của thuật toán


- Hầu hết các thuật toán được thiết kế làm việc với kích thướt dữ liệu đầu vào tùy ý.
Ví dụ thuật toán ở bài ví dụ trên, kích thướt đầu vào là số phần tử trong danh sách (n).
- Độ phức tạp thời gian (Time complexity): Xác định lượng gian gian cần thiết để thực hiện thuật toán. Được tính là số
phép toán cơ bản thực hiện thuật toán.
- Độ phức tạp không gian (space complexity): Xác định bộ nhớ cần thiết để thực hiện thuật toán. Lượng bộ nhớ lớn
nhất cần thiết để lưu các đối tượng của thuật toán tại một thời điểm thực hiện thuật toán.
Định nghĩa: Ta nói hàm f (n) có cấp thấp hơn hay bằng hàm g(n) nếu tồn tại hằng số C > 0 và một số tự nhiên n0 sau
cho: |f (n)| ≤ C.|g(n)| với mọi n ≥ n0 . Với n là số nguyên dương, là kích thướt dữ liệu đầu vào của thuật toán.
- Ta viết f (n) = O(g(n)) và f (n) thỏa mãn quan hệ big-O đối với g(n).
- Theo định nghĩa này, hàm g(n) là hàm đơn giản nhất có thể đại diện cho sự biến thiên của hàm f (n).
- Như vậy ta có:
f (n) = O(g(n)) ⇔ ∃C, n0 , ∀n ≥ n0 , f (n) ≤ C.g(n)
f (n)
Định lý: Nếu lim tồn tại và hữu hạn, thì f (n) = O(g(n)).
n→∞ g (n)
Các thuật ngữ thường dùng cho độ phức tạp của một thuật toán

Độ phức tạp Thuật ngữ


O(1) Độ phức tạp hằng số (Thời gian không đổi, bất kể kích thướt đầu vào)
O(n) Độ phức tạp tuyến tính (Thời gian chạy cùng tốc độ với đầu vào)
O(nb ) Độ phức tạp đa thức
O(logn) Độ phức tạp logarit
O(bn ) Độ phức tạp hàm mũ

2.4 Thuật toán tìm kiếm


Bài toán tìm kiếm được phát biểu như sau: Tìm trong dãy số a1 , a2 , ..., an một phần tử có giá trị bằng x cho trước và
ghi lại vị trí của phần tử tìm được.
Bài toán có nhiều ứng dụng trong thực tế. Ví dụ: Tìm kiếm từ trong từ điển, kiểm tra lỗi chình tả của một đoạn văn
bản,...
Có hai thuật toán cơ bản để giải bài toán này: Thuật toán tìm kiếm tuyến tính và thuật toán tìm kiếm nhị phân.

2.4.1 Thuật toán tìm kiếm tuyến tính


Đem so sánh x lần lượt với ai (i=1,2,...,n) nếu gặp một giá trị ai = x thì ghi lại vị trí của ai , nếu không gặp giá trị
ai = x nào (ai 6= x, ∀i) thì trong dãy không có số nào bằng x. Giải mã đối với thuật toán tìm kiếm tuyến tính được cho
dưới đây:
Procedure Tim_tuyen_tinh_phan_tu_bang_a
Input: x và dãy số a1 , a2 , ..., an ;
Ouput: Vị trí phần tử của dãy có giá trị bằng x, hoặc là số 0 nếu không tìm thấy x trong dãy.
begin
i:=1
while (i ≥ n and ai 6= x) do i:=i+1
if i 6= n then vitri:=i else vitri:=0;
end;

6
Như vậy nếu x được tìm thấy ở vị trí của dãy (ai = x) thì câu lênh i:=i+1 trong vòng lặp while được thực hiện i lần
(i=1,2,...,n). Nếu x không được tìm thấy, câu lệnh phải thực hiện n lần. Vậy số phép toán trung bình mà thuật toán phải
thực hiện là:
1 + 2 + ... + n n(n + 1) n+1
= = = O(n)
n 2n n

2.4.2 Thuật toán tìm kiếm nhị phân


Giả  các phần tử của dãy được xếp theo thứ tự tăng dần. Khi đó so sánh x với số ở giữa dãy, nếu x < am với
 thiết rằng
1+n
m= thì tìm x trong dãy a1 , a2 , ..., am , nếu x > am thì tìm x trong dãy am+1 , ..., an . Đối với mỗi dãy con (một
2
nữa của dãy đã cho) được làm tương tự để chỉ phải tìm phần tử có giá trị x ở một nửa dãy con đó. Quá trình tìm kiếm kết
thức khi tìm thấy vị trí của phần tử có giá trị bằng x hoặc khi dãy con chỉ còn 1 phần tử.
Ví dụ: Tìm số 7 trong dãy các số sau 2, 3, 7, 8, 9, 11, 12, 13, 15, 17, 19, 23, 34, 50.
Dãy đã cho gồm 14 số hạng, chia dãy thành 2 dãy con: 2, 3, 7, 8, 9, 11, 12 và 13, 15, 17, 19, 23, 34, 50.
Vì 7<12 nên tiếp theo chỉ cần tìm ở dãy đầu tiên. Tiếp tục chia đôi thành 2 dãy: 2, 3, 7, 8 và 9, 11, 12; vì 7<8
nên lại chỉ tìm ở dãy 2, 3, 7, 8. Lại chia đôi dãy thành 2 dãy con là 2, 3 và 7, 8 và thấy ngay 7 thuộc dãy con 7, 8 và quá
trình tìm kiếm kết thúc, vị trí của số 8 trong dãy là thứ 3.
Giải mã đối với thuật toán tìm kiếm nhị phân là:
Procedure Tim_kiem_nhi_phan_phan_tu_x
Input: x và dãy số a1 , a2 , ..., an đã xếp theo thứ tự tăng;
Output: Vị trí phần tử của dãy số có giá trị bằng x, hoặc là 0 nếu không tìm thấy trong dãy.
begin
i:=1;
j:=n;
while i<j do
begin  
1+n
m= ;
2
if a > am then i:=m+1 else j:=m
end;
if x = ai then vitri:=i else vitri:=0;
end;

Độ phức tạp của thuật toán tìm kiếm nhị phân được đánh giá như sau: Không giảm tổng quát có thể giả sử độ dài
của dãy a1 , a2 , ..., an là n = 2k với k là số nguyên dương (nếu n không phải là lũy thừa của 2, luôn tìm được số k sao cho
2k−1 < n < 2k+1 do đó có thể xem dãy đã cho là một phần của dãy có 2k phần tử). Như vậy phải thực hiện nhiều nhất k
lần chia đôi các dãy số (mỗi nửa dãy của lần chia đôi thứ nhất có 2k−1 phần tử, của lần chia đôi thứ 2 có 2k−2 phần tử,...
và của lần chia đôi thứ k là 2k−k = 20 = 1 phần tử). Nói cách khác là nhiều nhất có k vòng lặp while được thực hiện
trong thuật toán tìm kiếm nhị phân. Trong mỗi vòng lặp while phải thực hiện hai phép so sánh, vòng lặp cuối cùng khi chỉ
còn 1 phần tử phải thực hiện hai phép sánh, và vòng lặp cuối cùng khi chỉ còn 1 phần tử phải thực hiện 1 phép so sánh để
biết không còn 1 phần tử nào thêm nữa và 1 phép so sánh để biết x có phải là phần tử đó hay không. Từ đó thấy rằng thuật
toán phải thực hiện nhiều 2k + 2 = 2[log2 n] + 2 = O(logn) phép so sánh.
Vậy độ phức tạp của thuật toán tìm kiếm nhị phân là độ phức tạp logarit.

2.5 Thuật toán đệ quy


2.5.1 Công thức truy hồi
Đôi khi rất khó định nghĩa một đối tượng nào đó một cách tường minh, nhưng có thể định nghĩa đối tượng đó qua
chính nó với đầu vào nhỏ hơn. Cách định nghĩa như vậy gọi là cách định nghĩa bằng truy hồi hoặc định nghĩa bằng đệ quy
và nó cho một công thức gọi là công thức truy hồi.
Định nghĩa: Định nghĩa bằng truy hồi bao gồm các quy tắc để xác định các đối tượng, trong đó có một số quy tắc
dùng để xác định các đối tượng ban đầu gọi là các điều kiện ban đầu; còn các quy tắc khác dùng để xác định các đối tượng
tiếp theo gọi là công thức truy hồi.

7
Ví dụ: Dãy số an được định nghĩa bằng đệ quy như sau: a0 = 3; an = an−1 + 3. Trong đó a0 = 3 là điều kiện ban
đầu, còn an = an−1 + 3 là công thức đệ quy.

2.5.2 Thuật toán đệ quy


Nhiều khi việc giải bài toán với đầu vào xác định có thể đưa về việc giải bài toán với giá trị đầu vào nhỏ hơn. Chẳng
hạn: n! = n.(n − 1)! hay U CLN (a, b) = U CLN (amodb, b), a > b
Định nghĩa: Một thuật toán gọi là đệ quy nếu thuật toán đó giải bài toán bằng cách rút gọn liên tiếp bài toán ban đầu
tới bài toán cũng như vậy nhưng với dữ liệu đầu vào nhỏ hơn. Cơ sở của thuật toán là công thức truy hồi.
Ví dụ 1: Tính giá thừa của số tự nhiên n bằng đệ quy.
Function GT (n)
Input: Số tự nhiên n;
Output: Giá trị của n!
begin
if n = 0 then GT (0) := 1
else GT (n) := n ∗ GT (n − 1)
end
Ví dụ 2: Tính số hạng của dãy Fibonacci bằng đệ quy.
Function F ibo(n)
Input: Vị trí thứ n của dãy Fibonacci
Output: Giá trị của Fn của dãy Fibonacci
begin
if n = 0 then F ibo(0) := 0
else if n = 1 then F ibo(n) := 1
else F ibo(n) := F ibo(n − 1) + F ibo(n − 2);
end

You might also like