You are on page 1of 79

TRƯỜNG ĐẠI HỌC NGÂN HÀNG TPHCM

KHOA HỆ THỐNG THÔNG TIN QUẢN LÝ

Chương 1
Tổng quan
GIẢI THUẬT ỨNG DỤNG
1 TRONG KINH DOANH
Giải thuật ứng dụng trong kinh doanh

Nội dung

Vai trò của tổ chức dữ liệu


Mối quan hệ giữa cấu trúc dữ liệu và giải thuật
Các kiểu dữ liệu cơ bản và điểm yếu
Trừu tượng hóa dữ liệu và cách biểu diễn dữ liệu
trên máy tính
Phân tích và thiết kế giải thuật
Tổng quan về đánh giá độ phức tạp của giải thuật

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 2


Giải thuật ứng dụng trong kinh doanh

Vai trò của tổ chức dữ liệu

Làm thế nào để đưa những công việc ngoài đời


thực vào máy tính để xử lý một cách chính xác và
nhanh chóng nhất có thể?
Những công việc ngoài đời thực gồm những gì?
 Các đối tượng dữ liệu
 Các yêu cầu xử lý trên những đối tượng đó.
 Tổ chức biểu diễn các đối tượng ngoài đời lên máy tính:
Biểu diễn dữ liệu
Xây dựng các thao tác xử lý trên dữ liệu:
Giải thuật

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 3


Giải thuật ứng dụng trong kinh doanh

Vai trò của tổ chức dữ liệu

Ví dụ: Để tính lương cho Công nhân trong công ty


thì có những đối tượng dữ liệu nào tham gia? Yêu
cầu xử lý trên những đối tượng này là gì?
đối tượng dữ liệu: công nhân, cụ thể: họ tên, quê quán, DOB, ...
yêu cầu xử lí=xuất thông tin: hệ số lương, ai lương cao nhất, tuổi lao động

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 4


Giải thuật ứng dụng trong kinh doanh

Vai trò của tổ chức dữ liệu

Dữ liệu
Đối tượng

Bài toán cần


giải quyết

Cách thức
Giải Thuật
giải quyết

Phân tích Lập trình


cách giải quyết vấn đề 5
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn
Giải thuật ứng dụng trong kinh doanh

Vai trò của tổ chức dữ liệu

Là những số liệu rời rạc của một sự


vật hiện tượng cần được quản lý.
lưu trữ dữ liệu trong hệ Ví dụ:
quản trị csdl, vd: excel
 Nhân viên: Mã, họ tên, địa chỉ, số
một số server lớn như: lazada
shoppee, lớn hơn có amazon, epay điện thoại, lương , hệ số lương…
 Sản Phẩm: Mã, tên sản phẩm, giá,
xuất xứ, ngày sản xuất…

Cần biểu diễn các dữ liệu này vào


máy tính khi xây dựng chương trình.
biểu diễn vd như trình bày sản phẩm trên sàn thương
mại điện tử, có khả năng bảo mật bị hổng

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 6


Giải thuật ứng dụng trong kinh doanh

Vai trò của tổ chức dữ liệu


vd: mua hàng online thì có huỷ đơn,
xoá đơn  Thực hiện các thao tác trên dữ liệu
đã lưu trữ
 Thao tác : Tìm kiếm, sửa đổi, xóa,
biến đổi dữ liệu, lập báo cáo...
Thao tác  Ví dụ:
trên • Tìm nhân viên có tên:
Dữ Liệu “Nguyễn Thị Phương Thảo”
• Lập danh sách nhân viên có
lương trên 5 triệu theo thứ tự
giảm dần
• Lập danh sách nhân viên có thâm
niên trên 10 năm
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 7
Giải thuật ứng dụng trong kinh doanh

Mối quan hệ giữa cấu trúc dữ liệu và giải thuật


lưu ý công thức này

+ Giải
thuật = Chương
trình
dòng lệnh,..
phải sắp xếp và tìm kiếm, liên kết với nhau này là
vd: tìm mssv, sửa thông tin sv, .... chương
trình
acess
công thức bổ sung:
cấu trúc dữ liệu+giải thuật+giao diện
=chương trình
yêu cầu cần thiết vì nhu cầu thẩm mỹ
của khách hàng, người sử dụng

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 8


Giải thuật ứng dụng trong kinh doanh

Mối quan hệ giữa cấu trúc dữ liệu và giải thuật


Ví dụ:
Một chương trình quản lý điểm thi của sinh viên cần
lưu trữ các điểm số của 4 sinh viên. Do mỗi sinh viên
có 3 điểm số ứng với 3 môn học khác nhau nên dữ liệu
có dạng bảng như sau:
Sinh viên Điểm 1 Điểm 2 Điểm 3
sv1 3 4 5
sv2 5 9 3
sv3 4 4 6
sv4 4 3 8

Chỉ xét thao tác xử lý là xuất điểm số các môn của


từng sinh viên. có mấy phương án để xuất điểm ra, vd dùng mảng 1 chiều
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 9
Giải thuật ứng dụng trong kinh doanh

Mối quan hệ giữa cấu trúc dữ liệu và giải thuật

Phương án 1 : Sử dụng mảng một chiều: 1D array


3 4 5 5 9 3 4 4 6 4 3 8

