You are on page 1of 25

CHƢƠNG 4.

HÀM VÀ THUẬT TOÁN


4.1 Hàm
4.2 Thuật toán
4.3 Độ tăng của hàm
4.4 Độ phức tạp của thuật toán
1
4.1 HÀM
 Hàm là một khái niệm quan trọng trong Toán rời rạc. Hàm đƣợc
dùng để định nghĩa các cấu trúc rời rạc (nhƣ dãy, xâu… ),biểu
diễn thời gian chạy của máy tính khi nó giải một bài toán…
*Khái niệm
Cho hai tập hợp A, B. Một hàm f từ A đến B là phép gán tƣơng ứng
với mỗi phần tử của A với một và chỉ một phần tử của B.
 Nếu f là hàm từ A đến B thì ta viết f: A  B và viết f(a) = b nếu b
là phần tử của B đƣợc gán bởi hàm f cho phần tử a của A
2
 Nếu f là hàm từ A đến B :
A đƣợc gọi là miền xác định của f ; B là miền giá trị của f.
- Nếu f(a)=b thì b là ảnh của a và a là tạo ảnh của b
 Nếu f : A  B là một hàm thì ta cũng nói f là ánh xạ từ A đến B

*Ví dụ:
y

Không phải
3 hàm
Đều là
hàm
* Hàm tổng, hàm nhân, hàm ngược
 Hàm f1, f2 là A đến R. Khi đó f1+ f2 và f1.f2 cũng là các hàm từ
A đến R đƣợc định nghĩa nhƣ sau:
(f1+f2)(x)= f1(x) + f2(x)
f1f2(x)=f1(x).f2(x)
 Ví dụ: cho f1(x)=x2 và f2(x)=x+3 xác định f1(x) + f2(x)

f1 +f2 (x)= f1(x) + f2(x)=x2+ x-3


f1f2(x)= f1(x).f2(x)=x2(x -3)= x3 – 3x2
4
* Hàm đơn ánh, toàn ánh, song ánh
 Hàm f là đơn ánh nếu và chỉ nếu khi f(x)=f(y) kéo theo x=y với
mọi x trong miền xác định của hàm f
Hàm đơn ánh còn gọi là hàm một – một. (Hiểu rằng mỗi phần tử
phân biệt đều có một ảnh phân biệt hay với mỗi x  y thì f(x)  f(y))
 Hàm f là toàn ánh nếu và chỉ nếu đối với mọi phần tử b B đều tồn
tại một phần tử a  A để f(a)=b.
(Hiểu rằng mỗi phần tử của B đều có tạo ảnh.)
 Hàm f là song ánh nếu nó vừa đơn ánh, vừa toàn ánh.
5
4.2 THUẬT TOÁN
 Thuật toán là một dãy các quy tắc nhằm xác định một loạt các
thao tác có thứ tự trên các đối tƣợng, sao cho sau một số hữu hạn
bƣớc thực hiện các thao tác, ta đạt đƣợc mục tiêu cần làm.
*Đặc trưng của thuật toán
 Tính dừng: sau một số hữu hạn bƣớc, thuật toán phải dừng.
 Tính xác định: ở mỗi bƣớc, các thao tác phải rõ ràng.
 Tính hiệu quả: thuật toán hoạt động phải cho kết quả mong muốn.
 Tính phổ dụng: phải giải đƣợc một lớp các bài toán.
 Yếu tố vào, ra: có đối tƣợng đầu vào và có đối tƣợng đầu ra.
6
*Ngôn ngữ thuật toán
 Ngôn ngữ dùng để miêu tả thuật toán gọi là ngôn ngữ thuật toán.

 Thuật toán thƣờng đƣợc mô tả bằng dãy các lệnh. Bộ xử lý sẽ


thực hiện các lệnh theo thứ tự. Gặp lệnh dừng thì kết thúc.
 Ngôn ngữ thuật toán gồm:
