Tải bản đầy đủ (.pdf) (40 trang)

Bài giảng Các vấn đề cơ sở của khoa học máy tính: Chương 2 - ThS. Tô Oai Hùng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (320.17 KB, 40 trang )

Chương 2:

GIẢI THUẬT


Nội Dung
1. Định nghĩa giải thuật .
2. Ví dụ về giải thuật.
3. Đặc tả giải thuật.
4. Phân tích giải thuật.
5. Giải thuật là cơng nghệ.
6. Mơ hình hình thức tính tốn.

2
Các Vấn Đề Cơ Sở của KHMT

ThS. GVC Tơ Oai Hùng









Định Nghĩa Giải Thuật
Định nghĩa giải thuật: Giải thuật là cách thức
để giải quyết một tập các vấn đề.
Thuật ngữ “giải thuật” cũng áp dụng cho bất
kỳ cách thức nào để giải quyết một vấn đề


cụ thể. Cho ví dụ, các bước để thay phanh
xe cũng được gọi là giải thuật.
Ví dụ: Tìm ước số chung lớn nhất.
Trong tốn học, một giải thuật nổi tiếng và
hữu dụng là giải thuật Euclid để tìm ước số
chung lớn nhất (GCD) của hai số nguyên.
Ông đã đưa ra giải thuật này vào khoảng 300
năm trước cơng ngun.
Khơng có giải thuật Euclid, chúng ta tìm

Các Vấn Đề Cơ Sở của KHMT

3

ThS. GVC Tơ Oai Hùng


Ví Dụ Về Giải Thuật





GCD(372, 84) như thế nào? Phải phân tích
hai số nguyên thành các thừa số nguyên tố
và tìm thừa số chung lớn nhất.
Nếu các số nguyên này lớn, việc phân tích
thành các thừa số trở nên khó khăn và tốn
nhiều thời gian. Euclid đã tìm ra giải thuật
một cách có hệ thống và nhanh chóng giảm

kích thước của vấn đề, bằng cách thay giá trị
ban đầu của hai số nguyên với giá trị nhỏ
hơn cho đến khi một trong hai số bằng 0.
Lúc này, GCD của hai số chính là giá trị của
số cịn lại.
Sau đây là giải thuật Euclid để tìm GCD của
4

Các Vấn Đề Cơ Sở của KHMT

ThS. GVC Tô Oai Hùng


Ví Dụ Về Giải Thuật



hai số ngun A và B:
Repeat:
Nếu B = 0, GCD(A, B) = A
Ngược lại:
Thay R bằng A modulo B
Thay A bằng B
Thay B bằng R
Cho ví dụ, để tìm GCD của 372 và 84:
- Tìm GCD(84, 36) vì 372 % 84 = 36
- Tìm GCD(36, 12) vì 84 % 36 = 12
- Tìm GCD(12, 0) vì 36 % 12 = 0
- Vậy GCD(372, 84) = 12
5


Các Vấn Đề Cơ Sở của KHMT

ThS. GVC Tô Oai Hùng


Ví Dụ Về Giải Thuật





Như vậy, giải thuật là một chuỗi các phép
toán thao tác trên tập giá trị nhập và sinh ra
kết quả trong khoảng thời gian hữu hạn.
Trong ví dụ trên, tập giá trị nhập là 2 số
nguyên. Kết quả là ước số chung lớn nhất
của hai số đó.
Có nhiều cách để giải quyết một lớp các vấn
đề. Câu hỏi đặt ra là giải thuật nào tốt nhất?
Thông thường, các nhà khoa học máy tính
sử dụng các kỹ thuật để phân tích, đánh giá
và so sánh hiệu quả giữa các giải thuật.

6
Các Vấn Đề Cơ Sở của KHMT

ThS. GVC Tô Oai Hùng








Đặc Tả Giải Thuật