Sv1 sv2 sv3 sv4


nhằm tạo 1 vùng nhớ
float diemsv[ ]=new float[12]
Để in điểm thứ i của sv thứ j ta sẽ dùng:
nếu in mảng 1 chiều này ra từ 0 đến 11
diemsv[(j-1)*3+i-1] for(int i=0; i<11; i++)
printf("%4d",a[i])

thì phải viết chương trình hoàn chỉnh

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 10


Giải thuật ứng dụng trong kinh doanh

Mối quan hệ giữa cấu trúc dữ liệu và giải thuật

Phương án 2 : Sử dụng mảng hai chiều: matrix


J=0 J=1 J=2

i=0 3 4 5 m dòng
n cột
i=1 5 9 3
i=2 4 4 6
i=3 4 3 8

float [,] diemsv=new float[4,3];


Để in điểm thứ i của sv thứ j ta sẽ dùng:
nếu in mảng 2 chiều này ra m dòng
diemsv[j-1][i-1] for(int i=0; i<n;i++)
{
n cột
nó chạy từ dòng
for(int j="0",j<m; j++) đầu, chạy hết từng
printf("%4d",a[i][j]) cột của dòng đầu
printf("\n") rồi nó tiếp dòng ++,
} rồi chạy từng cột
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 11
Giải thuật ứng dụng trong kinh doanh

Mối quan hệ giữa cấu trúc dữ liệu và giải thuật

Phương án 3 : Sử dụng 3 mảng độc lập


Diem1[4] 3 4 5
Diem2[4]
Diem3[4] 5 9 3

4 4 6
Để in điểm thứ i của sv thứ j ta
sẽ dùng: diemj[i-1]
4 3 8

Điểm 1 Điểm 2 Điểm 3


GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 12
Giải thuật ứng dụng trong kinh doanh

Mối quan hệ giữa cấu trúc dữ liệu và giải thuật


Phương án 4 : Sử dụng cấu trúc lớp phức hợp
 Màu đỏ: điểm 1
3 4 5
 Màu xanh biển: điểm 2 dSv

 Màu xanh lá: điểm 3


class dSv{
Float Diem1; dSv 5 9 3
Float Diem2;
Float Diem3;
Float dtb;

} dSv 4 4 6
dSv mangdiem[4];
Điểm 1 của sinh viên thứ 3
Mangdiem[2].diem1 4 3 8
dSv

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 13


Giải thuật ứng dụng trong kinh doanh

Mối quan hệ giữa cấu trúc dữ liệu và giải thuật

Mối quan hệ
 Một cấu trúc đã chọn sẽ có những giải thuật
tương ứng xem mấy cái phương án
 Khi cấu trúc dữ liệu thay đổi thì giải thuật cũng
thay đổi theo cho phù hợp
 Cấu trúc dữ liệu tốt sẽ giúp giải thuật xử lý phát
huy tốt
Tổ chức cấu trúc dữ liệu trước, sau đó xây dựng
giải thuật xử lý.
Nói cách khác:
Cấu trúc dữ liệu quyết định giải thuật
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 14
Giải thuật ứng dụng trong kinh doanh

Đặc trưng của giải thuật

• Tính xác định nó phải chính xác, không gây nhầm lẫn, theo thứ tự của các
phần tử
thời gian chạy hết các phần tử, không có vụ
• Tính dừng (hữu hạn)chạy hoài không hết, cỡ trong mấy giây để ra
phần tử thôi. vd kiếm laptop, cỡ 3 đến 5 giây là
• Tính đúng đắn ra kết quả các laptop rồi
while(1<1000) => nó true là nó chạy quài
(cout>>"value";)
• Tính phổ dụng dễ sửa chữa, bảo trì
• Tính khả thi dễ chuyển hoá thành chương trình

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 15


Giải thuật ứng dụng trong kinh doanh

Diễn đạt giải thuật


• Dạng lưu đồ (sơ đồ khối) flow chart
• Dạng ngôn ngữ tự nhiên (Ngôn ngữ liệt kê từng bước)
• Ngôn ngữ lập trình
• Dạng mã giả:

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 16


Giải thuật ứng dụng trong kinh doanh

Diễn đạt giải thuật


Các nút biểu diễn giải thuật bằng sơ đồ khối xem lại giáo
trình cslt

Nút thao tác:

Nút điều khiển: trong đó ghi điều kiện cần kiểm


tra trong quá trình tính toán.

Nút khởi đầu, kết thúc:

Cung :.

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 17


Giải thuật ứng dụng trong kinh doanh

Diễn đạt giải thuật huỳn thoại mẹ rồi


Begin Ví dụ : Giải PT: ax2 + bx + c= 0,
giải thuật mô tả bằng sơ đồ khối
Nhập a, b, c

a=0  = b2 – 4ac
True

True sai True


=0 <0
sai
Hai nghiệm
Nghiệm kép Vô nghiệm
phân biệt

Thông báo nghiệm

End
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 18
Giải thuật ứng dụng trong kinh doanh

Diễn đạt giải thuật này là ngôn ngữ tự nhiên

• Ví dụ 1: Giải thuật xác định n là số nguyên tố