- Ngôn ngữ liệt kê từng bƣớc: (thuật toán xác định hằng đúng, hằng
sai; thuật toán đƣa công thức về dạng chuẩn tắc hội, tuyển..)
- Sơ đồ khối : dựa trên một số khối hình học với quy ƣớc riêng
- Ngôn ngữ lập trình: Pascal, C++, Visual basic…
7
* Ngôn ngữ liệt kê từng bước
Ví dụ: Thuật toán giải phương trình bậc hai ax2+ bx +c =0 (a  0)
 Bƣớc 1: Xác định hệ số a, b, c
 Bƣớc 2: Kiểm tra xem a  0 hay không? Nếu a=0 thì quay lại bƣớc 1
 Bƣớc 3: Tính biểu thức = b2 - 4ac
 Bƣớc 4: Nếu  <0 thông báo “PT vô nghiệm” và chuyển đến bƣớc 8
−𝑏
 Bƣớc 5: Nếu  =0, có nghiệm x1,x2= và chuyển đến bƣớc 7
2𝑎
−𝑏± ∆
 Bƣớc 6: Nếu  > 0, có nghiệm x1,x2= và chuyển đến bƣớc 7
2𝑎
 Bƣớc 7: Thông báo nghiệm x1, x2 8

 Bƣớc 8: Kết thúc.


* Sơ đồ khối
Dựa trên một số khối điều khiển được quy ước như sau:
 Nút bắt đầu, kết thúc : hình Elip Bắt đầu
(Kết thúc)

 Nút thao tác: hình chữ nhật. Các lệnh đƣợc ghi trong đây.
Nút điều
Nút thao tác
kiện

 Nút điều kiện: hình thoi. Dùng để kiểm tra thông tin đúng, sai.

 Cung: là những đoạn thẳng có hƣớng, chỉ đƣờng đi của thuật toán.
9
Giải phương trình bậc hai
Bắt đầu

Nhập a, b, c

Đúng Sai
a=0 = b2 - 4ac

Đúng Sai Đúng


=0 <0
Sai
−𝑏
x1,x2= 2𝑎 x1,x2=
−𝑏± ∆ PT vô nghiệm
2𝑎

Thông báo nghiệm

Kết thúc
* Ngôn ngữ lập trình
Từ những bƣớc làm ngoài thực tế cần có những câu lệnh, cấu trúc
điều khiển.. của ngôn ngữ lập trình giúp cho máy tính hiểu và thực
hiện thuật toán.
* Giải phương trình bậc hai (dùng ngôn ngữ lập trình C)

Chƣơng trình có khởi đầu và kết thúc, các lệnh của thân chƣơng trình
nằm trong main() {}
Để viết một nội dung ra màn hình có lệnh printf();
Nhập dữ liệu vào từ bàn phím scan();
Có khối điều khiển if (bieuthuc) (khối lệnh) else (khoi lenh);
11
#include “stdio.h”
main()
{
float a, b, c, delta, x1,x2;
Printf(“\n Nhap a, b, c:” );
Scanf(“%f%f%f, &a&b&c);
Delta = b*b -4*a*c;
If (delta <0.0) printf(“\n PT vo Nghiem”);
Else if (delta==0.0) printf(“\n PT co Nghiem kep x1,2=%8.2f”, -b/(2*a));
Else
{
printf(“\n PT co hai Nghiem”);
printf(“\n x1=%8.2f” , (-b +sqrt(delta))/(2*a));
printf(“\n x2=%8.2f”,(-b –sqrt(delta))/(2*a));
} 12

}
4.3 ĐỘ TĂNG CỦA HÀM
 Hàm đặc trƣng và biểu diễn cho mối quan hệ giữa các đại lƣợng.
Khi đại lƣợng này thay đổi, kéo theo sự thay đổi của đại lƣợng liên
quan. Vấn đề cần thiết là ta phải hiểu đƣợc sự thay đổi đó nhƣ thế
nào? Nhanh hay chậm. Đó là độ tăng của hàm.
 Một trong những khái niệm thƣờng đƣợc dùng để phân tích độ tăng
