Tải bản đầy đủ (.pptx) (31 trang)

Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Đỗ Ngọc Như Loan

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 (435.81 KB, 31 trang )

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?


×