– Bước 1: Ghi nhận n
– Bước 2: Nếu n ≤ 1  n không là nguyên tố  dừng
– Bước 3: Nếu n > 2, gán i  2
– Bước 4: Nếu i ≥ √n hay n chia hết cho i  bước 6
– Bước 5: Gán i  i+1, trở lại bước 4
– Bước 6:
• Nếu i > √n  n nguyên tố  dừng
• Ngược lại, n không là nguyên tố  dừng

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 19


Giải thuật ứng dụng trong kinh doanh

Diễn đạt giải thuật

• Ví dụ 2: Giải thuật tìm phần tử thứ n


của dãy số Fibonacci Đệ quy (tiếng Anh: recursion) là phương
pháp dùng trong các chương trình máy

 1 1 2 3 5 8 13 21(n=8) tính trong đó có một hàm tự gọi chính nó.

– Bước 1: Ghi nhận n


– Bước 2: Nếu n=1 hay n=2  un=1  dừng
– Bước 3: Nếu n > 2, gán a1, b1, i1
– Bước 4: Gán ca+b, ab, bc
có chạy c++ trong gg doc, có gì
– Bước 5: xem

• Nếu i = n - 2  un=c  dừng


• Ngược lại i  i+1, quay lại bước 4

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 20


Giải thuật ứng dụng trong kinh doanh

Diễn đạt giải thuật xem lại 3 ví dụ tự giải mà ngẫm nha


chứ thầy cũng lướt lướt à

• Ví dụ 3: tìm phần tử lớn nhất trong mảng A


A[6]={2 3 5 4 6 10}
– Giải thuật TimMax(A, n)
Input: Mảng A, gồm n số nguyên
Output: Giá trị lớn nhất của A
Max  A[0]
for i  1 to n  1 do
if A[i]  Max then
Max  A[i]
return Max

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 21


Giải thuật ứng dụng trong kinh doanh thầy cũng lướt luôn nhưng chủ yếu
là hiểu để dùng cho các dữ liệu, vd
msss thì dùng nào, tên sv thì dùng
Các kiểu dữ liệu cơ bản nào. xem coi bộ nhớ lưu trữ nhiêu

Các kiểu dữ liệu định sẵn trong C gồm các kiểu sau:

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 22


Giải thuật ứng dụng trong kinh doanh

Các kiểu dữ liệu cơ bản

Kiểu cơ bản chỉ lưu các giá trị đơn, không lưu
được các đối tượng dữ liệu phức hợp.
Đối tượng dữ liệu phức hợp là những đối tượng
dữ liệu được tạo nên từ nhiều kiểu dữ liệu cơ bản
hoặc kiểu dữ liệu phức hợp khác.
Trong thực tế các đối tượng dữ liệu ngoài việc lưu
trữ dữ liệu còn có các thao tác xử lý trên đối
tượng dữ liệu này nữa.
Khuyết điểm của kiểu cơ bản là không đáp ứng
được đầy đủ các yêu cầu lưu trữ dữ liệu thực tế, vì
nó chỉ có thể: Lưu giá trị đơn, không có được các
thao tác nghiệp vụ trên dữ liệu này.
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 23
Giải thuật ứng dụng trong kinh doanh

Các kiểu dữ liệu cơ bản

Ví dụ: Thực tế ta có dữ liệu là Nhân Viên, Mỗi


Nhân Viên gồm có các thông tin: Mã, Tên, năm
sinh, giới tính, ngày vào làm việc… Như vậy
không có 1 kiểu dữ liệu cơ sở nào mà đáp ứng
được đối tượng dữ liệu Nhân Viên này
Vì vậy ta cần tạo một kiểu dữ liệu phức hợp để có
thể đáp ứng yêu cầu này. tự đặt tên, tự làm cái mới => chạy qua bên dữ liệu
cấu trúc

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn đang nghe dở ở phút 33 24


Giải thuật ứng dụng trong kinh doanh

Kiểu dữ liệu trừu tượng

 Các kiểu dữ liệu cơ sở không đủ để phản ánh tự


nhiên và đầy đủ bản chất của sự vật thực tế.
 Kiểu dữ liệu trừu tượng (Abstract Data Type) là
một mô hình toán kết hợp với các phép toán trên
mô hình này. Là sự trừu tượng các dữ liệu cơ bản
và các thủ tục (các phép toán….).
 Phải xây dựng các kiểu dữ liệu mới dựa trên việc
tổ chức, liên kết các thành phần dữ liệu có kiểu dữ
liệu đã được định nghĩa.
 Struct
 Class

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 25


Giải thuật ứng dụng trong kinh doanh

Kiểu dữ liệu có cấu trúc

• Trong nhiều trường hợp, các kiểu dữ liệu cơ sở


không đủ để phản ánh tự nhiên và đầy đủ bản chất
của sự vật thực tế, dẫn đến nhu cầu phải xây dựng
các kiểu dữ liệu mới dựa trên việc tổ chức, liên kết
các thành phần dữ liệu có kiểu dữ liệu đã được định
nghĩa. Những kiểu dữ liệu được xây dựng như thế
gọi là kiểu dữ liệu có cấu trúc.
• Đa số các ngôn ngữ lập trình đều cài đặt sẵn một số
kiểu có cấu trúc cơ bản như mảng, chuỗi, tập tin,
bản ghi... và cung cấp cơ chế cho lập trình viên tự
định nghĩa kiểu dữ liệu mới.

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 26


