You are on page 1of 26

SLIDE BÀI GIẢNG

MÔN

CẤU TRÚC DỮ LIỆU VÀ


GIẢI THUẬT

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
1
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT


CHƯƠNG I

TỔNG QUAN VỀ CTDL VÀ GT

Nguyễn Trọng Chỉnh


chinhnt@uit.edu.vn
TỔNG QUAN VỀ CTDL VÀ GT

CẤU TRÚC DỮ LIỆU


KIỂU DỮ LIỆU
GIẢI THUẬT
ĐỘ PHỨC TẠP CỦA GIẢI THUẬT
CÁC CHIẾN LƯỢC THIẾT KẾ GIẢI
THUẬT
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC VÉT CẠN


Từ khóa: Brute Force Search/Exhaustive Search
Nguyên lý: Tìm kiếm lời giải bằng cách duyệt toàn
bộ không gian của bài toán.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC VÉT CẠN


Ví dụ: tìm số lớn nhất trong một dãy số nguyên A
gồm n phần tử.
Phân tích: Số lớn nhất là số không nhỏ hơn bất kỳ
số nào trong A
 phải kiểm tra từng phần tử trong A để chọn.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC VÉT CẠN


Ý tưởng:
Giả sử số đầu tiên của A là max
So sánh max với mỗi số A[i] còn lại, nếu A[i] >
max thì max  A[i].
max là giá trị cần tìm sau khi duyệt toàn bộ A
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC VÉT CẠN


Thuật toán:
Đầu vào: dãy A có n phần tử
Đầu ra: giá trị lớn nhất trong A là max

i  1
max  A[i]
for i  2 to n
if max < A[i] then max  A[i]
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC VÉT CẠN


Ưu điểm: Đơn giản
Lưu ý:
Các thuật toán xây dựng trên chiến lược vét cạn
thường:
- Không hiệu quả về mặt chi phí thời gian.
- Chỉ nên sử dụng khi không thể tìm giải thuật
theo chiến lược nào khác
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC VÉT CẠN


Bài tập về nhà
Viết chương trình in ra một phương án sắp xếp 8
quân hậu (Queen) trên bàn cờ vua sao cho không
quân hậu nào có thể ăn quân hậu khác.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC CHIA ĐỂ TRỊ


Từ khóa Divide and Conquer
Nguyên lý Phân chia không gian bài toán thành
những không gian nhỏ hơn để tìm lời giải
(divide), lời giải trong các không gian con có thể
được tổng hợp thành lời giải của bài toán ban
đầu (conquer).
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC CHIA ĐỂ TRỊ


Ví dụ
Có n đồng xu được đánh số từ 1 đến n trong đó
có một đồng xu giả. Các đồng xu thật có trọng
lượng bằng nhau, đồng xu giả có trọng lượng
nhỏ hơn. Máy tính có thể yêu cầu người dùng
cho biết giữa hai nhóm đồng xu bất kỳ thì nhóm
nào nặng hơn. Viết chương trình xác định đồng
xu giả.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC CHIA ĐỂ TRỊ


Phân tích
Đồng xu giả nhẹ hơn  nếu hai nhóm có số
lượng đồng xu như nhau thì nhóm chứa đồng xu
giả sẽ nhẹ hơn
Tìm đồng xu giả bằng cách chia nhóm đồng xu
thành hai nhóm con và một đồng xu dư (nếu có).
Xác định nhóm chứa đồng xu giả. Nếu nhóm
chứa đồng xu giả chỉ còn một đồng xu thì kết
thúc.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC CHIA ĐỂ TRỊ


Thuật toán
Đầu vào: số lượng n đồng xu phân biệt theo số
hiệu từ 1 đến n
Đầu ra: số hiệu đồng xu giả i.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT
s  1, e  n
i  0
while i = 0
m  n div 2
if weight(s, s+m-1) = weight(s+m, s+m+m-1)
then
i  e
else
n  m
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT
if weight(s,s+m-1)>weight(s+m,s+m+m-1)
then
if (m = 1)
i  s + m
else
s  s+m, e  s+m+m-1
else
if (m = 1)
i = s
else
e  s+m
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC CHIA ĐỂ TRỊ


