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

CẤU TRÚC DỮ LIỆU & GIẢI THUẬT docx

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 (99.19 KB, 21 trang )

Bài giảng Cấu trúc dữ liệu
1
CẤU TRÚC DỮ LIỆU
& GIẢI THUẬT
Lê Thị Diễm
Bộ môn Tin học ứng dụng
Chương 1: Mở đầu
2
Chương 1
Mở đầu
Chương 1: Mở đầu
3
NỘI DUNG
• Tiếp cận từ bài toán đến chương trình
• Kiểu dữ liệu (Data Type)
• Kiểu dữ liệu trừu tượng (Abstract Data Type)
• Cấu trúc dữ liệu (Data Structure)
• Đánh giá độ phức tạp của giải thuật
Chương 1: Mở đầu
4
Từ bài toán đến chương trình
• Mô hình hóa bài toán thực tế thành bài toán giải
quyết trên máy tính
 xây dựng cấu trúc dữ liệu (CTDL)
• Xác định các thao tác xử lý  xây dựng giải thuật
• Ngôn ngữ giả và tinh chế từng bước (Pseudo
language and stepwise refinement)
• Cài đặt chương trình giải quyết bài toán
Chương 1: Mở đầu
5
Giải thuật (GT)


• Là 1 chuỗi hữu hạn các thao tác để giải 1 bài toán
nào đó
• Các tính chất quan trọng của giải thuật là:
– Hữu hạn (finiteness): giải thuật phải luôn luôn kết
thúc sau một số hữu hạn bước.
– Xác định (definiteness): mỗi bước của GT phải được xác
định rõ ràng và phải được thực hiện chính xác, nhất quán.
– Hiệu quả (effectiveness): các thao tác trong GT phải
được thực hiện trong một lượng thời gian hữu hạn
(đơn giản, dễ hiểu, dễ lập trình, thực hiện nhanh).
Chương 1: Mở đầu
6
Kiểu dữ liệu (Data Type)
• Khái niệm: là một tập hợp các giá trị và một
tập hợp các phép toán trên các giá trị đó
– Ví dụ: kiểu int là tập hợp các số nguyên có giá
trị -32768  32767 cùng các phép toán cộng,
trừ, nhân, chia, %,
• Các thuộc tính: tên kiểu dữ liệu, miền giá trị,
kích thước lưu trữ, tập các toán tử tác động lên
kiểu DL
Chương 1: Mở đầu
7
Kiểu dữ liệu trừu tượng
(ADT: Abstract Data Type)
• là một mô hình toán học cùng với một tập hợp các
phép toán trên nó
• là kiểu dữ liệu do ta định nghĩa ở mức khái niệm,
chưa được cài đặt cụ thể bằng một ngôn ngữ lập
trình

 Che lấp những chi tiết phức tạp trong chương trình
Chương 1: Mở đầu
8
Cấu trúc dữ liệu (Data Structure)
• Khi cài đặt một ADT, ta dùng
– các CTDL phù hợp có trong ngôn ngữ lập trình, hoặc
– cấu trúc phức hợp được xây dựng lên từ các kiểu cơ bản của
ngôn ngữ lập trình
• Cấu trúc dữ liệu = cách thức tổ chức dữ liệu
• Cấu trúc dữ liệu + Giải thuật = Chương trình
Chương 1: Mở đầu
9
Các tiêu chuẩn đánh giá CTDL
• Phản ánh đúng thực tế
– Là tiêu chuẩn quan trọng
– Quyết định tính đúng đắn của bài toán
– Phải chọn CTDL lưu trữ thể hiện chính xác đối tượng
thực tế.
Chương 1: Mở đầu
10
Các tiêu chuẩn đánh giá CTDL
• Phù hợp với các thao tác
– Cần chú ý đến thao tác nào được sử dụng nhiều nhất
để lựa chọn CTDL cho phù hợp
– Làm tăng tính hiệu quả: các thuật toán đơn giản, tự
nhiên, đạt hiệu quả cao về tốc độ
• Tiết kiệm tài nguyên hệ thống
– chỉ nên sử dụng tài nguyên hệ thống vừa đủ để đảm
nhiệm chức năng của nó.
Chương 1: Mở đầu

11
Đánh giá độ phức tạp GT (1)
• Tại sao phải phân tích đánh giá giải thuật?
– Có nhiều giải thuật khác nhau để giải quyết 1 bài toán
=> lựa chọn 1 giải thuật tốt (nhất).
• Đánh giá giải thuật =>chi phí cần dùng để thực
hiện nó thông qua việc sử dụng tài nguyên
– tài nguyên: bộ nhớ, thời gian sử dụng CPU,…
– thông thường nhất là thời gian cần thiểt để giải quyết
vấn đề (thời gian thực hiện chương trình).
Chương 1: Mở đầu
12
Đánh giá độ phức tạp GT (2)
• Các vấn đề chúng ta giải quyết có kích thước tự
nhiên n (thường là số lượng dữ liệu được xử lý),
• Tài nguyên cần dùng được mô tả như 1 hàm số
theo n (T(n)).
– Nghĩa là: Thời gian thực hiện của chương trình là 1
hàm của kích thước dữ liệu vào ký hiệu T(n) trong đó n
là kích thước (độ lớn) của dữ liệu vào.
• T(n) ≥ 0 ∀ n ≥ 0
Chương 1: Mở đầu
13
Đánh giá độ phức tạp GT (3)
• Có thể đánh giá giải thuật bằng phương pháp thực
nghiệm thông qua việc cài đặt giải thuật, rồi chọn
các bộ dữ liệu thử nghiệm
– nhược điểm: chịu sự hạn chế của ngôn ngữ lập trình cài
đặt, trình độ của người lập trình, khó khăn và tốn chi
phí trong việc chọn các bộ dữ liệu thử đặc trưng,…