Giải thuật ứng dụng trong kinh doanh

Kiểu dữ liệu có cấu trúc

• Ví dụ: Để mô tả một đối tượng sinh viên, cần quan


tâm đến các thông tin sau:
- Mã sinh viên: chuỗi ký tự: string
- Tên sinh viên: chuỗi ký tự: string
- Ngày sinh: kiểu ngày tháng: DateTime
- Nơi sinh: chuỗi ký tự: string
- Điểm thi: số nguyên: int

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 27


Giải thuật ứng dụng trong kinh doanh

Kiểu dữ liệu có cấu trúc


• Các kiểu dữ liệu cơ sở cho phép mô tả một số thông tin như:
int Diemthi;
char masv[15];
char tensv[15];
char noisinh[15];
• Các thông tin khác đòi hỏi phải sử dụng các kiểu có cấu trúc
như:
Để thể hiện thông tin về ngày tháng năm cần phải xây dựng
một kiểu bản ghi
typedef struct tagDate{
char ngay;
char thang;
char thang;
}Date;
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 28
Giải thuật ứng dụng trong kinh doanh

Kiểu dữ liệu có cấu trúc


• Ta có thể xây dựng kiểu dữ liệu thể hiện thông tin về một
sinh viên:
typedef struct tagSinhVien {
char masv[15];
char tensv[45];
Date ngaysinh;
char noisinh[15];
int Diem thi;
} SinhVien;
• Giả sử đã có cấu trúc phù hợp để lưu trữ một sinh viên, nhưng
thực tế lại cần quản lý nhiều sinh viên, lúc đó nảy sinh nhu cầu
xây dựng kiểu dữ liệu mới... Mục tiêu của việc nghiên cứu cấu trúc
dữ liệu chính là tìm những phương cách thích hợp để tổ chức, liên
kết dữ liệu, hình thành các kiểu dữ liệu có cấu trúc từ những kiểu
dữ liệu đã được định nghĩa.
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 29
Giải thuật ứng dụng trong kinh doanh

Phân tích giải thuật tự xem đi vì thầy không giảng đâu

• Độ phức tạp không gian (Space complexity)


– Dung lượng bộ nhớ mà thuật toán đòi hỏi cấu hình càng
cao thì chạy càng

• Độ phức tạp thời gian (Time complexity)


ngon

– Thời gian thực hiện thuật toán nhà lập trình thì xét khả năng phức
tạp của ct, tạo ra thời gian chạy

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 30


Giải thuật ứng dụng trong kinh doanh

Phân tích thời gian thực hiện giải thuật y chang bên trên

• Thời gian thực hiện giải thuật phụ thuộc


vào các yếu tố sau:
– Dữ liệu vào
– Tốc độ thực hiện các phép toán của máy tính
(phần cứng máy tính)
– Trình biên dịch cấu hình ngon thì chạy lẹ, thầy vd bài sắp xếp
cỡ 100 phần tử thì chạy lẹ vc
cỡ 50000 phần tử là lâu thôi
quá là hiển nhiên

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 31


Giải thuật ứng dụng trong kinh doanh

Phân tích thời gian thực hiện giải thuật y chang bên trên

• Sử dụng các công cụ toán học để đánh giá thời


giann chạy của giải thuật
là kích thước của mảng 1 chiều

• Gọi n là kích thước của dữ liệu vào, thời gian


thực hiện của giải thuật có thể biểu diễn là
một hàm của n: hàm T(n)

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 32


Giải thuật ứng dụng trong kinh doanh

Tiến trình phân tích thời gian thực hiện giải thuật y chang bên
trên
lớn hay nhỏ
• Bước 1: Phân tích kích thước dữ liệu vào
• Bước 2: Phân tích (toán học) tìm ra giá trị
tốt nhất, trung bình, và giá trị xấu nhất cho
mỗi đại lượng cơ bản.
0 1000 phần tử
7 7 7 7

ví dụ tìm x=7,nếu nó nằm ngay đầu chuỗi thì nó là tốt nhất


x=7 ở ô 1000 đi thì nó là xấu vì tốn tgian, cũng có thể là không có giá trị 7 thì cũng là xấu nhất
còn trung bình thì x=7 là ô nằm ở giữa chuỗi

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 33


Giải thuật ứng dụng trong kinh doanh

Thiết kế giải thuật

• Từ bài toán đến chương trình