Ưu điểm Giảm đáng kể chi phí thời gian của thuật
toán
Lưu ý: Cần phải phân tích và xác định được
những yếu tố có thể dùng để phân hoạch được
không gian bài toán và cách tổng hợp lời giải.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC THAM LAM


Từ khóa: Greedy
Nguyên lý: Lựa chọn theo hướng gần mới mục
tiêu bài toán nhất có thể có được một lời giải tốt.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC THAM LAM


Ví dụ:
Có n công việc cần phải gia công máy A rồi máy
B, thời gian gia công của công việc i trên máy A
và B lần lượt là Ai và Bi. Tìm thứ tự công việc
cần thực hiện để có thời gian gia công n công
việc là ngắn nhất.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC THAM LAM


Phân tích:
Tổng thời gian gia công không thể thấp hơn tổng
thời gian n công việc trên máy A.
 cần rút ngắn thời gian chờ công việc chuyển
từ máy A qua máy B
 chọn những công việc có thời gian gia công
nhỏ nhất trên máy A trước. Nếu có nhiều công
việc cùng thời gian gia công trên máy A, chọn
công việc nào gia công trên máy B lâu nhất.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC THAM LAM


Thuật toán: (thuật toán Johnson)
Đầu vào: Số lượng công việc n. Danh sách A, B
chứa thời gian gia công công việc trên máy A và
B.
Đầu ra: Danh sách R thứ tự các công việc cần
thực hiện
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

for i  1 to n
R[i]  i
for i  1 to n-1
for j  i+1 to n
if (A[R[i]] > A[R[j]]) or
(A[R[i]]=A[R[j]] and B[R[i]]<B[R[j]])
swap(R[i], R[j])
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC THAM LAM


Ưu điểm: Đơn giản
Lưu ý: Trong nhiều trường hợp, lời giải tìm được
có thể chấp nhận được mà không phải là lời giải
tốt nhất. Thậm chí có trường hợp cho lời giải
thực sự không tốt.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC QUY HOẠCH ĐỘNG


Từ khóa: Dynamic Programming
Nguyên lý: Các bài toán con trong chiến lược chia
để trị có thể được tính lại nhiều lần. Vì thế, cần
tổ chức lưu trữ và tính toán để khi cần kết quả
của những bài toán con thì có thể tìm thấy trong
kết quả lưu trữ trước đó.
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC QUY HOẠCH ĐỘNG


Ví dụ: Tính số thứ n trong dãy số Fibonacci
Phân tích:
Số thứ n trong dãy Fibonacci được tính như sau:
- n = 0  Fn = 1
- n = 1  Fn = 1
- n > 1  Fn = Fn-2 + Fn-1
 cần lưu hai số F2 và F1 tương ứng với Fk-2 và
Fk-1. Mỗi khi tính xong Fk thì cập nhật lại các giá
trị Fk-2 và Fk-1
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC QUY HOẠCH ĐỘNG


Thuật toán:
Đầu vào: số n cho biết thứ tự trong dãy Fibonacci
Đầu ra: f là giá trị của số thứ n trong dãy Fibonacci

f  1, f1  1, f2  1
while n > 1
f  f1 + f2
f2  f1, f1  f
n  n - 1
CÁC CHIẾN LƯỢC THIẾT KẾ
GIẢI THUẬT

CHIẾN LƯỢC QUY HOẠCH ĐỘNG


Ưu điểm: Tận dụng được kết quả đã tính toán
trước đó  giảm chí phí tính toán
Lưu ý: Cần phân tích được mối liên hệ giữa lời
giải của các bài toán con và lời giải của bài toán
ban đầu để:
- Phân chia không gian bài toán.
- Tổ chức lưu trữ lời giải bài toán con.
- Tổng hợp lời giải.

You might also like