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
pdf 8 trang Thùy Anh 14220 Free
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:

  • pdfbai_giang_cau_truc_du_lieu_va_thuat_toan_phan_1_gioi_thieu_v.pdf