viết code sao để thầy chấm, nhìn thông minh vào :(((

Thiết kế Lập trình #include


Bài toán …
thực tế

Giải thuật Chương trình

Kỹ thuật thiết kế giải •Ngôn ngữ lập


thuật: trình:
Chia để trị, quy hoạch •PASCAL, C/C++,
động, backtracking … JAVA, C#

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 34


Giải thuật ứng dụng trong kinh doanh

Thiết kế giải thuật


• Với một vấn đề đặt ra, làm thế nào để đưa ra thuật
toán giải quyết nó?
từ bài toán lớn chia ra các bài
• Chiến lược thiết kế: toán vừa, từ các bài toán vừa
chia ra các bài toán nhỏ
– Chia-để-trị (divide-and-conquer) để ý cái này
– Quy hoạch động (dynamic programming)
– Quay lui (backtracking): vét cạn thuật toán quay lui, trên mạng muốn
xem thì coi yt
– Tham lam (greedy method): AI thích thì tự xem

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 35


Giải thuật ứng dụng trong kinh doanh

Thiết kế giải thuật

• Module hoá và việc giải quyết bài toán


– Chiến thuật chia để trị (divide-conquer):
Để thực hiện chiến thuật này, thường có hai cách
thiết kế:
1.Từ trên xuống (Top-Down Design)
2.Tinh chỉnh từng bước

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 36


Giải thuật ứng dụng trong kinh doanh

Thiết kế giải thuật


• Sau đây là lược đồ của kỹ thuật chia-để-trị: thầy lấy ví dụ bên chương 2
trang 13
bài toán về đệ quy giai thừa
DivideConquer (A,x) // tìm nghiệm x của bài toán A. int giaithua(int n)
 {
if(n==1)||(n==0) {return 1;}
if (A đủ nhỏ) return giaithua (n-1)*n
Solve (A); giải quyết ngay }
else  còn không thì chia ra vd n=4 thì chưa đủ nhỏ, phải
n=1 hay bằng 0 á thì mới
Chia bài toán A thành các bài toán con được
A1, A2,…, Am; nên áp dụng (n-1)*n là
for (i = 1; i <= m ; i ++)
DivideConquer (Ai , xi);
Kết hợp các nghiệm xi của các bài toán con Ai (i=1, …, m)
để nhận được nghiệm x của bài toán A;

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 37


Giải thuật ứng dụng trong kinh doanh

Thiết kế giải thuật

• Tinh chỉnh từng bước: không cần chia nhỏ


– Biểu diễn ý tưởng bằng ngôn ngữ tự nhiên
– Cụ thể từng phần, thay đổi bằng ngôn ngữ
chương trình
– Cuối cùng ta có chương trình

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 38


Giải thuật ứng dụng trong kinh doanh

Thiết kế giải thuật

• Ví dụ: Bài toán sắp xếp một dãy n số, theo


thứ tự tăng dần
– Chọn số bé nhất trong n số để vào vị trí thứ 1
– Chọn số bé nhất trong n-1 số còn lại để vào vị trí thứ 2
– Chọn số bé nhất trong 2 số còn lại để vào vị trí thứ n-1 tương tự lần lượt
là 6 8 10
6 2 10 8 5

chọn số bé nhất vào ô đầu: 2 2 5


số bé tiếp theo vào ô 2: 5

2 5 6 8 10

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 39


Giải thuật ứng dụng trong kinh doanh

Thiết kế giải thuật

•  For (i= 1, i <= n-1, i++)


{- Chọn số bé nhất trong các số
- Đổi chỗ cho xi
}
•  For (i= 1, i <= n-1, i++)
{- tg = x[i]
-So sánh tg với các số từ xi+1 -> xn . Nếu x[i] > các số đó
thì lại lấy số đó làm số tg
- đổi chổ x[i] và tg
}

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 40


Giải thuật ứng dụng trong kinh doanh

Thiết kế giải thuật

for (i= 1; i <= n-1; i++)


for(j = i+1; j <=n; j++) {
If (x[j] < x[i])
{
Tg = x[i] ; chỗ này là hoán vị, xem lại gt, nếu không hiểu thì xem yt

X[i] = x[j];
X[j] = tg ;
}
}

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 41


Giải thuật ứng dụng trong kinh doanh

Độ phức tạp tính toán giải thuật


• Ví dụ:
– Giải thuật A, độ phức tạp thời gian Ta(n)
– Giải thuật B, độ phức tạp thời gian Tb(n)
– Khi n lớn, Ta(n) >> Tb(n). Có thể kết luận giải thuật A
chậm hơn giải thuật B. thời gian tốn a nhiều hơn b

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 42


Giải thuật ứng dụng trong kinh doanh

Ký pháp để đánh giá độ phức tạp của giải thuật


để ý cái này
• Ký hiệu O (Big-Oh): hàm f(n) và g(n), ta nói:
f(n) = Ο(g(n)), nếu tồn tại các hằng số dương c và no sao
cho f(n) ≤ cg(n) khi n ≥ no.
• Ký hiệu này dùng để chỉ chặn trên của một
hàm
• Ý nghĩa: Tốc độ tăng của hàm f(n) không lớn
hơn hàm g(n)

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 43


Giải thuật ứng dụng trong kinh doanh

đọc cho biết nha


Ký pháp để đánh giá độ phức tạp của giải thuật
Cho f và g là hai hàm số nguyên, ta nói f(x) là O(g(x)) nếu tồn tại
hằng số C và k sao cho: |f(x)|  C|g(x)| với mọi x>k.
Ví dụ: Cho hàm f(x) =x2+3x+2 là O(x2).
Ta chứng minh f(x) là O(g(x))?

Thật vậy, khi x>2 thì x<x2 và 2<2x2


Do đó: x2+3x+2< x2+3x2 +2x2 x2+3x+2< 6x2
 |x2+3x+2|<6|x2| với mọi x>2
(Ở đây C=6, g(x)=x2, ta chọn được C=6 và k=2)
Kết luận: f(x)=x2+3x+2 là O(g(x))=x2 với mọi x>2

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 44


Giải thuật ứng dụng trong kinh doanh

Ký pháp để đánh giá độ phức tạp của giải thuật

f(n) = 2n + 6
• Ví dụ : c g(n) = 4n
đây là chặn trên với c=4
f(n) = 2n+6,
g(n) = n và c = 4 ,
n0=3
• f(n)= O(n)
thầy có lấy vd fn=5n3+2n2+13n+6 luôn luon nhỏ hơn
5n3+2n3+12n3+6n3=26n3
bất đẳng thức trên luôn đúng với n>=1
vậy n0=1 và c là 26 và độ phức tạp là On^3
xem thêm gg doc
g(n) = n

N0 = 3
n
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 45
Giải thuật ứng dụng trong kinh doanh

Ký pháp để đánh giá độ phức tạp của giải thuật


• Định nghĩa Ω:
- f(n) = Ω(g(n)), nếu tồn tại các hằng số dương c
và no sao cho f(n) ≥ cg(n) khi n ≥ no
- f(n) = Ω(g(n))  g(n) = Ο(f(n))
• Định nghĩa 
f(n) = (g(n)), nếu tồn tại các hằng số dương c1,
c2 và n0 sao cho c1.g(n)  f(n)  c2. g(n) với mọi
n> n0

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 46


Giải thuật ứng dụng trong kinh doanh

Ký pháp để đánh giá độ phức tạp của giải thuật

f ( n ) =O ( g ( n )) f ( n ) = ( g ( n ))
cg(n) f(n)

f(n)
cg(n)

n0 n0

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 47


Giải thuật ứng dụng trong kinh doanh

Ký pháp để đánh giá độ phức tạp của giải thuật

f ( n ) =( g ( n ))
c2g(n)
f(n)

c1g(n)

n0

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 48


Giải thuật ứng dụng trong kinh doanh

Ký pháp để đánh giá độ phức tạp của giải thuật

• Ta nói độ phức tạp tính toán của giải thuật


có cấp f(n) nếu thỏa :
– T(n) = O(f(n)), và
– Nếu  g(n), mà T(n) = O(g(n)) thì f(n) = O(g(n)).

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 49


Giải thuật ứng dụng trong kinh doanh

Một số qui tắc về ký hiệu O lớn

• Nếu f1(n)=O(g1(n)) và f2(n)=O(g2(n))


– f1(n)+f2(n)=O(g1(n)+g2(n))=max(O(g1(n),g2(n)) lấy cái lớn nhất
– f1(n)*f2(n)=O(g1(n)*g2(n)) hai cái biểu thức nhân nhau
– logkn=O(n) với mọi hằng số k
• Nếu f(n) là một đa thức bậc k thì f(n) = O(nk),

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 50


Giải thuật ứng dụng trong kinh doanh

Một số qui tắc về ký hiệu O lớn


• f = O(f)
• f = O(g) và g = O(h) thì f = O(h)
• f = O(g) và h=O(r) thì fh = O(gr)
• f =O(g) và h=O(r) thì f+h = O(g+r)
• f =O(g) thì af = O(g) với mọi a>0.
• O(c)=O(1) , c là hằng số

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 51


Giải thuật ứng dụng trong kinh doanh

Một số qui tắc về ký hiệu O lớn


• Ví dụ:
– 2n là O(n)
– 3n + 5 là O(n) thay vì 3n + 5 là O(3n) khi tính độ phức tạp là
như nhau, không tính
– 4n2 + 5n + 7  O(?) =O(n^2); xét cái bậc thooi hằng số

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 52


Giải thuật ứng dụng trong kinh doanh

Xác định độ phức tạp tính toán


• T1(n) và T2(n) là thời gian thực hiện của hai giai đoạn
chương trình P1 và P2 mà T1(n) = O(f(n)); T2(n) =
O(g(n))
• Qui tắc tổng: để ý khúc này

– Thời gian thực hiện đoạn P1 rồi P2 tiếp theo sẽ là T1(n) +


T2(n) = O(max(f(n),g(n))). ngang cấp nhau

• Qui tắc nhân:


– Thời gian thực hiện P1 và P2 lồng nhau sẽ là : T1(n)T2(n) =
O(f(n)*g(n)) kiểu mục con

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 53


Giải thuật ứng dụng trong kinh doanh

Các quy tắc tổng quát


• Các phép gán, đọc, viết, goto là các phép toán sơ
cấp:
– Thời gian thực hiện là: O(1) độ phức tạp là 1, 1 thao tác thôi
• Lệnh lựa chọn: if-else có dạng
if (<điều kiện>)
lệnh 1
else
lệnh 2
if này cũng O(1)

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 54


Giải thuật ứng dụng trong kinh doanh

Các quy tắc tổng quát


• Câu lệnh switch được đánh giá tương tự
như lệnh if-else.
• Các lệnh lặp: for, while, do-while
– Cần đánh giá số tối đa các lần lặp, giả sử đó là
L(n) for int i=0, i<n, thì lặp n-1
– Tiếp theo đánh giá thời gian chạy của mỗi lần
lặp là Ti(n), (i=1,2,..., L(n))
– Mỗi lần lặp, chi phí kiểm tra điều kiện lặp là
T0(n). L(n)

– Chí phí lệnh lặp là:


i =1
 T0 n  + Ti n 

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 55


Giải thuật ứng dụng trong kinh doanh

Một số ví dụ
• Ví dụ 1. Mảng A các số thực, cỡ n, cần tìm
xem mảng có chứa số thực x không.
(1) i = 0; O(1) O(n) xem coi là có vai trò cha con, lồng nhau
đồ không

(2) while (i < n && x != A[i])


đây là lồng nhau
A=5: gán
(3) i++; A==5: lệnh logic

 T(n)=O(n)
i=0 i=1 i=2 i=3 i=4
A= 5 8 2 1 5

Tìm x=5? đầu mảng nên trường hợp tốt nhất rồi O(1)

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 56


Giải thuật ứng dụng trong kinh doanh

Một số ví dụ On
Case1: for (i=0; i<n; i++) (i=0,j=0,j=1,j=2…n)i=1j=0,j=1,j=2..j=n)
3 dòng lồng nhau
for (j=0; j<n; j++) On
k++; O1 O(n2) =On *On
cùng cấp nên là lấy cái max
Case 2: for (i=0; i<n; i++) chạy tới n lần thì là On là On^2
k++;
for (i=0; i<n; i++) On lồng nhau là On^2
O(n 2)
for (j=0; j<n; j++) On
k++;
Case 3: for (int i=0; i<n-1; i++)On vì có là n-mấy cũng là On
là lồng nhau là On^2
for (int j=0; j<i; j++) On
int k+=1; O1 O(n2)

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 57


Giải thuật ứng dụng trong kinh doanh

Một số ví dụ
int MaxSubSum1(const int a[], int n) {
int maxSum=0;

for (int i=0; i<n; i++) On^2


On lồng trong On^2 lên là nhân
nhau ra On^3
for (int j=i; j<n; j++) {
int thisSum=0;

for (int k=i; k<=j; k++)


2 cái này nối thisSum+=a[k];
On
3
O(n )
tiếp nên là lấy
max là On if (thisSum>maxSum) O1
maxSum=thisSum;
}
return maxSum;
}

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 58


Giải thuật ứng dụng trong kinh doanh

Một số ví dụ
int MaxSubSum2(const int a[], int n) {
int maxSum=0;

On for (int i=0; i<n; i++) { ngoặc này để thấy được


thisSum=0; On lồng trong On
for (int j=i; j<n; j++) {
On
thisSum+=a[j];

if (thisSum>maxSum)
2
T(n)=O(n )
maxSum=thisSum;
}
}
return maxSum;
}

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 59


Giải thuật ứng dụng trong kinh doanh

Một số ví dụ
int MaxSubSum4(const int a[], int n) {
int maxSum=0, thisSum=0;

On for (int j=0; j<n; j++) {


thisSum+=a[j];
if (thisSum>maxSum)
maxSum=thisSum;
else if (thisSum<0)

}
thisSum=0;
O(n)
return maxSum;
}

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 60


Giải thuật ứng dụng trong kinh doanh

Một số ví dụ

Sum=0
for (j=0;j<N;j++) On On^3

for (k=0;k<N*N;k++) On^2

O(N3)
Sum++; N^2

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 61


Giải thuật ứng dụng trong kinh doanh

Một số ví dụ
Ví dụ: sắp xếp dãy
void BubbleSort(int a[], int n)
{ int i,j,temp;
On*O(n-i)=On(n-i) mà i=1
(1) for(i= 1; i<n; i++) On =>O(n^2-n)
(2) for(j=n-1; j>=i;j--) O(n-i) lấy mũ lớn nhất=>O(n^2)
(3) if (a[j] < a[j-1]) {
(4) temp=a[j-1];
(5) a[j-1] = a[j]; O1
(6) a[j] = temp;
}
}

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 62


Giải thuật ứng dụng trong kinh doanh

Một số ví dụ
• Lệnh (3), (4), (5) và (6) đều tốn O(1)
• Vòng lặp (2) thực hiện (n-i) lần, mỗi lần O(1) do đó vòng lặp
(2) tốn O((n-i)*1) = O(n-i).
• Vòng lặp {1},i chạy từ 1 đến n-1, thời gian thực hiện của
vòng lặp (1)
• Độ phức tạp của giải thuật là chỗ này trong vid là
for(i=0;i<=n-2;i++)
n 1
n(n  1)
T(n) =  (n  i) = = O(n 2 )
i =1 2

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 63


Giải thuật ứng dụng trong kinh doanh

Phân tích các hàm đệ quy


• Ví dụ: Hàm tính giai thừa
int Fact(int n)// VD: 4!=1x2x3x4=24
{
if (n <= 1) O1
return 1;
else return n * Fact(n-1);
} O1+O(n-1)

• Với n <= 1, ta có T(1) = O(1).


• Với n > 1, ta có T(n) = 0(1) + T(n-1)

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 64


Giải thuật ứng dụng trong kinh doanh

Phân tích các hàm đệ quy


• Ta có quan hệ đệ quy sau:
– T(1) = O(1)
– T(n) = T(n-1) + O(1) với n > 1
• Thay các ký hiệu O(1) bởi các hằng số
dương a và b tương ứng, ta có
– T(1) = a
– T(n) = T(n-1) + b với n > 1

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 65


Giải thuật ứng dụng trong kinh doanh

Phân tích các hàm đệ quy


• Sử dụng các phép thế T(n-1) = T(n-2) + b,
T(n-2) = T(n-3) + b,..., ta có
T(n) = T(n-1) + b
= T(n-2) + 2b
= T(n-3) + 3b
...
= T(1) + (n-1)b
= a + (n-1)b kiểu không quan trọng hằng số á hả, và n nên là On
Từ đó, ta suy ra T(n) = O(n).

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 66


Giải thuật ứng dụng trong kinh doanh

Phân tích các hàm đệ quy


• Gọi T(n) là thời gian chạy của hàm đệ quy F
• Khi đó, thời gian chạy của các lời gọi hàm ở trong hàm
F sẽ là T(m) (với m < n)
• Trước hết, phải đánh giá thời gian chạy của hàm F
trên dữ liệu nhỏ nhất n = 1, giả sử T(1) = a (điều kiện
dừng)
• Sau đó, đánh giá thời gian chạy của các câu lệnh trong
thân của hàm F
• Tìm ra quan hệ đệ quy biểu diễn thời gian chạy của
hàm F thông qua lời gọi hàm

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 67


Giải thuật ứng dụng trong kinh doanh

Sự phân lớp của giải thuật


 Độ phức tạp
=1, bằng số đ nào cũng =1
 O(1) độ phức tạp hằng số phép gán, phép đọc

 O(logn) độ phức tạp hàm logarit giá trị lớn hơn O1


 O(n) độ phức tạp hàm tuyến tính
 O(nlogn) độ phức tạp hàm nlogn
 O(nb) độ phức tạp hàm đa thức
 O(bn) độ phức tạp hàm mũ
 O(n!) độ phức tạp hàm giai thừa phức tạp lớn nhất

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 68


Giải thuật ứng dụng trong kinh doanh

Sự phân lớp của giải thuật

hàm mũ luôn nằm trên hàm tuyến tính

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 69


Giải thuật ứng dụng trong kinh doanh

Các trường hợp đánh giá độ phức tạp

• Độ phức tạp tính toán của giải thuật trong


các trường hợp
• Xấu nhất
• Tốt nhất
• Trung bình

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 70


Giải thuật ứng dụng trong kinh doanh

Các trường hợp đánh giá độ phức tạp


• Ví dụ 1: Thuật toán tìm kiếm tuần tự

int SequenceSearch(int x, int a[], int n){


for (int i=0;i<n;i++){
if (x==a[i]) return i;
}
return -1;
}
Tìm x=2 ? (i=04)
A[5]={5,9,2,4,8} đây là trường hợp trung bình vì 2 nằm ở giữa
0 1 2 3 4
còn nếu 2 nằm ở cuối mảng, có thể đ có trong mảng luôn thì là xấu nhất
còn nếu nằm đầu luôn thì là tốt nhất

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 71


Giải thuật ứng dụng trong kinh doanh

Các trường hợp đánh giá độ phức tạp


– Tốt nhất: phần tử đầu tiên là phần tử cần tìm, số lượng
phép so sánh là 2  T(n) ~ O(2) =O1 luôn
– Xấu nhất: so sánh đến phần tử cuối cùng, số lượng phép
so sánh là 2n  T(n) ~ O(n)
– Trung bình: so sánh đến phần tử thứ i, cần 2i phép so
sánh, vậy trung bình cần
(2+4+6+…+2n)/n=2(1+2+…+n)/n=n+1 =On
 T(n) ~ O(n)
int SequenceSearch(int x, int a[], int n){
On for (int i=0;i<n;i++){ vì nó cần xét tận 2 dòng
On if (x==a[i]) lệnh nên mới là O2
O1
return i;
}
return -1;
}
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 72
Giải thuật ứng dụng trong kinh doanh

Các trường hợp đánh giá độ phức tạp


• Ví dụ 2: Tính độ phức tạp thuật toán sau

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 73


Giải thuật ứng dụng trong kinh doanh

Các trường hợp đánh giá độ phức tạp


Trường hợp xấu nhất:

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 74


Giải thuật ứng dụng trong kinh doanh

Các trường hợp đánh giá độ phức tạp


Trường hợp tốt nhất:

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 75


Giải thuật ứng dụng trong kinh doanh

Các trường hợp đánh giá độ phức tạp


Trường hợp trung bình:

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 76


Giải thuật ứng dụng trong kinh doanh

Các trường hợp đánh giá độ phức tạp


Chú ý:

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 77


Giải thuật ứng dụng trong kinh doanh

Kiến thức toán học bổ trợ về các hàm chuỗi


N
S ( N ) = 1 + 2 +  + N =  i = N (1 + N ) / 2
i =1
N ( N + 1)( 2 N + 1) N 3
N
• Tổng các bình phương:  i = 2
 for large N
i =1 6 3

• Logarithms:
– xa = b  logx b = a

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 78


Giải thuật ứng dụng trong kinh doanh

Kiến thức toán học bổ trợ về các hàm chuỗi


N
N k +1

i =1
i 
k

| k +1|
for large N and k  -1

N
A N +1  1

i =0
A = i

A 1

– Đặc biệt khi A = 2


• 20 + 21 + 22 + … + 2N = 2N+1 - 1

GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 79

You might also like