Đặc tả giải thuật (representing algorithm):
Trong ngành khoa học máy tính, giải thuật
thường được đặc tả bằng mã giả
(pseudocode). Mã giả đủ để cho một ngôn
ngữ lập trình có thể thể hiện các tác vụ mà
máy tính phải thực hiện trong giải thuật.
Mã giả cũng độc lập với bất kỳ ngơn ngữ lập
trình nào. Nó thể hiện chi tiết cú pháp và làm
cho người lập trình dễ dàng đặc tả các thao
tác cốt lõi của một giải thuật.
Khơng có một mẫu chuẩn nào cho mã giả.
Các nhà khoa học máy tính sử dụng mã giả
của riêng mình để đặc tả một giải thuật. Ví dụ
sau là một kiểu mã giả đặc tả giải thuật GCD:
7

Các Vấn Đề Cơ Sở của KHMT

ThS. GVC Tô Oai Hùng


Đặc Tả Giải Thuật
GCD(a, b)

- Tên hàm và đối số
While b != 0 - Trong khi b khác 0
{
- Bắt đầu thân vòng lặp
r ← a mod b - Gán r = a modulo b
a←b
- Gán a = giá trị ban đầu của b
b←r
- Gán b = r
}
- Kết thúc thân vòng lặp
return a
- Khi b = 0, kết quả trả về là a
• Để minh hoạ thế nào là hiệu quả khác nhau
giữa các giải thuật, chúng ta sẽ thảo luận
về sự đa dạng của các giải thuật mà các
nhà khoa học máy tính đã đưa ra để giải
quyết các vấn đề phổ biến trong tính tốn.
8

Các Vấn Đề Cơ Sở của KHMT

ThS. GVC Tô Oai Hùng






Đặc Tả Giải Thuật

Tìm kiếm tuần tự (sequential search): Giả sử
chúng ta có danh sách của các sinh viên
trong một lớp học, yêu cầu là hãy tìm tên của
sinh viên Debbie Drawe. Giải thuật tìm kiếm
tuần tự chỉ đơn giản là so sánh mỗi tên trong
danh sách với tên cần tìm. Quá trình tìm
kiếm kết thúc khi tên được tìm thấy hoặc khi
giải thuật đã tìm hết tất cả các tên trong danh
sách.
Sau đây là mã giả của giải thuật tìm kiếm
tuần tự:
9

Các Vấn Đề Cơ Sở của KHMT

ThS. GVC Tô Oai Hùng


Đặc Tả Giải Thuật
Sequential_Search(listNames, name)
length ← length of listNames
matchFound ← false
index ← 1
while matchFound = false
AND index <= length {
if listNames[index] = name then
matchFound ← true
index ← index + 1
}
return matchFound

end
10
Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tơ Oai Hùng







Phân Tích Giải Thuật
Phân tích giải thuật (analyzing algorithm):
Nếu chúng ta biết chiều dài của mỗi câu lệnh
và có bao nhiêu tên trong danh sách, chúng
ta có thể tính được thời gian để thực thi giải
thuật.
Tuy nhiên, thường thì chúng ta không biết
giải thuật giải quyết vấn đề trong bao lâu và
thời gian cần giải quyết vấn đề sẽ thay đổi
theo độ lớn của vấn đề.
Giải thuật tìm kiếm tuần tự sẽ cần thời gian
lâu hơn nếu số lần so sánh nhiều hơn.
Những lệnh khác của giải thuật chỉ thực thi 1
lần, nhưng những lệnh trong vòng lặp sẽ
11

Các Vấn Đề Cơ Sở của KHMT


ThS. GVC Tô Oai Hùng


Phân Tích Giải Thuật






thực thi nhiều lần miễn là điều kiện lặp cịn
đúng.
Nếu tên cần tìm cần tìm nằm giữa danh sách
thì giải thuật sẽ chỉ tìm một nửa danh sách.
Nhưng nếu tên cần tìm ở cuối hoặc khơng có
trong danh sách thì giải thuật sẽ phải tìm tất
cả các tên trong danh sách.
Thời gian thực thi của giải thuật tìm kiếm
tuần tự sẽ tăng tỷ lệ theo kích thước của
danh sách.
Chúng ta nói rằng “bậc tăng” của giải thuật
tìm kiếm tuần tự là n, ký hiệu là T(n). Chúng
ta cũng nói rằng một giải thuật mà bậc tăng
của nó giới hạn trong một yếu tố không đổi
12

