- ðộ phức tạp thời gian của thuật toán, ñộ phức tạp này ñược thể hiện qua số lượng các câu lệnh về các phép gán, các phép tính số học, phép so sánh, … ñược sử dụng trong thuật toán kh[r]
(1)Trường ðại học Nông nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 0
BỘ GIÁO DỤC VÀ ðÀO TẠO
TRƯỜNG ðẠI HỌC NÔNG NGHIỆP HÀ NỘI
VŨ KIM THÀNH
TỐN RỜI RẠC
(Giáo trình dành cho sinh viên ngành công nghệ thông tin)
(2)
Trường ðại học Nơng nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 1 MỤC LỤC
Lời nói đầu
Chng 1 THUẬT TOÁN ðịnh nghĩa
2 Mơ tả thuật tốn lưu đồ
3 Mơ tả thuật tốn ngôn ngữ Pascal ðộ phức tạp thuật tốn
5 Thuật tốn tìm kiếm Thuật tốn đệ quy
7 Một số thuật toán số nguyên BÀI TẬP CHƯƠNG
7 14 18 19 23 28 Chng BÀI TOÁN ðẾM
1 Nguyên lý cộng nguyên lý nhân Chỉnh hợp Hoán vị Tổ hợp Nguyên lý bù trừ
4 Giải hệ thức truy hồi Bài toán liệt kê Bài toán tồn
BÀI TẬP CHƯƠNG
32 32 35 42 44 51 61 64 Chng CÁC KHÁI NIỆM CƠ BẢN VỀ ðỒ THỊ
1 Các ñịnh nghĩa ñồ thị biểu diễn hình học ñồ thị Biểu diễn ñồ thị ñại số
3 Sự ñẳng cấu ñồ thị Tính liên thơng đồ thị
5 Số ổn định trong, số ổn định ngồi nhân ñồ thị Sắc số ñồ thị
BÀI TẬP CHƯƠNG
69 69 79 82 84 88 91 93 Chng ðỒ THỊ EULER, ðỒ THỊ HAMILTON, ðỒ THỊ PHẲNG
1 ðồ thị Euler ðồ thị Hamilton ðồ thi phẳng
BÀI TẬP CHƯƠNG
98 98 103 108 113 Chng CÂY VÀ MỘT SỐ ỨNG DỤNG CỦA CÂY
1 Cây tính chất Cây nhị phân phép duyệt Một vài ứng dụng
(3)Trường ðại học Nông nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 2 Cây khung (cây bao trùm) ñồ thị
5 Hệ chu trình ñộc lập Cây khung nhỏ BÀI TẬP CHƯƠNG
131 134 136 142 Chng MỘT SỐ BÀI TOÁN TỐI ƯU TRÊN ðỒ THỊ
1 Bài tốn đường ngắn ñồ thị Tâm, Bán kính, ðường kính ñồ thị Mạng Luồng
4 Bài toán du lịch
BÀI TẬP CHƯƠNG
147 147 152 153 160 166 Chng ðẠI SỐ BOOLE
1 Hàm Boole Biểu thức Boole
3 ðịnh nghĩa ñại số Boole theo tiên ñề Biểu diễn hàm Boole
5 Các cổng logic
6 Tối thiểu hoá hàm Boole
BÀI TẬP CHƯƠNG
172 172 174 176 177 183 185 193 Ph chng ðẠI CƯƠNG VỀ TỐN LOGIC
1 Lơgic mệnh đề
2 Cơng thức đồng cơng thức đồng lơgic mệnh đề
3 ðiều kiện đồng lơgic mệnh ñề Lôgic vị từ
BÀI TẬP PHỤ CHƯƠNG
197 197 201 205 208 213 Một số tập làm máy tính
Một số thuật ngữ dùng giáo trình Tài liệu tham khảo
(4)Trường ðại học Nơng nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 3
LỜI NĨI ðẦU
Tốn Rời rạc (Discrete mathematics) mơn tốn học nghiên cứu đối tượng rời rạc Nó ứng dụng nhiều ngành khoa học khác nhau, ñặc biệt tin học q trình xử lý thơng tin máy tính thực chất q trình rời rạc
Phạm vi nghiên cứu Toán Rời rạc rộng, chia thành mơn học khác Theo quy định chương trình mơn học, giáo trình đề cập đến lĩnh vực: Thuật tốn tốn đếm; Lý thuyết đồ thị; ðại số Logic ñược chia thành chương:
- Chương ñề cập ñến vấn đề Thuật tốn ñộ phức tạp thời gian thuật toán
- Chương nói nguyên lý Bài tốn đếm.
- Các chương 3, 4, trình bày Lý thuyết ñồ thị ứng dụng. ðây phần chiếm tỷ trọng nhiều giáo trình Trong có chương khái niệm ñồ thị, ñồ thị ñặc biệt ñồ thị Euler, ñồ thị Hamilton, ñồ thị phẳng, Cây ứng dụng ñồ thi ñặc biệt Riêng chương dành cho vấn ñề trọng số tốn tối ưu đồ thị tốn tối ưu ñược giải cách ứng dụng lý thuyết ñồ thị
- Chương kiến thức ðại số Boole, công cụ hữu hiệu việc thiết kế mạch ñiện, ñiện tử
Cuối giáo trình phụ chương: Những khái niệm cơ bản về tốn Logic để người học tự nghiên cứu thêm Toán Logic
Trong chương chúng tơi cố gắng trình bày kiến thức chương thí dụ minh họa cụ thể Vì khn khổ số tiết học nên lược bỏ số chứng minh phức tạp Cuối chương có tập ñể người học ứng dụng, kiểm chứng lý thuyết ñã học, ñồng thời cung cấp số ñáp số tập ñã cho
Cũng cần nói thêm tốn Rời rạc khơng ứng dụng tin học mà cịn ứng dụng nhiều ngành khoa học khác Bởi giáo trình có ích cho cần quan tâm đến ứng dụng khác môn học
Tác giả xin chân thành cảm ơn bạn ựồng nghiệp ựã ựộng viên góp ý cho việc biên soạn giáo trình đặc biệt chúng tơi xin cảm ơn Nhà giáo ưu tú Nguyễn đình Hiền ựã hiệu ựắnh cho nhiều ý kiến ựóng góp bổ ắch thiết thực
Vì trình độ có hạn giáo trình ñược biên soạn lần ñầu nên không tránh khỏi thiếu sót Tác giả mong nhận ý kiến đóng góp đồng nghiệp bạn đọc khiếm khuyết sách
(5)Trường ðại học Nông nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 4
CHƯƠNG1
THUẬT TOÁN
1 ðịnh nghĩa
2 Mơ tả thuật tốn lưu đồ
3 Mơ tả thuật tốn ngơn ngữ Pascal
3.1 Câu lệnh Procedure (thủ tục) Function (hàm) 3.2 Câu lệnh gán
3.3 Khối câu lệnh 3.4 Câu lệnh diều kiện 3.5 Các câu lệnh lặp ðộ phức tạp thuật toán
4.1 Khái niệm ñộ tăng hàm 4.2 ðộ tăng tổ hợp hàm 4.3 ðộ phức tạp thuật tốn Thuật tốn tìm kiếm
5.1 Thuật tốn tìm kiếm tuyến tính (cịn gọi thuật tốn tìm kiếm tuần tự) 5.2 Thuật tốn tìm kiếm nhị phân
6 Thuật tốn đệ quy
6.1 Cơng thức truy hồi 6.2 Thuật tốn đệ quy 6.3 ðệ quy lặp
7 Một số thuật toán số nguyên 7.1 Biểu diễn số nguyên
7.2 Cộng nhân hệ nhị phân
1 ðịnh nghĩa
Thuật toán (algorithm) dãy quy tắc nhằm xác ñịnh dãy thao tác ñối tượng cho sau số hữu hạn bước thực ñạt ñược mục tiêu ñặt
Từ định nghĩa thuật tốn cho thấy đặc trưng (tính chất) thuật tốn là:
a Yếu tố vào, ra:
• ðầu vào (Input): Mỗi thuật tốn có giá trị giá trị ñầu vào
từ tập xác định rõ
• ðầu (Output): Từ giá trị đầu vào, thuật tốn cho giá trị cần
(6)Trường ðại học Nơng nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 5 b Tính dừng:
Sau số hữu hạn bước thao tác thuật toán phải kết thúc cho kết c Tính xác định:
Các thao tác phải rõ ràng, cho kết dù ñược xử lý xử lý khác (hai xử lý điều kiện khơng thể cho hai kết khác nhau)
d Tính hiệu quả
Sau đưa liệu vào cho thuật tốn hoạt ñộng phải ñưa kết ý muốn e Tính tổng qt
Thuật tốn phải áp dụng cho tốn dạng khơng phải cho tập ñặc biệt giá trị ñầu vào
Có nhiều cách mơ tả thuật tốn như: Dùng ngơn ngữ tự nhiên; dùng lưu đồ (sơ đồ khối); dùng ngơn ngữ lập trình (trong giáo trình dùng loại ngơn ngữ mơ tả gần ngơn ngữ lập trình Pascal gọi Pascal); …
2 Mơ tả thuật tốn bằng lưu đồ
Sau có thuật tốn để giải tốn, trước chuyển sang ngơn ngữ lập trình, người ta thường phải thể thuật toán dạng sơ ñồ Sơ ñồ ñó gọi lưu ñồ thuật tốn Các ký hiệu quy ước dùng lưu đồ ñược trình bày bảng
Bảng Các ký hiệu quy ước dung lưu đồ thuật tốn Tên ký hiệu Ký hiệu Vai trò ký hiệu Khối mở ñầu
kết thúc
Dùng để mở đầu kết thúc thuật tốn
Khối vào ðưa liệu vào in kết Khối tính tốn Biểu diễn cơng thức tính tốn
và thay đổi giá trị đối tượng Khối ñiều kiện Kiểm tra ñiều kiện phân nhánh Chương trình Gọi chương trình
Hướng thuật tốn
Hướng chuyển thơng tin, liên hệ khối
Thí dụ: Thuật tốn giải phương trình bậc hai ax2 + bx + c = gồm bước sau: 1) Xác ñịnh hệ số a, b, c (thông tin ñầu vào)
2) Kiểm tra hệ số a:
- Nếu a = 0: Phương trình cho phương trình bậc nhất, nghiệm là:
(7)Trường ðại học Nơng nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 6 3) Tính biệt thức ∆ = b2 – 4ac
4) Kiểm tra dấu biệt thức ∆
- Nếu ∆ ≥ 0: Phương trình có nghiệm thực
- Nếu ∆ < 0: Phương trình có nghiệm phức
5) In kết
Lưu đồ thuật tốn trình bày hình
3 Mơ tả thuật tốn bằng ngơn ngữ phỏng Pascal
ðể giải toán máy tính điện tử phải viết chương trình theo ngơn ngữ lập trình (Pascal, C, Basic, ) Mỗi ngơn ngữ lập trình có quy tắc cấu trúc riêng ðể thay việc mơ tả thuật tốn lời, mơ tả thuật tốn cấu trúc lệnh tương tự ngơn ngữ lập trình Pascal gọi ngôn ngữ Pascal
Các câu lệnh dùng để mơ tả thuật tốn gồm có: Procedure Function; câu lệnh gán; câu lệnh ñiều kiện; vịng lặp Ngồi cần giải thích câu lệnh lời, để lời giải thích dấu (* *) {…}
Nghĩa ngơn ngữ Pascal hồn tồn tương tự ngơn ngữ lập trình Pascal, khơng có phần khai báo Tuy nhiên, phải nêu rõ ñầu vào (Input) đầu (output) thuật tốn
Bắt ñầu Nhập a, b, c
Sai a = ∆ = b2 = 4ac
b c x=−
Sai ∆≥
Phần thực = a
b
−
2a b x1
∆
+ − =
Phần ảo =
2a ∆ −
2a b x2
∆ + − =
Thông báo kết
Kết thúc
(8)Trường ðại học Nơng nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 7 3.1 Câu lệnh Procedure (thủ tục) Function (hàm)
ðứng sau câu lệnh tên thủ tục hoăc tên hàm Các bước thực thuật tốn mơ tả thủ tục (hàm) bắt đầu từ khóa begin kết thúc từ khóa end
Thí dụ
Function Max(a, b, c) (* Hàm tìm số lớn số a, b, c *) Begin
(* thân hàm*) End;
Thí dụ
Procedure Giai_phuong_trình_bac_hai (* Thủ tục giải phương trình bậc hai *) Begin
(* thân thủ tục *) End;
Chú ý rằng, mơ tả thuật tốn function, trước kết thúc (end) thuật toán phải trả (ghi nhận) giá trị function
3.2 Câu lệnh gán
Dùng ñể gán giá trị cho biến Cách viết: Tên biến := giá trị gán Thí dụ: x := a; (*biến x gán giá trị a*) max := b; (*biến max ñược gán giá trị b*) 3.3 Khối câu lệnh
ðược mở đầu từ khóa begin kết thúc end sau: begin
Câu lệnh 1; Câu lệnh 2; Câu lệnh n;
end;
Các lệnh ñược thực từ câu lệnh thứ ñến câu lệnh cuối 3.4 Câu lệnh ñiều kiện
Có hai dạng: dạng đơn giản dạng lựa chọn a Dạng ñơn giản: Cách viết:
if <ñiều kiện> then câu lệnh khối câu lệnh;
(9)Trường ðại học Nơng nghiệp Hà Nội – Giáo trình Giáo trình Toán Rời rạc…….……… 8 b Dạng lựa chọn: Cách viết:
if <ñiều kiện> then câu lệnh khối câu lệnh else câu lệnh khối câu lệnh 2; Khi thực hiện, ñiều kiện ñược kiểm tra, điều kiện thỏa mãn câu lệnh (khối câu lệnh) ñược thực hiện, ñiều kiện khơng thỏa mãn câu lệnh (khối câu lệnh) thực
Thí dụ 1. Thuật tốn tìm số lớn số thực a, b, c - ðầu tiên cho max = a;
- So sánh max với b, b > max max = b; - So sánh max với c, c > max max = c Function max(a,b,c)
Input: số thực a,b,c;
Output: Số lớn số ñã nhập; Begin
x := a;
if b > x then x:= b; if c > x then x:= c; max := x;
End;
Thí dụ 2. Thuật tốn giải phương trình bậc hai ax2 + bx + c = Procedure Giai_phuong_trinh_bac2;
Input: Các hệ số a, b, c;
Output: Nghiệm phương trình; begin
if a = then x := -c/b; if a ≠ then
begin
∆ := b2 – 4ac;
if ∆≥ then
begin
x1 = (– b – ∆)/2a ;
x2 = (– b + ∆)/2a;
end else begin
Phần thực := -b/2a; Phần ảo := ( −∆)/2a; end;
(10)Trường ðại học Nông nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 9 3.5 Các câu lệnh lặp
Có hai loại: Loại có bước lặp xác định loại có bước lặp khơng xác định a. Loại có bước lặp xác ñịnh: Cách viết sau:
for biến ñiều khiển := giá trị ñầu to giá trị cuối câu lệnh khối câu lệnh; Khi thực hiện, biến ñiều khiển ñược kiểm tra, biến ñiều khiển nhỏ giá trị cuối câu lệnh (khối câu lệnh) thực Tiếp biến ñiều khiển tăng thêm ñơn vị trình lặp lại biến điều khiển lớn giá trị cuối vịng lặp dừng cho kết Như hết vòng lặp for số bước lặp giá trị cuối (của biến ñiều khiển) trừ giá trị đầu cộng
Thí dụ: Tìm giá trị lớn dãy số a1, a2, …,an
Thuật toán: ðầu tiên cho giá trị lớn (max) a1, sau so sánh max
với số (i = 2, 3, …, n), max < max ai, max > max khơng đổi
Function max_day_so;
Input: Dãy số a1, a2, … ,an;
Output: Giá trị lớn (max) dãy số ñã nhập; begin
max := a1 ;
for i:= to n
if > max then max := ;
max_day_so := max; end;
Chú thích: Vịng lặp for cịn cách viết lùi biến ñiều khiển sau:
for biến ñiều khiển := giá trị cuối downto giá trị ñầu câu lệnh khối câu lệnh; Việc thực câu lệnh tương tự viết biến ñiều khiển tăng dần b Loại có bước lặp khơng xác ñịnh: Có hai cách viết
Cách thứ nhất: while ñiều kiện do câu lệnh khối câu lệnh;
Khi thực hiện, ñiều kiện ñược kiểm tra, điều kiện thoả mãn câu lệnh (khối câu lệnh) thực Nếu điều kiện khơng thoả mãn vịng lặp dừng cho kết
Thí dụ: Kiểm tra xem số ngun dương m cho có phải số ngun tố khơng? Thuật toán sau: Số m số nguyên tố khơng chia hết cho số ngun dương khác nhỏ m
Thật vậy, m hợp số (không phải số nguyên tố), nghĩa tồn số nguyên dương a, b cho:
m = a.b ⇒ a ≤ m b ≤ m
(11)Trường ðại học Nông nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 10 Procedure nguyento(m);
Input: Số nguyên dương m;
Output: True, m số nguyên tố; False, m số nguyên tố; begin
i := 2;
while i ≤ m
begin
if m mod i = then nguyento := false else nguyento := true;
i := i+1; end; end;
Cách thứ hai: repeat câu lệnh khối câu lệnh until ñiều kiện;
Khi thực hiện, câu lệnh (khối câu lệnh) thực hiện, sau điều kiện kiểm tra, điều kiện sai vịng lặp thực hiện, điều kiện vịng lặp dừng cho kết
Thí dụ: Thuật tốn Ơ-clit tìm ước số chung lớn hai số nguyên dương a, b sau: Giả sử a > b a chia cho b ñược thương q số dư r, a, b, q, r số nguyên dương:
a = bq + r suy ra: ƯCLN(a, b) = ƯCLN(b, r)
và số dư cuối khác không ước số chung lớn a b
Thật vậy: Giả sử d ước số chung hai số ngun dương a b, đó: r = a – bq chia hết cho d Vậy d ước chung b r
Ngược lại, d ước số chung b r, bq + r = a chia hết cho d Vậy d ước số chung a b
Chẳng hạn, muốn tìm ước số chung lớn 111 201 ta làm sau: 201 = 111 + 90
111 = 90 + 21 90 = 21 +
21 = + =
Vậy ƯCLN(111, 201) = (3 số dư cuối khác 0) Function UCLN(a, b)
Input: a, b số nguyên dương; Output: UCLN(a, b);
(12)Trường ðại học Nơng nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 11 x := a;
y : = b; repeat
begin
r := x mod y; (* r phần dư chia x cho y *) x : = y; y := r ;
if y ≠ then uc := y;
end;
until y = 0; UCLN := uc; end ;
Chú ý: Khi giải toán phức tạp thường phải phân chia tốn thành toán nhỏ gọi toán Khi phải xây dựng thủ tục hàm để giải tốn đó, sau tập hợp tốn để giải tốn ban ñầu ñã ñặt Thuật ngữ tin học gọi chương trình giải tốn chương trình
Thí dụ: Tìm số ngun tố nhỏ lớn số nguyên dương m ñã cho Procedure So_nguyen_to_lon_hon(m);
Input: Số nguyên dương m;
Output: n số nguyên tố nhỏ lớn m; begin
n := m + 1;
while nguyento(n) = false n := n + 1; end;
4 ðộ phức tạp của thuật tốn
Có hai lý làm cho thuật tốn ựúng khơng thực ựược máy tắnh máy tắnh không ựủ nhớ ựể thực thời gian tắnh toán dài Tương ứng với hai lý người ta ựưa hai khái niệm:
- ðộ phức tạp khơng gian thuật tốn, độ phức tạp gắn liền với cấu trúc liệu sử dụng Vấn đề khơng thuộc phạm vi môn học
- ðộ phức tạp thời gian thuật tốn, độ phức tạp thể qua số lượng câu lệnh phép gán, phép tính số học, phép so sánh, … sử dụng thuật tốn giá trị đầu vào có kích thước cho
4.1 Khái niệm ñộ tăng hàm
Trước hết xét thí dụ: Giả sử thời gian tính tốn thuật tốn phụ thuộc vào kích thước n đầu vào theo cơng thức:
(13)Trường ðại học Nơng nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 12 Bảng sau cho thấy n lớn, t(n) xấp xỉ số hạng 60n2 :
n t(n) = 60n2 + 9n + 60n2 10
100 000 10 000
9099 600 909 60 009 009 000 090 009
6000 600 000 60 000 000 000 000 000
ðịnh nghĩa: Cho f(x) g(x) hai hàm từ tập số nguyên tập số thực vào tập số thực Người ta nói f(x) O(g(x)) hay f(x) có quan hệ big-O với g(x), ký hiệu f(x) = O(g(x)), tồn hai số C k cho:
| f(x) | ≤ C | g(x) |, ∀x ≥ k
Thí dụ 1. t(n) = 60n2 + 9n + = O(n2)
Thật vậy: ∀n ≥ 1, ta có: | 60n2 + 9n +9| = 60n2 + 9n +9
=
+ + 2
n n 60 n
≤ n2 (60 + + 9) = 78n2 Vậy C = 78; k =
Tương tự ta chứng minh:
Pn(x) = a0xn + a1xn-1 + + an = O(xn) , x ∈ R
Thí dụ 2. f(n) = + + + + n < n + n + n + + n = n.n = n2 Vậy f(n) = O(n2)
Thí dụ 3. Ta có: n! < nn , suy ra: n! = O(nn); (C = k = 1) Thí dụ 4. ∀n: n! < nn , lg(n!) < n lgn ,
suy lg(n!) = O(nlgn); (C = k = 1)
Thí dụ 5. Ta có: lgn < n , suy lgn = O(n) ; (C = k = 1)
Có thể hiểu đơn giản quan hệ f(x) = O(g(x)) f(x) g(x) "cùng cấp", nhiên g(x) hàm ñơn giản đại diện cho f(x) độ lớn tốc ñộ biến thiên 4.2 ðộ tăng tổ hợp hàm
ðịnh lý: Nếu f1(x) = O(g1(x)) f2(x) = O(g2(x))
Thì: 1) (f1 + f2)(x) = O(max{g1(x), g2(x)})
2) (f1.f2)(x) = O(g1(x).g2(x))
Chứng minh: Theo giả thiết, ta có: | f1(x)| ≤ C1 | g1(x)) | , ∀x > k1
| f2(x)| ≤ C2 | g2(x)) | , ∀x > k2
Chọn k = max(k1; k2) hai bất đẳng thức thoả mãn Do đó:
1) |(f1 + f2)(x)| = |f1(x) + f2(x)| ≤ |f1(x)| + |f2(x)| ≤
≤ C1|g1(x)| + C2|g2(x)| ≤ (C1 + C2)g(x)
(14)Trường ðại học Nông nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 13 2) |(f1.f2)(x)| = |f1(x)|.|f2(x)| ≤ C1C2 |g1(x)|.|g2(x)| = C1C2|g1(x)g2(x)|
Hệ quả: Nếu f1(x) = O(g(x)), f2(x) = O(g(x)) (f1+f2)(x) = O(g(x))
Thí dụ. Cho đánh giá O hàm:
1/ f(n) = 2nlg(n!) + (n3+ 3)lgn , n ∈ N
2/ f(x) = (x + 1)lg(x2 + 1) + 3x2 , x ∈ R
Giải: 1) Ta có: lg(n!) = O(nlgn) ⇒ 2nlg(n!) = O(n2lgn) (n3 + 3)lgn = O(n3lgn) Vậy f(n) = O(n3lgn)
2) Ta có: lg(x2 + 1) ≤ lg2x2 = lg2 + 2lgx ≤ 3lgx , ∀x >
⇒ lg(x2 + 1) = O(lgx) ⇒ (x + 1)lg(x2 + 1) = O(xlgx)
Mặt khác: 3x2 = O(x2) max{xlgx; x2} = x2 Vậy f(x) = O(x2)
4.3 ðộ phức tạp thuật toán
Như nói phần đầu mục 4, ñề cập ñến ñộ phức tạp thời gian thuật toán ðộ phức tạp thời gian thuật tốn đánh giá qua số lượng
các phép tốn mà thuật tốn sử dụng Vì phải đếm phép tốn có thuật tốn Các phép tốn phải đếm là:
- Các phép so sánh số nguyên số thực; - Các phép tính số học: cộng, trừ, nhân, chia; - Các phép gán;
- Và phép tính sơ cấp khác xuất q trình tính tốn Giả sử số phép toán thuật toán f(n), n kích thước đầu vào, ñó người ta thường quy ñộ phức tạp thời gian thuật tốn mức:
• ðộ phức tạp O(1), gọi ñộ phức tạp số, f(n) = O(1)
• ðộ phức tạp O(logan), gọi ñộ phức tạp logarit, f(n) = O(logan) (ðiều kiện a
> 1)
• ðộ phức tạp O(n), gọi độ phức tạp tuyến tính, f(n) = O(n)
• ðộ phức tạp O(nlogan), gọi ñộ phức tạp nlogarit f(n) = O(logan) (ðiều kiện
a > 1)
• ðộ phức tạp O(nk), gọi ñộ phức tạp ña thức, f(n) = O(nk)
• ðộ phức tạp O(an), gọi ñộ phức tạp mũ, f(n) = O(an) (ðiều kiện a > 1) • ðộ phức tạp O(n!), gọi ñộ phức tạp giai thừa, f(n) = O(n!)
Thí dụ 1. Tìm độ phức tạp thuật tốn để giải tốn: Tìm số lớn dãy n số nguyên a1, a2, …, an ñã cho:
Procedure max(a1, a2, …, an);
Input: Dãy số a1, a2, , an;
Output: Số lớn (max) dãy số ñã cho; begin
max := a1;
(15)Trường ðại học Nông nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 14 if > max then max := ai;
end;
Mỗi bước vòng lặp for phải thực nhiều phép toán: phép gán biến ñiều khiển i, phép so sánh với max phép gán vào max; vịng lặp có (n – 1)
bước (i = 2, 3, …, n) nhiều có thảy 3(n - 1) phép tốn phải thực Ngồi thuật tốn cịn phải thực phép gán max := a1
Vậy số phép toán nhiều mà thuật toán phải thực là: 3(n – 1) + = 3n – = O(n)
ðộ phức tạp thời gian thuật toán độ phức tạp tuyến tính Thí dụ 2. ðộ phức tạp thuật toán nhân ma trận
Procedure nhân_matran;
Input: ma trận A = (aij)m x p B = (bij)p x n;
Output: ma trận tích AB = (cij)m x n ;
Begin
for i:=1 to m for j:=1 to n begin
cij := 0;
for k:=1 to p cij := cij + aikbkj ;
end; End
Số phép cộng số phép nhân thuật toán là: Với phần tử cij phải thực
hiện p phép nhân p phép cộng Có tất m.n phần tử cij, phải thực 2mnp phép
cộng phép nhân
ðể xác ñịnh ñộ phức tạp thuật toán, ta giả sử A, B hai ma trận vuông cấp n, nghĩa m = n = p phải cần 2n3 phép cộng phép nhân Vậy ñộ phức tạp thuật tốn O(n3) – độ phức tạp đa thức
Một ñiều thú vị là, nhân từ ma trận trở lên số phép tính cộng nhân phụ thuộc vào thứ tự nhân ma trận Chẳng hạn A, B, C ma trận có kích thước tương ứng 30×20, 20×40, 40×10 Khi đó:
Nếu thực theo thứ tự ABC =A(BC) tích BC ma trận kích thước 20×10
cần thực 20.40.10 = 8000 phép tính cộng nhân Ma trận A(BC) có kích thước 30×10 cần thực 30.20.10 = 6000 phép cộng nhân Từ suy cần thực
8000+6000 = 14000 phép tính cộng nhân để hồn thành tích ABC
Tương tự, thực theo thứ tự ABC = (AB)C cần thực 30.20.40 phép tính cộng nhân để thực tích AB 30.40.10 phép cộng nhân để thực hiên tích (AB)C Do số phép tính cộng nhân phải thực để hồn thành tích ABC 24000+12000 = 36000 phép tính
(16)Trường ðại học Nơng nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 15
5 Thuật tốn tìm kiếm
Bài tốn tìm kiếm phát biểu sau: Tìm dãy số a1, a2, …, an phần tử
có giá trị số a cho trước ghi lại vị trí phần tử tìm
Bài tốn có nhiều ứng dụng thực tế Chẳng hạn việc tìm kiếm từ từ điển, việc kiểm tra lỗi tả đoạn văn bản, …
Có hai thuật tốn để giải tốn này: Thuật tốn tìm kiếm tuyến tính thuật tốn tìm kiếm nhị phân Chúng ta xét thuật toán
5.1 Thuật tốn tìm kiếm tuyến tính (cịn gọi thuật tốn tìm kiếm tuần tự) ðem so sánh a với (i = 1, 2, …, n) gặp giá trị = a ghi lại vị trí
của ai, không gặp giá trị = a (ai≠ a ∀i) dãy khơng có số a
Procedure Tim_tuyen_tinh_phan_tu_bang_a; Input: a dãy số a1, a2, , an;
Output: Vị trí phần tử dãy có giá trị a, số khơng tìm thấy a dãy;
begin i := 1;
while (i ≤ n and ai≠ a) i := i + 1;
if i ≤ n then vitri := i else vitri := 0;
end;
Như a tìm thấy vị trí thứ i dãy (ai = a) câu lệnh i := i +
vịng lặp while thực i lần (i = 1, 2, …, n) Nếu a khơng tìm thấy, câu lệnh phải thực n lần Vậy số phép tốn trung bình mà thuật tốn phải thực là:
O(n)
1 n 2n
1) n(n n
n
1
= + = + = + + +
Vậy, độ phức tạp thuật tốn tìm kiếm tuyến tính độ phức tạp tuyến tính 5.2 Thuật tốn tìm kiếm nhị phân
Giả thiết phần tử dãy ñược xếp theo thứ tự tăng dần Khi so sánh a với số dãy, a < am với = +
2 n
m (cần nhắc lại phần nguyên x: [x] số nguyên nhỏ có x) tìm a dãy a1, …,am , a > am tìm a dãy am+1, …, an ðối với dãy (một nửa dãy ñã cho) ñược làm tương tựñể phải tìm phần tử có giá trị a nửa dãy Q trình tìm kiếm kết thúc tìm thấy vị trí phần tử có giá trị a dãy phần tử
Chẳng hạn việc tìm số dãy số 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22
ñược tiến hành sau:
Dãy ñã cho gồm 14 số hạng, chia dãy thành dãy con:
(17)Trường ðại học Nơng nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 16 Vì < 13 nên cần tìm dãy Tiếp tục chia đơi thành dãy: 5, 6, 8, 11, 12, 13; < nên lại phải tìm dãy 5, 6, 8, Lại chia ñôi dãy thành dãy 5, 8, thấy thuộc dãy 8, q trình tìm kiếm kết thúc, vị trí số dãy ñã cho thứ ba
Procedure Tim_nhi_phan_phan_tu_bang_a;
Input: a dãy số a1, a2, , an ñã xếp theo thứ tự tăng;
Output: Vị trí phần tử dãy có giá trị a, số khơng tìm thấy dãy;
Begin
i := 1; (* i ñiểm mút trái khoảng tìm kiếm*) j := n; (* j ñiểm mút phải khoảng tìm kiếm*) while i < j
begin
= +
2 j :
m ;
if a > am then i := m+1 else j := m;
end;
if a = then vitri := i else vitri := 0; end;
ðộ phức tạp thuật tốn tìm kiếm nhị phân đánh sau: Khơng giảm
tổng qt giả sử ñộ dài dãy a1, a2, …, an n = 2k với k số nguyên dương (Nếu n lũy thừa 2, ln tìm số k cho 2k – < n < 2k
xem dãy cho phần dãy có 2k phần tử) Như phải thực nhiều k lần chia đơi dãy số (mỗi nửa dãy lần chia đơi thứ có 2k – phần tử, lần chia
đơi thứ hai có 2k – phần tử, …, lần chia đơi thứ k 2k – k = 20 = phần tử) Nói
cách khác nhiều có k vịng lặp while thực thuật tốn tìm kiếm nhị
phân Trong vịng lặp while phải thực hai phép so sánh, vòng lặp cuối phần tử phải thực phép so sánh để biết khơng cịn phần tử thêm phép so sánh ñể biết a có phải phần tử ñó hay khơng Từ thấy thuật tốn
phải thực nhiều 2k + = 2[log2n] + = O(logn) phép so sánh Vậy, ñộ phức tạp thuật tốn tìm kiếm nhị phân độ phức tạp logarit
6 Thuật tốn đệ quy
6.1 Công thức truy hồi
(18)Trường ðại học Nông nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 17 ðịnh nghĩa: ðịnh nghĩa truy hồi bao gồm quy tắc ñể xác định đối tượng, có số quy tắc dùng ñể xác ñịnh ñối tượng ban ñầu gọi ñiều kiện ban ñầu; quy tắc khác dùng ñể xác ñịnh ñối tượng gọi cơng thức truy hồi
Thí dụ 1. Dãy số an ñược ñịnh nghĩa ñệ quy sau:
a0 = 3; an = an – +
Trong a0 = điều kiện ban đầu, cịn an = an – + công thức truy hồi
Thí dụ 2. ðịnh nghĩa đệ quy giai thừa số tự nhiên n là: GT(0) = 1; GT(n) = n.GT(n – 1)
Vì GT(n) = n! = n(n-1)(n-2)…1 = n.GT(n-1) Trong GT(0) = ñiều kiện ban ñầu, GT(n) = n.GT(n – 1) cơng thức truy hồi
Thí dụ 3. Dãy số F0, F1, F2, …, Fn ñược ñịnh nghĩa:
F0 = 0; F1 = 1; Fn = Fn – + Fn –
chắnh ựịnh nghĩa ựệ quy dãy số có tên dãy Fibonacci Trong ựó F0 = 0, F1 = ựiều kiện ban ựầu, Fn = Fn Ờ + Fn Ờ công thức ựệ quy
Dễ thấy số số hạng ñầu tiên dãy là: 0; 1; 1; 2; 3; 5; 8; 13; 21; … 6.2 Thuật tốn đệ quy
Nhiều việc giải tốn với đầu vào xác định đưa việc giải tốn với giá trị đầu vào nhỏ Chẳng hạn:
n! = n (n-1)! hay UCLN(a, b) = UCLN(a mod b, b) , a > b
ðịnh nghĩa: Một thuật toán gọi đệ quy thuật tốn giải tốn cách rút gọn liên tiếp tốn ban đầu tới tốn với liệu đầu vào nhỏ
Dễ thấy sở thuật tốn cơng thức truy hồi Thí dụ 1. Tính giai thừa số tự nhiên n ñệ quy Function GT(n);
Input: Số tự nhiên n; Output: Giá trị n!; Begin
if n = then GT(0) :=
else GT(n) := n*GT(n – 1); End;
Thí dụ 2. Tính số hạng dãy Fibonacci đệ quy Function Fibonacci(n);
Input: Vị trí thứ n dãy Fibonacci; Output: Giá trị Fn dãy Fibonaci;
(19)Trường ðại học Nông nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 18 if n = then Fibonacci(0) :=
else if n = then Fibonacci(1) :=
else Fibonacci(n) := Fibonacci(n-1) + Fibonacci(n-2); End;
Thí dụ 3. Thuật tốn đệ quy tìm UCLN(a, b) Function UCLN(a, b);
Input: Hai số nguyên dương a b; Output: Ước số chung lớn a b; Begin
if b = then UCLN(a, b) := a
else if a > b then UCLN(a, b) := UCLN(a mod b, b)
else UCLN(a, b) := UCLN(b mod a, a); End;
Bây thử tìm độ phức tạp thời gian vài thuật toán viết đệ quy Chẳng hạn xét thuật tốn đệ quy tính số hạng dãy Fibonacci, để tính Fn ta biểu
diễn Fn = Fn – + Fn – , sau thay hai số tổng hai số Fibonacci bậc
thấp Q trình tiếp tục F0 F1 xuất thay
giá trị chúng ñịnh nghĩa
Mỗi bước ñệ quy F0 F1 xuất hiện, số Fibonacci tính hai lần
Chẳng hạn giản đồ hình cho ta hình dung cách tính F5 theo thuật tốn đệ quy Từ
đó thấy để tính Fn cần thực Fn + – phép cộng
ðộ phức tạp thuật tốn đệ quy tìm ước số chung lớn hai số nguyên dương a, b (thí dụ 3): UCLN(a,b) = UCLN(a mod b,b), a ≥ b (a mod b phần dư chia a cho b) ñược ñánh giá cách ứng dụng dãy Fibonacci
Trước hết quy nạp toán học chứng minh số hạng tổng quát dãy Fibonacci thỏa mãn:
F5
F4 F3
F3 F2 F2 F1
F2 F1 F1 F0 F1 F0
F1 F0
(20)Trường ðại học Nông nghiệp Hà Nội – Giáo trình Giáo trình Tốn Rời rạc…….……… 19 Fn > αn – 2, ∀n ≥ 3,
2 1+ =
α (1) Thật vậy:
Ta có: α < = F3, nghĩa (1) với n =
Giả sử Fn > αn – ñúng với n, xét với n+1 Dễ thấy α nghiệm phương trình
x2 – x – = nên suy α2 = α + Từđó:
αn – = α2αn – = (α + 1)αn – = αn – + αn –
Theo giả thiết quy nạp, n ≥ 4, ta có Fn – > αn – Fn > αn – Thay vào ñịnh
nghĩa dãy Fibonacci:
Fn + = Fn + Fn – > αn – + αn – = αn –
Vậy Fn > αn – , ∀n ≥
Cơng thức (1) chứng minh
Trở lại thuật tốn đệ quy tìm ước số chung lớn hai số nguyên dương a, b (a
≥ b) ðộ phức tạp thuật tốn đánh giá qua số lượng phép chia dùng thuật toán
ðặt r0 = a, r1 = b, ta có: r0 = r1q1 + r2; ≤ r2 < r1,
r1 = r2q2 + r3; ≤ r3 < r2,
rn – = rn – qn – + rn ; ≤ rn < rn – 1,
rn – = rn qn ;
Như phải dùng n phép chia để tìm rn = UCLN(a,b) Các thương q1, q2, …, qn – ln
lớn 1, cịn qn≥ Từđó suy ra:
rn ≥ = F2,
rn – ≥ 2rn = 2F2 = F3,
rn – ≥ rn – + rn ≥ F3 + F2 = F4,
r2 ≥ r3 + r4 ≥ Fn – + Fn – = Fn,
b = r1≥ r2 + r3≥ Fn + Fn – = Fn +
trong Fn số hạng thứ n dãy Fibonacci
Vậy n số phép chia thuật tốn Ơ-clit tìm ước số chung lớn hai số nguyên dương a, b b ≥ Fn + 1, Fn số Fibonacci thứ n
Do Fn + > αn – với n >
2 1+ =
α nên b > αn – Từđó: lgb > (n – 1) lgα >
5 n−
( lgα ≈ 0,208 >
5