của hàm là “O”.
*Định nghĩa O
 Cho f và g là hai hàm từ tập các số nguyên dƣơng (hoặc số thực) vào
tập các số thực. Ta nói f(x) là O(g(x)) nếu tồn tại hai hằng số C và k
sao cho |f(x)|  C|g(x)| với mọi x > k
13
 Nhận thấy cặp giá trị C và k không phải là duy nhất, đồng thời nếu
f(x) là O(g(x)) mà h(x) là hàm thoả mãn |g(x)| <|h(x)| với x >k thì ta
cũng có f(x) là O(h(x)).
*Định lý
 Cho f(x) =anxn + an-1xn-1 + ….+a1x +a0 ở đây an, an-1,..,a0 là dãy các
số thực. Khi đó f(x) là O(xn)
 Chứng minh định lý có thể dùng bất đẳng thức tam giác.
Thật vậy, với mọi x > 1 thì
|f(x)|=|anxn + an-1xn-1 + ….+a1x +a0| < |an|xn+|an-1|xn-1+ … + |a1|x +|a0|
|𝑎𝑛 1| |𝑎1| |𝑎0|

14

=xn(|a n|+ − + …+ − + ) n
x (|a n| + |an-1| +…. + |a1| +|a0|)
𝑥 𝑥𝑛 1 𝑥𝑛
*Độ tăng của tổ hợp hàm
 Cho f1(x) là O(g1(x)) và f2(x) là O(g2(x)). Khi đó f1(x)+f2(x) là
O(max{|g1(x)|,|g2(x)|})
Hệ quả : cho f1(x) và f2(x), cả hai đều là O(g(x)) thì (f1+f2)(x) là O(g(x)).
 Nếu f1(x) là O(g1(x)) và f2(x) là O(g2(x)) thì (f1.f2)(x) là O(g1(x).g2(x))
*Ví dụ 1:
Tính ƣớc lƣợng O của hàm giai thừa và hàm logarit của hàm giai thừa.
Vì mỗi số hạng trong n! đều không vƣợt quá n nên ta có :
n!=1.2.3...n  n.n….n=nn Chứng tỏ n! là O(nn). Lấy logarit hai vế thì:
logn! 
15

lognn =nlogn. Suy ra logn! là O(nlogn)


*Ví dụ 2:
 Cho đánh giá về O của hàm f(x)=3nlogn! + (n2+3)logn
Coi f(x)=f1(x) + f2(x), với f1(x)=3nlogn! và f2(x)=(n2+3)logn
 Với f1(x)=3nlogn! Thì f1(x)=g1(x).g2(x) mà g2(x)=logn! là O(nlogn)
còn g1(x)=3n là O(n) vậy f1(x) là O(n2logn))
 Với f2(x)=g3(x).g4(x) thì g3(x)=(n2+3) n2 + n2 =2n2 (khi n>2) nên
g3(x) là O(n2); hiển nhiên logn  logn vì thế f2(x) =(n2+3)logn là
O(g1(x).g2(x))=O(n2logn)
Theo hệ quả suy ra từ độ tăng của tổ hợp hàm thì f(x) là O(n2logn)
16
4.4 ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
 Khái niệm O đƣợc dùng để đánh giá số các công đoạn cần thiết để
giải một bài toán bằng một thủ tục hoặc một thuật toán xác định nào
đó. Các hàm thƣờng đƣợc dùng trong đánh giá này là : 1, logn, n,
nlogn, n2, 2n, và n!
 Chỉ đề cập đến độ phức tạp của thuật toán về mặt thời gian mà không
kể đến độ phức tạp về không gian.
 Các phép toán đƣợc dùng để đo độ phức tạp thời gian (của thuật toán)
là : phép so sánh số nguyên; phép cộng, trừ, nhân, chia số nguyên;
17

hoặc bất kỳ một phép tính sơ cấp nào đó xuất hiện trong thuật toán.
4.4 ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
*Minh họa cho độ tăng của hàm bằng vẽ đồ thị

Độ phức tạp Thuật ngữ thường dùng