Các Vấn Đề Cơ Sở của KHMT

ThS. GVC Tô Oai Hùng



Phân Tích Giải Thuật
nào đó có theta của n, ký hiệu Θ(n).
Lưu ý: T(n) là hàm theta của g(n): T(n) =
Θ(g(n)) nếu ∃ các hằng số dương c1, c2,
n0 sao cho với mọi n >= n0:
c1g(n) <= T(n) <= c2g(n)
1. Giải thuật tìm kiếm tuần tự ở trên có Θ(n).
Bởi vì, trong trường hợp trung bình và xấu
nhất, giải thuật thực hiện chậm tỷ lệ với
chiều dài n của danh sách.
2. Sắp xếp bằng phương pháp chèn trực tiếp
(insertion sort) - thời gian thực thi T(n) =
Θ(n2):
13
Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tơ Oai Hùng


Phân Tích Giải Thuật
Insertion_Sort(numList)
length ← length of numList
numIndex ← 2
while(numIndex <= length) {
newNum ← numList[numIndex]
sortedIndex ← numIndex - 1
while newNum < numList[sortedIndex]
AND sortedIndex > 0 {
numList[sortedIndex + 1] ←

numList[sortedIndex]
sortedIndex ← sortedIndex - 1
}
numList[sortedIndex + 1] = newNum
numIndex ← numIndex + 1
}
end
14
Các Vấn Đề Cơ Sở của KHMT

ThS. GVC Tô Oai Hùng






Phân Tích Giải Thuật
Để phân tích thời gian thực thi của giải thuật
sắp xếp bằng phương pháp chèn trực tiếp,
đầu tiên chúng ta lưu ý là thời gian thực thi
tỷ lệ với số phần tử cần sắp xếp n. Ngoài ra,
mỗi phần tử đang xét phải được so sánh một
hay nhiều lần với các phần tử đã được sắp.
Trong trường hợp tốt nhất, danh sách cần
sắp xếp đã có thứ tự rồi, khi này mỗi phần tử
chỉ so sánh một lần, vì thế trường hợp tốt
nhất của giải thuật là Θ(n).
Trong trường hợp xấu nhất, danh sách cần
sắp xếp có thứ tự ngược, khi này mỗi phần

tử đang xét sẽ so sánh với tất cả phần tử đã
15

Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tơ Oai Hùng


Phân Tích Giải Thuật




được sắp. Phần tử thứ 2 so sánh với phần
tử đầu, phần tử thứ 3 so sánh với phần tử
thứ 2 và phần tử đầu, … Ví dụ danh sách có
4 phần tử có thứ tự ngược, số lần so sánh
sẽ là 6. Nói chung, số lần so sánh trong
trường hợp xấu nhất của giải thuật này là
𝑛𝑛 𝑛𝑛 + 1
𝑛𝑛2 − 𝑛𝑛
− 𝑛𝑛 =
2
2
Khi n lớn thì n2 lớn hơn rất nhiều so với n, vì
vậy thời gian thực thi của giải thuật trong
trường hợp này là T(n) = Θ(n2).
Trong trường hợp trung bình, mỗi phần tử
đang xét sẽ so sánh với một nửa phần tử đã
16


Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tơ Oai Hùng


Phân Tích Giải Thuật
được sắp. Vì vậy, thời gian thực thi của giải
thuật trong trường hợp này cũng là T(n) =
Θ(n2).
3. Sắp xếp bằng phương pháp trộn (merge
sort) - thời gian thực thi T(n) = Θ(n log2n):
merge(listA, listB)
index ← 1
while listA is not empty
AND listB is not empty
if listA[1] < listB[1]
sortedList[index] ← listA[1]
discard listA[1]
17
Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tô Oai Hùng


Phân Tích Giải Thuật
else
sortedList[index] ← listB[1]
discard listB[1]
index ← index + 1

while listA is not empty
sortedList[index] ← listA[1]
discard listA[1]
index ← index + 1
while listB is not empty
sortedList[index] ← listB[1]
discard listB[1]
index ← index + 1
return sortedList
18

Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tô Oai Hùng