• Tìm những phương pháp đánh giá giải thuật hình
thức hơn, ít phụ thuộc môi trường cũng như phần
cứng hơn
Chương 1: Mở đầu
14
Đánh giá độ phức tạp GT (4)
– Phương pháp đánh giá giải thuật theo hướng xấp xỉ
tiệm cận qua các khái niệm toán học O (Big-O), Ω
(Big-Omega), Θ (Big-Theta),…
– Thường sử dụng Big-O
• Tỷ suất tăng của hàm
– Hàm không âm T(n) có tỷ suất tăng f(n) nếu tồn tại
hằng số C và N
0
sao cho T(n) <= C.f(n)
với mọi n>= N
0
– Qui tắc vận dụng: Nếu T(n) là một đa thức của n thì tỷ
suất tăng của T(n) là n với số mũ cao nhất
Chương 1: Mở đầu
15
Đánh giá độ phức tạp GT (5)
• Ta gọi tỷ suất tăng của hàm thời gian là độ phức
tạp thời gian của GT (độ phức tạp của thuật toán).
• Cho thuật toán A, có thời gian thực hiện là T(n),
nếu T(n) có tỷ suất tăng là f(n) thì ta nói thuật
toán A có độ phức tạp là f(n) và ký hiệu T(n) là
O(f(n)) (đọc là “ô lớn của f(n)”) và viết
T(n)=O(f(n))
• Hay: Độ phức tạp của GT là 1 hàm chặn trên của

hàm thời gian
Chương 1: Mở đầu
16
Cách tính độ phức tạp GT (1)
• Qui tắc cộng: Nếu
– T1(n): thời gian thực hiện đoạn chương trình P1
– T2(n): thời gian thực hiện đoạn chương trình P2
– Và T1(n) = O(f(n)), T2(n) = O(g(n)),
thì độ phức tạp của đoạn 2 chương trình đó nối tiếp
nhau là T(n) = O( max(f(n), g(n)))
Chương 1: Mở đầu
17
Cách tính độ phức tạp GT (2)
• Qui tắc nhân: Nếu
– T1(n): thời gian thực hiện đoạn chương trình P1
– T2(n): thời gian thực hiện đoạn chương trình P2
– Và T1(n) = O(f(n)), T2(n) = O(g(n)),
thì độ phức tạp của đoạn 2 chương trình đó lồng
nhau là T(n) = O(f(n).g(n))
• Qui tắc tổng quát để phân tích 1 chương trình
Chương 1: Mở đầu
18
Cách tính độ phức tạp GT (3)
• Câu lệnh đơn: các câu lệnh đơn như gán, đọc,
viết, so sánh, lệnh return, định trị các biểu thức
(không gọi hàm),… có thời gian thực hiện là O(1)
• Lệnh rẽ nhánh: if <điều kiện> P1; else P2;
– tính thời gian thực hiện là O(max (f1(n), f2(n))) và độ
phức tạp của thời gian kiểm tra điều kiện. Thông
thường kiểm tra điều kiện tốn O(1).

• Lệnh vòng lặp
– Xác định thời gian thực hiện của vòng lặp, sau đó lấy
tỷ suất tăng của hàm thời gian này.
Chương 1: Mở đầu
19
Cách tính độ phức tạp GT (4)
– Thời gian thực hiện vòng lặp là tổng (trên tất cả các
lần lặp) thời gian thực hiện thân vòng lặp
– Nếu thời gian thực hiện thân vòng lặp không đổi thì
thời gian thực hiện vòng lặp là tích của số lần lặp với
thời gian thực hiện thân vòng lặp
• Ví dụ: Tính
e
x
=
1 + x/1! + x
2
/2! + x
3
/3! + … + x
n
/n!
• Độ phức tạp của chương trình có gọi chương
trình con: không gọi đệ qui, đệ qui (tham khảo).
Chương 1: Mở đầu
20
Cách tính độ phức tạp GT (5)
float e_mu_x(int n, float x){
float ex = 1, lt, gt;
for(int i = 1; i <= n; i++){

lt = 1; gt=1;
for(int j = 1;j<=i;j++){
lt=lt*x;
gt=gt*j;
}
ex = ex+lt/gt;
} return ex;
}
float e_mu_x2(int n, float x){
float ex = 1, lt=1, gt=1;
for(int i = 1; i <= n; i++){
lt=lt*x;
gt=gt*i;
ex = ex+lt/gt;
}
return ex;
}
Chương 1: Mở đầu
21
Cách tính độ phức tạp GT (6)
• Thời gian chạy của
nhiều thuật toán tiệm
cận tới một trong các
hàm sau:
– Hằng số
– Log n: thời gian chạy
chương trình tiến chậm
khi n lớn dần
– n: thời gian chạy tuyến
tính

– nlogn: thời gian chạy
tăng dần lên cho các
bài toán bằng cách tách
nó thành các bài toán
con nhỏ hơn, sau đó
tổng hợp lại.
– n
2
– n
3
– 2
n
– n!

×