Bài giảng Cấu trúc dữ liệu và thuật toán - Phần 1: Giới thiệu về thuật toán - Chương 1, Phần 2: Phân tích thuật toán - Nguyễn Duy Hiệp
1/10/2011
REVIEW
• Bài toán: Cho một tập các số nguyên S = {s1, s2, . . . , sn}, và
một giá trị đích T. Tìm một tập con của S sao cho tổng các số
trong tập con đó đúng bằng T.
Ví dụ, Tồn tại một tập con trong S = {1, 2, 5, 9, 10} mà tổng là
T = 22 nhưng lại không tồn tại với T = 23.
PHÂN TÍCH
THUẬT TOÁN
Tìm phản ví dụ cho các thuật toán sau
REVIEW
NÔI DUNG
• (a) Lần lượt chọn các phần tử trong S theo thứ tự từ trái qua
phải nếu chúng phù hợp (thuật toán first‐fit).
• Phân tích thuật toán
• Mô hình RAM
• Tốt nhất, tồi nhất, trung bình
• Ký hiệu O‐lớn
• Phân tích tiệm cận
• (b) Lần lượt chọn các phần tử trong S theo thứ tự từ nhỏ đến
lớn (thuật toán best‐fit).
• Tốc độ tăng và tính thống trị
• Một số tính chất của phân tích O‐lớn
• (c) Lần lượt chọn các phần tử trong S theo thứ tự từ lớn nhất
đến nhỏ nhất.
1
1/10/2011
PHÂN TÍCH THUẬT TOÁN?
PHÂN TÍCH THUẬT TOÁN?
Bài toán: tìm phần tử lớn nhất thứ k
• Đầu vào: Dãy số gồm n số nguyên ꢀꢁ, ꢀꢂ, . . , ꢀꢃ, và số nguyên k
(0< k ≤ n)
• Đánh giá hiệu quả của thuật toán mà không cần cài đặt.
• 2 mô hình :
• Mô hình RAM (Random Access Machine)
• Phân tích tiệm cận độ phức tạp trong trường hợp tồi nhất
• Đầu ra: Giá trị phần tử lớn nhất thứ k trong dãy.
Có 2 thuật toán A, B để giải bài toán.
Với n = 100,000, k=100
• Đánh giá thuật toán: dự đoán các tài nguyên mà thuật toán
cần.
• A cài đặt bằng C chạy mất 12 s
• B cài đặt bằng java chạy mất 19 s
Thuật toán A tốt hơn B ?
• Tài nguyên: Thời gian CPU, bộ nhớ, băng thông, phần cứng…
MÔ HÌNH RAM
TỐT NHẤT, TỒI NHẤT VÀ TRUNG BÌNH
• Thực hiện thuật toán trên một máy tính giả định gọi là Random
Access Machine hoặc RAM.
• Mỗi phép tính đơn giản (+, *, –, =, if, call) thực hiện trong 1 đơn vị
thời gian (hoặc 1 bước).
• Vòng lặp, hàm, thủ tục: là kết hợp của nhiều phép tính đơn lẻ
• Mỗi bước truy cập bộ nhớ mất 1 đơn vị thời gian
• Phân tích thuật toán
trong trường hợp
tổng quát, với một
đầu vào bất kỳ thỏa
mãn
• Luôn có đủ bộ nhớ cần thiết để thực hiện thuật toán
Phân tích trường
hợp: tốt nhất, tồi nhất
và trung bình
• Đánh giá thời gian thực hiện thuật toán bằng cách đếm số đơn
vị thời gian cần.
2
1/10/2011
TỐT NHẤT, TỒI NHẤT VÀ TRUNG BÌNH
KÝ HIÊU O LỚN
• Độ phức tạp trong trường hợp tồi nhất (worst‐case complexity):
Là số lượng bước lớn nhất thuật toán cần thực hiện với bất cứ
đầu vào kích thước n nào.
• Độ phức tạp trong trường hợp tốt nhất (best‐case complexity):
Là số lượng bước nhỏ nhất thuật toán cần thực hiện với bất cứ
đầu vào kích thước n nào.
• Khó xác định chính xác các hàm đánh giá độ phức tạp trong
trường hợp tốt nhất, tồi nhất, trung bình
• Có rất nhiều điểm lồi: thời gian thực hiện biến đổi trong một số trường
hợp đầu vào đặc biệt. VD tìm kiếm nhị phân nếu đầu vào ꢆ ꢈ 2ꢏ ꢋ 1
• Để chính xác thì cần phân tích rất tỉ mỉ.
ꢄꢅꢆꢇ ꢈ 120ꢆꢉ ꢊ 12.4ꢆꢂ ꢋ 43ꢆꢌꢍꢎꢆ ꢊ 9ꢆ
• Độ phức tạp trong trường hợp trung bình (average‐case
complexity): Là số lượng bước trung bình thuật toán cần thực
hiện trên tất cả các trường hợp đầu vào kích thước n.
• Ký hiệu O lớn: đơn giản phân tích, bỏ qua những thành phần
mà không ảnh hưởng đến khi so sánh các thuật toán
Trong phân tích O lớn ꢐ ꢆ ꢈ 2ꢆꢂ và ꢎ ꢆ ꢈ 3ꢆꢂ ꢊ 5ꢆ là tương đương
• Mỗi độ phức tạp là một hàm của thời gian và kích thước đầu vào
• Các ký hiệu tiệm cận ꢅꢑ, ꢒ, ꢓꢇ dùng để phân tích độ phức tạp
trong thực tế
ꢄꢅꢆꢇ ꢈ 120ꢆꢉ ꢊ 12.4ꢆꢂ ꢋ 43ꢆꢌꢍꢎꢆ ꢊ 9ꢆ
PHÂN TÍCH TIÊM CẬN
Cận trên, cận dưới để đánh giá
cho độ phức tạp của hàm
Định nghĩa O lớn chính thức:
• ꢐ ꢆ ꢈ ꢔꢅꢎꢅꢆꢇꢇ: nghĩa là ꢕ. ꢎ ꢆ là giới hạn trên của ꢐ ꢆ . Do vậy
tồn tại hằng số ꢕ sao cho ꢐ ꢆ ꢖ ꢕ. ꢎꢅꢆꢇ luôn đúng với mọi ꢆ ꢗ ꢆꢘ
• ꢐ ꢆ ꢈ Ωꢅꢎꢅꢆꢇꢇ: nghĩa là ꢕ. ꢎꢅꢆꢇ là giới hạn dưới của ꢐ ꢆ . Do vậy
tồn tại hằng số ꢕ sao cho ꢐ ꢆ ꢗ ꢕ. ꢎꢅꢆꢇ luôn đúng với mọi ꢆ ꢗ ꢆꢘ
• ꢐ ꢆ ꢈ Θꢅꢎꢅꢆꢇꢇ: nghĩa là ꢕꢁ. ꢎꢅꢆꢇ là giới hạn trên, và ꢕꢂ. ꢎꢅꢆꢇ là
giới hạn dưới của ꢐ ꢆ . Do vậy tồn tại hằng số ꢕꢁ và ꢕꢂ sao cho
ꢐ ꢆ ꢖ ꢕꢁ. ꢎꢅꢆꢇ và ꢐ ꢆ ꢗ ꢕꢂ. ꢎꢅꢆꢇ luôn đúng với mọi ꢆ ꢗ ꢆꢘ. Nói
cách khác ꢎꢅꢆꢇ là giới hạn chặt của ꢐꢅꢆꢇ
Với ꢕ, ꢕꢁ, ꢕꢂ là các hằng số dương không phụ thuộc vào ꢆ, và ꢆꢘ ꢙ 0
Ο lớn
Ω lớn
Θ lớn
3
1/10/2011
KÝ HIÊU O LỚN
OMEGA LỚN
• ꢚꢛꢚ ꢋ ꢜꢛ ꢊ ꢝ ꢈ ꢢꢅꢛꢚꢇ vì chọn ꢕ ꢈ 1.5 thì
1.5ꢆꢂ ꢡ 2ꢆꢂ ꢋ 4ꢆ ꢊ 5 khi ꢆ ꢙ 50
Ví dụ
• ꢚꢛꢚ ꢋ ꢜꢛ ꢊ ꢝ ꢈ ꢞꢅꢛꢚꢇ vì chọn ꢕ ꢈ 2 thì 2ꢆꢂ ꢙ 2ꢆꢂ ꢋ 4ꢆ ꢊ 5
• ꢚꢛꢚ ꢋ ꢜꢛ ꢊ ꢝ ꢠ ꢢꢅꢛꢟꢇ vì với bất kỳ giá trị ꢕ thì
cꢆꢉ ꢙ 2ꢆꢂ ꢋ 4ꢆ ꢊ 5 khi ꢆ đủ lớn (ꢆ ꢙ 100ꢕ nếu ꢕ ꢙ 1,
ꢆ ꢙ 10/ꢕ nếu ꢕ ꢡ 1)
• ꢚꢛꢚ ꢋ ꢜꢛ ꢊ ꢝ ꢈ ꢞꢅꢛꢟꢇ vì chọn ꢕ ꢈ 1 thì ꢆꢉ ꢙ 2ꢆꢂ ꢋ 4ꢆ ꢊ 5 khi
ꢆ ꢙ 1
• ꢚꢛꢚ ꢋ ꢜꢛ ꢊ ꢝ ꢈ ꢢꢅꢛꢇ vì với bất kỳ hằng số c nào thì
ꢕꢆ ꢡ 2ꢆꢂ ꢋ 4ꢆ ꢊ 5 khi ꢆ ꢙ 5ꢕ
• ꢚꢛꢚ ꢋ ꢜꢛ ꢊ ꢝ ꢠ ꢞꢅꢛꢇ vì với bất kỳ hằng số c nào thì
ꢕꢆ ꢡ 2ꢆꢂ ꢋ 4ꢆ ꢊ 5 khi ꢆ ꢙ ꢕ
THETA LỚN
VÍ DỤ
• ꢚꢛꢚ ꢋ ꢜꢛ ꢊ ꢝ ꢈ ꢣꢅꢛꢚꢇ vì cả Ο, Ω đều đúng
• ꢚꢛꢚ ꢋ ꢜꢛ ꢊ ꢝ ꢠ ꢣꢅꢛꢟꢇ vì chỉ Ο đúng
• ꢚꢛꢚ ꢋ ꢜꢛ ꢊ ꢝ ꢠ ꢣꢅꢛꢇ vì chỉ Ω đúng
Khẳng định sau đúng hay sai? Tại sao ?
• 2ꢃꢤꢉ ꢈ Θꢅ2ꢃꢇ
• 3ꢂꢃ ꢈ Θꢅ3ꢃꢇ
• ꢅꢥ ꢊ ꢦꢇꢂꢈ Οꢅꢥꢂ ꢊ ꢦꢂꢇ
Để chứng minh ꢐ ꢆ ꢈ Θꢅꢎꢅꢆꢇꢇ thì cần chỉ ra
• ꢐ ꢆ ꢈ Ο ꢎ ꢆ
• ꢐ ꢆ ꢈ Ωꢅꢎꢅꢆꢇꢇ
4
1/10/2011
TỐC ĐÔ TĂNG VÀ QUAN
HÊ THỐNG TRỊ
TỐC ĐÔ TĂNG VÀ QUAN HÊ THỐNG TRỊ
• O lớn nhóm các hàm thành các lớp hàm.
ꢆ ꢊ 4 và 100.3ꢆ ꢋ 3 là thuộc lớp hàm Θ ꢆ
• Hai hàm ꢐ, ꢎ thuộc hai lớp khác nhau có quan hệ theo các ký hiệu
tiệm cận Ω, Ο khác nhau
• Tốc độ tăng của một số hàm
thông dụng
• Các lớp hàm thông dụng:
• Hàm hằng ꢐ ꢆ ꢈ 1. Thời gian thực hiện là hằng số VD hàm tính tổng 2 số
• Hàm loga ꢐ ꢆ ꢈ ꢌꢍꢎꢆ. VD tìm kiếm nhị phân
• Hàm tuyến tính ꢐ ꢆ ꢈ ꢆ. VD Tìm giá trị lớn nhất trong dãy số
• Hàm siêu tuyến tính ꢐ ꢆ ꢈ ꢆꢌꢍꢎꢆ. VD QuickSort, MergeSort
• Hàm bậc hai ꢐ ꢆ ꢈ ꢆꢂ. VD Sắp xếp nổi bọt (bubble sort )
• Hàm bậc ba ꢐ ꢆ ꢈ ꢆꢉ.
• Hàm mũ ꢐ ꢆ ꢈ ꢕꢃ, ꢕ là hằng số >1.
• Hàm giai thừa ꢐ ꢆ ꢈ ꢆ!
TỐC ĐÔ TĂNG VÀ QUAN HÊ THỐNG TRỊ
CÁC PHÉP TÍNH VỚI O LỚN
• Quan hệ thống trị:
• Cộng hai hàm
ꢆ! ≫ ꢕꢃ ≫ ꢆꢉ ≫ ꢆꢂ ≫ ꢆlogꢆ ≫ ꢆ ≫ logꢆ ≫ 1
• Ο ꢐ ꢆ ꢊ Οꢅꢎꢅꢆꢇꢇ → Οꢅmax ꢐ ꢆ , ꢎꢅꢆꢇ ꢇ
• Ω ꢐ ꢆ ꢊ Ωꢅꢎꢅꢆꢇꢇ → Ωꢅmax ꢐ ꢆ , ꢎꢅꢆꢇ ꢇ
• Θ ꢐ ꢆ ꢊ Θꢅꢎꢅꢆꢇꢇ → Θꢅmax ꢐ ꢆ , ꢎꢅꢆꢇ ꢇ
• Giới hạn và quan hệ thống trị của các hàm
ꢨꢅꢃꢇ
• ꢐꢅꢆꢇ thống trị ꢎꢅꢆꢇ nếu ꢃli→mꢧ
ꢈ 0
ꢩꢅꢃꢇ
VD.
• Nhân hàm
ꢨꢅꢃꢇ
ꢩꢅꢃꢇ
ꢐ ꢆ ꢈ ꢆꢂ không thống trị ꢎ ꢆ ꢈ 3ꢆꢂ ꢊ 5 vì ꢃli→mꢧ
ꢈ 3
• Ο ꢕ ⋅ ꢐ ꢆ → Οꢅꢐꢅꢆꢇꢇ
• Ω ꢕ ⋅ ꢐ ꢆ → Ωꢅꢐꢅꢆꢇꢇ
• Θ ꢕ ⋅ ꢐ ꢆ → Θꢅꢐꢅꢆꢇꢇ
ꢨꢅꢃꢇ
ꢐ ꢆ ꢈ ꢆꢂ thống trị ꢎ ꢆ ꢈ ꢆꢁ.ꢪꢪꢪꢪꢪꢪ vì ꢃli→mꢧ
ꢈ 0
ꢩꢅꢃꢇ
ꢆ! ≫ ꢕꢃ ≫ ꢆꢉ ≫ ꢆꢂ ≫ ꢆꢁꢤꢫ ≫ ꢆlogꢆ ≫ ꢆ ≫ ꢆ ≫ logꢂꢆ
≫ logꢆ ≫ logꢆ/loglogꢆ ≫ loglogꢆ ≫ 1
ꢕ là một hằng số dương bất kỳ
5
1/10/2011
CÁC PHÉP TÍNH VỚI O LỚN
MỘT SỐ TÍNH CHẤT
• Nhân hai hàm
Tính truyền ứng – transitivity
• Nếu ꢐ ꢆ ꢈ Οꢅꢎꢅꢆꢇꢇ và ꢎ ꢆ ꢈ Οꢅꢬꢅꢆꢇꢇ thì ꢐ ꢆ ꢈ Οꢅꢬꢅꢆꢇꢇ
• Nếu ꢐ ꢆ ꢈ Ωꢅꢎꢅꢆꢇꢇ và ꢎ ꢆ ꢈ Ωꢅꢬꢅꢆꢇꢇ thì ꢐ ꢆ ꢈ Ωꢅꢬꢅꢆꢇꢇ
• Nếu ꢐ ꢆ ꢈ Θꢅꢎꢅꢆꢇꢇ và ꢎ ꢆ ꢈ Θꢅꢬꢅꢆꢇꢇ thì ꢐ ꢆ ꢈ Θꢅꢬꢅꢆꢇꢇ
• Ο ꢐ ꢆ ∗ Οꢅꢎꢅꢆꢇꢇ → Οꢅꢐ ꢆ ∗ ꢎꢅꢆꢇꢇ
• Ω ꢐ ꢆ ∗ Ωꢅꢎꢅꢆꢇꢇ → Ωꢅꢐ ꢆ ∗ ꢎꢅꢆꢇꢇ
• Θ ꢐ ꢆ ∗ Θꢅꢎꢅꢆꢇꢇ → Θꢅꢐ ꢆ ∗ ꢎꢅꢆꢇꢇ
Tính đối xứng – symmetry
• ꢐ ꢆ ꢈ Θꢅꢎꢅꢆꢇꢇ khi và chỉ khi ꢎꢅꢆꢇ ꢈ Θꢅꢐꢅꢆꢇꢇ
Tính đối xứng chuyển vị ‐ transpose symmetry
• ꢐ ꢆ ꢈ Οꢅꢎꢅꢆꢇꢇ khi và chỉ khi ꢎ ꢆ ꢈ Ωꢅꢐꢅꢆꢇꢇ
MỘT SỐ TÍNH CHẤT
MỘT SỐ VÍ DỤ
Thuật toán sắp xếp lựa chọn – Selection Sort
Chứng minh
Nếu ꢐ ꢆ ꢈ Οꢅꢎꢅꢆꢇꢇ và ꢎ ꢆ ꢈ Οꢅꢬꢅꢆꢇꢇ thì ꢐ ꢆ ꢈ Οꢅꢬꢅꢆꢇꢇ
selection_sort(int s[], int n)
{
Ta có
int i,j; /* counters */
int min; /* index of minimum */
for (i=0; i<n; i++) {
min=i;
for (j=i+1; j<n; j++)
if (s[j] < s[min]) min=j;
swap(&s[i],&s[min]);
}
• ꢐ ꢆ ꢈ Οꢅꢎꢅꢆꢇꢇ tức là ꢐꢅꢆꢇ ꢖ ꢕꢁꢎꢅꢆꢇ với ꢆ ꢙ ꢆꢁ
• ꢎ ꢆ ꢈ Οꢅꢬꢅꢆꢇꢇ tức là ꢎꢅꢆꢇ ꢖ ꢕꢂꢬꢅꢆꢇ với ꢆ ꢙ ꢆꢂ
Suy ra
• ꢐꢅꢆꢇ ꢖ ꢕꢁꢎꢅꢆꢇ ꢖ ꢕꢁꢕꢂꢬꢅꢆꢇ với ꢆ ꢙ maxꢅꢆꢁ, ꢆꢂꢇ
Chọn ꢕꢉ ꢈ ꢕꢁꢕꢂ và ꢆꢉ ꢈ maxꢅꢆꢁ, ꢆꢂꢇ thì ꢐꢅꢆꢇ ꢖ ꢕꢉꢬ ꢆ khi ꢆ ꢙ ꢆꢉ
Vậy ꢐ ꢆ ꢈ Οꢅꢬꢅꢆꢇꢇ
}
6
1/10/2011
MỘT SỐ VÍ DỤ
MỘT SỐ VÍ DỤ
• Lệnh được lặp lại nhiều nhất chính là lệnh if
• Phân tích chi tiết hơn
• ꢮ ꢈ 0 lệnh if lặp ꢆ ꢋ 2 lần (từ 1 tới n‐1)
• ꢮ ꢈ 1 lệnh if lặp ꢆ ꢋ 3 lần (từ 2 tới n‐1)
…
Phân tích trong trường hợp tồi nhất
• Vòng lặp ngoài lặp n lần (từ 0 tới n‐1)
• ꢮ ꢈ ꢆ ꢋ 2 lệnh if lặp 1 lần (từ n‐1 tới n‐1)
• ꢮ ꢈ ꢆ ꢋ 1 lệnh if lặp 0 lần
• Vòng lặp trong lặp n lần ứng với mỗi lần lặp của vòng ngoài
• Số lần lặp của if sẽ là
• Vậy số lượng bước (thời gian) cần thực hiện trong trường
hợp tồi nhất là ꢆ ꢭ ꢆ → Οꢅꢆꢂꢇ
ꢄ ꢆ ꢈ ꢆ ꢋ 2 ꢊ ꢆ ꢋ 3 ꢊ ⋯ ꢊ 1 ꢊ 0 ꢈ ꢅꢆ ꢋ 2ꢇꢅꢆ ꢋ 1ꢇ/2
• Vậy ꢄ ꢆ ꢈ Θꢅꢆꢂꢇ
MỘT SỐ VÍ DỤ
MỘT SỐ VÍ DỤ
• Sắp xếp chèn – Insertion Sort
for (i=1; i<n; i++) {
• Phân tích trong trường hợp tồi nhất
• ꢮ ꢈ 1 lệnh cơ sở lặp 1 lần
• ꢮ ꢈ 2 lệnh cơ sở lặp 2 lần
…
j=i;
while ((j>0) && (s[j] < s[j‐1])) {
swap(&s[j],&s[j‐1]);
• ꢮ ꢈ ꢆ ꢋ 2 lệnh cơ sở lặp ꢆ ꢋ 2 lần
• ꢮ ꢈ ꢆ ꢋ 1 lệnh cơ sở lặp ꢆ ꢋ 1 lần
j = j‐1;
}
}
• Số lần lặp của lệnh cơ sở sẽ là
ꢄ ꢆ ꢈ 1 ꢊ 2 ꢊ ⋯ ꢊ ꢆ ꢋ 2 ꢊ ꢆ ꢋ 1 ꢈ ꢆ ꢋ 1 ꢆ/2
• Vậy ꢄ ꢆ ꢈ Οꢅꢆꢂꢇ
• Lệnh được lặp nhiều nhất là 2 lệnh bên trong while : lệnh cơ sở
7
1/10/2011
Môt số công thức hay dùng
ꢯꢰ 1 ꢈ ꢱ ꢋ ꢀ ꢊ 1
∑
•
ꢃ
∑
∑
∑
•
•
•
ꢲꢳꢁ ꢮ ꢈ 1 ꢊ 2ꢊ. . ꢊꢆ ꢈ ꢃ ꢃꢤꢁ
ꢂ
ꢷ
ꢷ
ꢃ ꢤꢃꢶꢲ ꢤꢲ
ꢴ ꢈ
ꢂ
ꢃ
ꢃ
ꢲꢶꢁ
ꢵꢳꢁ
∑
∑
ꢵꢳꢲ ꢴ ꢈ ꢮ ꢊ ꢮ ꢊ 1 ꢊ. . ꢊꢆ ꢈ ꢲꢳꢁ ꢮ ꢋ
ꢸ
ꢷ
ꢂꢃ ꢤꢉꢃ ꢤꢃ
ꢹ
ꢃ
ꢂ
ꢲꢳꢁ ꢮ ꢈ 1ꢂ ꢊ 2ꢂ ꢊ 3ꢂꢊ. . ꢊꢆꢂ ꢈ
ꢺꢻꢼ
ꢰ
ꢶꢁ
• ꢀꢘ ꢊ ꢀꢁꢊ. . ꢊꢀꢃ
ꢈ
với ꢀ ꢠ 1
ꢰꢶꢁ
ꢁ
ꢧ
ꢲ
∑
∑
•
•
ꢲꢳꢘ ꢥ ꢈ ꢁꢶꢽ nếu ꢥ ꢡ 1
ꢺꢻꢼ
ꢾꢶꢁ
ꢺ
ꢃꢶꢁ ꢾ
ꢶꢃꢾ ꢤꢾ
ꢃ
ꢲꢳꢁ ꢮꢕꢲ ꢈ ꢕ ꢊ 2ꢕꢂꢊ. . ꢊꢆꢕꢃ
ꢈ
ꢷ
8
Bạn đang xem tài liệu "Bài giảng Cấu trúc dữ liệu và thuật toán - Phần 1: Giới thiệu về thuật toán - Chương 1, Phần 2: Phân tích thuật toán - Nguyễn Duy Hiệp", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
bai_giang_cau_truc_du_lieu_va_thuat_toan_phan_1_gioi_thieu_v.pdf