O(1) Độ phức tạp hằng số
O(logn) Độ phức tạp logarit
O(n) Độ phức tạp tuyến tính
O(nlogn) Độ phức tạp nlogn
O(nb) Độ phức tạp đa thức
O(bn) (b >1) Độ phức tạp hàm mũ
O(n!) Độ phức tạp giai thừa 18
4.4 ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
*Máy tính cần bao lâu để giải một bài toán?

Kích thước Các phép tính bit được sử dụng


bài toán
n logn n nlogn n2 2n n!
10 3.10-9s 10-8 s 3.10-8s 10-7s 10-6s 3.10-6s
102 7.10-9 s 10-7 7.10-7 10-5s 4.1013 năm ---
103 1,0. 10-8 10-6 10-5 10-3s --- ---
104 1,3. 10-8 10-5 10-4 10-1s
105 1,7.10-8 10-4 2.10-3 10s
106 2.10-8 10-3 2.10-2 19 17 phút
*Ví dụ:
Mô tả thuật toán tìm phần tử lớn nhất trong một dãy hữu hạn các số
nguyên a1, a2,…, an và xác định độ phức tạp của thuật toán.

 Mô tả thuật toán:
 Bƣớc 1: Đặt giá trị Max cần tìm là phần tử đầu a1 của dãy.
 Bƣớc 2: So sánh số nguyên tiếp theo (ai) với giá trị Max hiện thời,
nếu nó lớn hơn giá trị Max thì gán luôn Max là số nguyên đó.
 Bƣớc 3: Lặp lại bƣớc 2 (nếu vẫn còn số nguyên của dãy chƣa xét)
 Bƣớc 4: Dừng khi không còn số nguyên nào của dãy. Khi đó giá trị
cần tìm là Max hiện thời. 20
#include “stdio.h”
void NhapMang(int a[], int n)
{
for(int i = 0;i < n; ++i)
{
printf("\nNhap phan tu a[%d] = ", i);
scanf("%d", &a[i]);
}
Max==a[0];
for(i=1; i<n;i++) if a[i]> Max Max==a[i];
printf(“gia tri lon nhat trong day la %d ”,Max);
} 21
 Đánh giá độ phức tạp:
 Chú ý đến đoạn chƣơng trình so sánh và gán giá trị cho Max;
 Với mỗi a[i] của dãy đều dùng hai phép so sánh, một là để xác định
chƣa đi đến phần tử cuối cùng của dãy, một để xác định nó có lớn
hơn Max hay không. Phép so sánh đƣợc tiến hành từ phần tử thứ
hai trở đi.  (n-1)*2 phép so sánh
 Cuối cùng cần một phép so sánh để thoát khỏi vòng lặp.  1 phép
so sánh
Tổng số lần so sánh là (n-1)*2+1=2*n-1. Vậy thuật toán có độ phức
tạp O(n)  độ phức tạp tuyến tính
22
BÀI TẬP
1. Dùng định nghĩa để chứng minh rằng
a) f(x)=x4+9x3+ 4x+7 là O(x4)
b) f(x)=2x+17 là O(3x)

2. Tìm số nguyên nhỏ nhất n sao cho hàm f(x) là O(xn)


a) f(x) =2x3+x2logx;
𝑥4+𝑥2+1
b) f(x)= 3
𝑥 +1

3. Có bao nhiêu phép cộng và phép nhân được dùng


trong thuật toán nhân ma trận?

23
BÀI TẬP
4. Ta định nghĩa: Cho g là hàm từ tập A đến tập B và f là hàm từ
tập B đến tập C. Hợp thành của các hàm f và g, ký hiệu là fog,
được xác định bởi : (fog)(a)=f(g(a))

*Cho g là hàm từ tập {a, b, c} đến chính nó : g(a)=b, g(b)=c,


g(c)=a. Cho f là hàm từ tập {a, b, c} đến tập {1, 2, 3} sao cho
f(a)=3, f(b)=2, f(c)=1.
a) Hãy xác định hàm hợp thành của f và g
b) Hàm hợp thành của g và f?

24
25

You might also like