Tổng quan về
Cấu trúc dữ liệu & Giải thuật
GV: Đỗ Ngọc Như Loan
Cấu trúc dữ liệu là gì?
Cấu trúc dữ liệu là cách tổ chức lưu trữ dữ liệu sao cho hiệu quả nhất
Thế nào là hiệu quả?
1. Chính xác
2. Dùng ít bộ nhớ
3. Khả năng tìm kiếm/truy xuất
4. Khả năng cập nhật, thêm (modification, insertion / deletion)
5. Đơn giản, dễ hiểu
Giải thuật là gì?
Thuật toán là một phương pháp bao gồm một dãy các bước tính tốn để
giải quyết một bài tốn. Thuật tốn có thể được diễn tả dưới ngơn ngữ tự
nhiên (tiếng Việt, tiếng Anh…), mã giả hay ngôn ngữ lập trình (C++,
Java…)
Thế nào là một thuật tốn tốt?
1. Đúng đắn
2. Nhanh
3. Ít bộ nhớ
4. Đơn giản, dễ hiểu
Ví dụ
Tìm x trong dãy a1, a2, ...., an
Input: Số x, dãy n số a1, a2, ..., an
Output: Một giá trị logic true hoặc false
Search(x, a, n)
for i 1 to n
do if ai = x
then return true
return false
Một vấn đề có thể được giải quyết bẳng nhiều thuật toán
khác nhau
Ví dụ
Tính tổng các số nguyên từ 1 đến n.
Input: n (n >1)
Output: Tổng các số nguyên từ 1 đến n
Cách 1
sum = 0;
for (int i = 1; i <= n; i++)
sum = sum + i;
Cách 2
sum = n*(n+1)/2;
Cách 1
Độ phức tạp O(n)
sum = 0;
for (int i = 1; i <= n; i++)
sum = sum + i;
Cách 2
sum = n*(n+1)/2;
Độ phức tạp O(1)
ĐỘ PHỨC TẠP THUẬT TOÁN
Độ phức tạp của giải thuật là chi phí về tài nguyên của hệ thống (chủ
yếu là thời gian, bộ nhớ, CPU, đường truyền) cần thiết để thực hiện giải
thuật
Độ phức tạp về không gian (dung lượng bộ nhớ sử dụng)
Độ phức tạp về thời gian
Phân tích giải thuật (Analyzing of Algorithm) là q trình tìm ra những
đánh giá về tài nguyên cần thiết để thực hiện giải thuật
ĐỘ PHỨC TẠP THUẬT TOÁN
Độ phức tạp về thời gian của giải thuật:
• Được qui về đếm số lệnh cần thực thi của giải thuật
• Đó là một hàm T(n) phụ thuộc vào kích thước n của input
• Coi như có một máy trừu tượng (abstract machine) để thực hiện giải
thuật
ĐỘ PHỨC TẠP THUẬT TỐN
• Thời gian tối thiểu để thực hiện giải thuật với kích thước đầu vào n gọi
là thời gian chạy tốt nhất (best-case) của giải thuật
• Thời gian nhiều nhất để thực hiện giải thuật với kích thước đầu vào n
được gọi là thời gian chạy xấu nhất (worst-case) của giải thuật
• Thời gian trung bình để thực hiện giải thuật với kích thước đầu vào n
được gọi là thời gian chạy trung bình (average case) của giải
thuật
Ví dụ
Đánh giá độ phức tạp về thời gian của giải thuật
Search(x, a, n)
for i 1 to n
do if ai = x
then return true
return false
dssdsdsssssssssssslkcddkcf;dxkac
BIỂU DIỄN THỜI GIAN CHẠY BỞI KÝ HIỆU O
Giả sử f(n) và g(n) là hàm thực không âm của đối số nguyên dương n,
ta nói f(n) = O(g(n))
nếu có hằng số c > 0 và số nguyên dương N sao cho f(n) <= cg(n), với mọi n >=
N
Nếu giải thuật có thời gian chạy tốt nhất (trung bình, xấu nhất) là T(n) và T(n) =
O(g(n)) thì ta nói độ phức tạp của giải thuật trong trường hợp tốt nhất (trung
bình, xấu nhất) là O(g(n))
Ví dụ:
3
2
Giả sử f(n) = 5n + 2n + 13n + 6 , ta có:
3
2
3
3
3
3
3
f(n) = 5n + 2n + 13n + 6 <= 5n + 2n + 13n + 6n = 26n (với mọi
n>=1)
3
f(n) = O(n )
Tổng quát nếu f(n) là một đa thức bậc k của n:
k
k-1
k
f(n) = akn + ak-1n
+ ... + a1n + a0 thì f(n) = O(n )
Quy Tắc
QUY TẮC CỘNG: Nếu đoạn chương trình P1 có thời gian thực hiện
T1(n) = O(f(n)) và đoạn chương trình P2 có thời gian thực hiện là T2(n)
= O(g(n)) thì thời gian thực hiện P1 rồi đến P2 tiếp theo sẽ là: T1(n) +
T2(n) = O(f(n) + g(n))
QUY TẮC NHÂN: Nếu đoạn chương trình P có thời gian thực hiện là
T(n) = O(f(n)). Khi đó, nếu thực hiện k(n) lần đoạn chương trình P với
k(n) = O(g(n)) thì độ phức tạp tính tốn sẽ là O(g(n). f(n))
QUY TẮC MAX: Nếu đoạn chương trình P có thời gian thực hiện T(n)
= O(f(n) + g(n)) thì có thể coi đoạn chương trình đó có độ phức tạp
tính tốn O(max(f(n),g(n))).
Độ phức tạp (tăng dần)
• O(1) Hằng số
• O(log2n) Logarithm
• O(n) Tuyến tính
• O(nlog2n) n log n
2
• O(n ) Bậc hai
3
• O(n ) Bậc ba
m
• O(n ) Đa thức
n
• O(m ), m >= 2 Hàm mũ
• O(n!) Giai thừa
VÍ DỤ
Viết và phân tích giải thuật tính giai thừa của số tự nhiên n.
VÍ DỤ
Factorial(n)
if n = 0 or n = 1
then return 1
else if n > 1
then return n*Factorial(n-1)
VÍ DỤ
Gọi T(n) là thời gian chạy của thuật giải
O(1), n=0, 1
T(n)=
T(n-1)+O(1), n>1
T(n)
= T(n-1) + c
= T(n-2)+c +c =T(n-2) + 2c
= T(n-3)+c + 2c = T(n-3) + 3c
….
= T(n-(n-1)) + (n-1)c = T(1) + (n-1)c = c +
T(n) = O(n) (tương đương với giải thuật không đệ qui)
(n-1)c = nc
Luyện tập 1
for (i = 0 ; i < n ; i++)
if (A[i] % 2 == 0)
return true;
return false;
Độ phức tạp?
Luyện tập 2
sum = 0;
for (i = 0 ; i < 20 ; i++)
sum = sum + i;
Độ phức tạp?