Phân Tích Giải Thuật
Trong hàm merge(), các phần tử được di
chuyển từ một trong hai danh sách ban đầu
là listA và listB vào danh sách kết quả
sortedList. Trong đó, tổng số phần tử di
chuyển bằng với tổng số phần tử của hai
danh sách ban đầu. Vì vậy, thời gian thực thi
của hàm merge() là Θ(nA + nB), với nA + nB
là tổng số phần tử của hai danh sách.
Giải thuật sắp xếp bằng phương pháp trộn

sẽ sử dụng hàm merge() ở trên để trộn hai
danh sách có thứ tự thành danh sách mới
cũng có thứ tự:
19
Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tơ Oai Hùng


Phân Tích Giải Thuật
merge_sort(numList)
length ← length of numList
if length > 1
listA ← first half of numList
listB ← second half of numList
resultA ← merge_sort(listA)
resultB ← merge_sort(listB)
sortedList ← merge(resultA,
resultB)
return sortedList
else
return numList
end
20
Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tơ Oai Hùng








Phân Tích Giải Thuật
Bài tập tại lớp: Hãy lấy ví dụ thực thi giải
thuật sắp xếp trộn bằng lời gọi hàm
merge_sort() với danh sách sau: numList
= {1, 6, 4, 2}.
Tổng thời gian thực thi T(n) của giải thuật
sắp xếp trộn gồm thời gian gọi đệ qui của
hai nửa danh sách và thời gian kết hợp
(trộn) các kết quả:
T(n) = 2T(n/2) + merge
Như chúng ta đã biết, thời gian thực thi hàm
merge() là nA + nB = n, nên:
T(n) = 2T(n/2) + n
21
Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tơ Oai Hùng


Phân Tích Giải Thuật



Từ cơng thức trên, chúng ta xây dựng hệ
thức truy hồi sau:




Giải hệ thức truy hồi trên, viết lại:
T(n) = n + 2T(n/2)
= n + 2[n/2 + 2T(n/4)]
= n + n + 4T(n/4)
= n + n + 4[n/4 + 2T(n/8)]
= n + n + n + 8T(n/8)
= 3n + 23T(n/23)
=…
22
Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tô Oai Hùng


Phân Tích Giải Thuật

Ở bước thứ i, ta có:
T(n) = in + 2iT(n/2i)
Quá trình tiếp tục cho đến khi gặp T(1). Tức
là n/2i = 1 → n = 2i → i = log2n. Khi này:
T(n) = nlog2n + 𝟐𝟐𝒍𝒍𝒍𝒍𝒍𝒍𝟐𝟐𝒏𝒏 T(1)
= nlog2n + nT(1)
= nlog2n + nΘ(1)
= nlog2n + Θ(n)
= Θ(nlog2n + n)
= Θ(max(nlog2n + n))
= Θ(nlog2n)
23

Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tơ Oai Hùng


Phân Tích Giải Thuật
4. Tìm kiếm nhị phân (binary search) - thời gian
thực thi T(n) = Θ(log2n):
• Trước đây, chúng ta đã xét giải thuật tìm
kiếm tuần tự, độ phức tạp của nó là Θ(n).
Nếu danh sách tìm kiếm đã có thứ tự, sử
dụng giải thuật tìm kiếm nhị phân sẽ hiệu
quả hơn.
• Thời gian tìm kiếm của giải thuật tìm kiếm
nhị phân là log2n. Nếu danh sách có
1.000.000 phần tử thì số lần tìm kiếm khơng
q 20 lần, trong khi giải thuật tìm kiếm tuần
tự có số lần tìm kiếm trung bình là 500.000
lần.
24

Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tơ Oai Hùng




Phân Tích Giải Thuật
Sau đây là mã giả của giải thuật tìm kiếm nhị

phân:
BinarySearch(list, searchItem)
begin ← 1
end ← length of list
matchFound ← false
while matchFound = false AND
begin <= end
midpoint ← (begin + end) / 2
if list[midpoint] = searchItem
matchFound = true
else if searchItem <
list[midpoint]
25
Các vấn Đề CSKH Của Máy Tính

Th.S GVC Tô Oai Hùng


×