Professional Documents
Culture Documents
Bai 1 - ĐCCTDL>
Bai 1 - ĐCCTDL>
BÀI 1:
ĐẠI CƯƠNG VỀ CẤU TRÚC
DỮ LIỆU VÀ GIẢI THUẬT
I - MỤC TIÊU BÀI HỌC
Slide 2
II - KHÁI QUÁT NỘI DUNG BÀI HỌC
Slide 3
1.1. Khái niệm về giải thuật, mối liên hệ giữa
CTDL và GT
Giải bài toán bằng máy tính:
4
1.1. Khái niệm về giải thuật, mối liên hệ giữa
CTDL và GT
5
1.1. Khái niệm về giải thuật, mối liên hệ giữa
CTDL và GT
6
Mối quan hệ giữa cấu trúc dữ liệu và giải
thuật
North Wirth say that:
Cấu trúc dữ liệu + Giải thuật = Chương trình
- Để xây dựng giải thuật phù hợp phải xác định nó tác động
trên các kiểu dữ liệu nào.
Ví dụ: Làm nhuyễn các hạt đậu xay chứ không băm
- Khi chọn lựa cấu trúc dữ liệu cần phải hiểu rõ những thao
tác (giải thuật) sẽ tác động lên nó.
Ví dụ: Điểm của sinh viên dùng số không dùng chữ
- Cấu trúc dữ liệu thay đổi giải thuật thay đổi theo
Cấu trúc dữ liệu (data structure)
- Dữ liệu (data): Là các đối tượng mà thuật toán sẽ sử dụng để đạt
được kết quả mong muốn. Nó cũng được dùng để biểu diễn cho
các thông tin của bài boán như: các thông tin vào, thông tin ra (kết
quả) và các các thông tin trung gian nếu cần.
- Cấu trúc dữ liệu (data structure): Là một phương thức cụ thể để
lưu trữ và tổ chức dữ liệu trong máy tính để việc xử lý sao cho
hiệu quả nhất. Nó dùng để biểu diễn cho các thông tin có cấu trúc
của bài toán. Cấu trúc dữ liệu thể hiện khía cạnh logic của dữ liệu.
Chú ý: Các dữ liệu không có cấu trúc được gọi là các dữ liệu vô
hướng hay các dữ liệu đơn giản. VD: các kiểu dữ liệu số nguyên
(integer), số thực (real), logic (boolean) là các kiểu dữ liệu đơn
giản.
Ví dụ
Một chương trình quản lý điểm thi của sinh viên cần
lưu trữ các điểm số của 3 sinh viên. Do mỗi sinh viên
có 4 điểm số ứng với 4 môn học khác nhau nên dữ
liệu có dạng bảng như sau:
5 6 7 0 6 5 8 8 5 5 9 7
12
1.1. Khái niệm về giải thuật, mối liên hệ giữa
CTDL và GT
- Các tiêu chuẩn khi lựa chọn cấu trúc dữ liệu
+ Cấu trúc dữ liệu trước hết phải biểu diễn được đầy đủ các thông
tin nhập và xuất của bài toán (Phản ánh đúng thực tế).
+ Cấu trúc dữ liệu phải phù hợp với các thao tác của thuật toán mà
ta lựa chọn để giải quyết bài toán.
+ Cấu trúc dữ liệu phải cài đặt được trên máy tính với ngôn ngữ
lập trình đang sử dụng.
+ Tiết kiệm tài nguyên hệ thống.
Đối với một số bài toán, trước khi tổ chức dữ liệu ta phải viết một
đoạn chương trình nhỏ để khảo sát xem dữ liệu cần lưu trữ lớn tới
mức độ nào.
1.1. Khái niệm về giải thuật, mối liên hệ giữa
CTDL và GT
- Vai trò của CTDL
+ CTDL đóng vai trò quan trọng trong việc kết hợp thuật toán
(thuật giải hay giải thuật) để đưa ra cách giải quyết bài toán.
+ CTDL hỗ trợ cho các thuật toán thao tác trên đối tượng được
hiệu quả hơn.
1.1. Khái niệm về giải thuật, mối liên hệ giữa
CTDL và GT
- Các bước xây dựng một CTDL:
Bước 1: xác định đầy đủ các đặc trưng của CTDL gồm:
+ Các thành phần DL có trong CTDL đó,
+ Các liên kết (quan hệ) về cấu trúc giữa các thành phần DL.
Bước 2: xác định các thao tác cơ bản trên CTDL: là các thao tác cơ bản, cần
thiết nhất để có thể sử dụng được CTDL này.
Bước 3: xác định cấu trúc lưu trữ thích hợp để tổ chức lưu trữ CTDL một
cách có hiệu quả. Tính hiệu quả thể hiện ở cả hai mặt: kích thước lưu trữ
nhỏ nhất và tốc độ thực hiện các thao tác là nhanh nhất.
Bước 4: Cài đặt các thao tác cơ bản. Việc cài đặt các thao tác phải theo một
số nguyên tắc sau:
+ Thao tác có khả năng sử dụng lại nhiều lần: sử dụng chương trình con để
cài đặt.
+ Thao tác có tính độc lập về mặt sử dụng và độc lập với các thao tác khác.
Để đảm bảo tính chất này thì ta phải chọn các tham số hợp lí cho các thao
tác.
+ Thao tác phải hiệu quả.
1.1. Khái niệm về giải thuật, mối liên hệ giữa
CTDL và GT
- Giải thuật (thuật giải hoặc thuật toán): Là một dãy hữu
hạn các thao tác đơn giản được sắp xếp theo một trình tự xác
định sao cho sau khi thực hiện dãy thao tác đó, từ Input của
bài toán, ta nhận được Output cần tìm.
- Một số yêu cầu của giải thuật:
+ Đúng đắn.
+ Rõ ràng (không nhập nhằng).
+ Phải kết thúc sau một số hữu hạn bước thực hiện.
+ Có mô tả các đối tượng dữ liệu mà thuật toán sẽ thao tác
như dữ liệu vào (nguồn), dữ liệu ra (đích) và các dữ liệu
trung gian.
+ Thời gian thực hiện phải hợp lý.
1.1. Khái niệm về giải thuật, mối liên hệ giữa
CTDL và GT
- Các tiêu chí đánh giá giải thuật:
+ Đơn giản, dễ hiểu
+ Dễ cài đặt
+ Cần ít bộ nhớ
+ Chạy nhanh
Sự cần thiết của giải thuật
• Tại sao sử dụng máy tính để xử lý dữ liệu?
Nhanh hơn.
Nhiều hơn.
Giải quyết những bài toán mà con người không thể hoàn
thành được.
• Làm sao đạt được những mục tiêu đó?
Nhờ vào sự tiến bộ của kỹ thuật: tăng cấu hình máy chi
phí cao
Nhờ vào các thuật toán hiệu quả: thông minh và chi phí thấp
“Một máy tính siêu hạng vẫn không thể cứu vãn một thuật
toán tồi!”
1.1. Khái niệm về giải thuật, mối liên hệ giữa
CTDL và GT
b. Các đặc trưng của giải thuật:
- Tính xác định: mỗi bước của thuật toán các thao tác phải hết sức rõ ràng
- Tính hữu hạn dừng: giải thuật bao giờ cũng phải dừng sau một số hữu
hạn bước
- Tính đúng đắn: sau khi thực hiện tất cả các thao tác của thuật toán ta
phải được kết quả mong muốn
- Tính phổ dụng: có thể giải bất kỳ bài toán nào trong cùng một lớp các
bài toán
19
1.1. Khái niệm về giải thuật, mối liên hệ giữa
CTDL và GT
- Tính có đại lượng vào và đại lượng ra: khi giải thuật bắt đầu bao giờ cũng
nhận các đại lượng vào (input: dữ liệu vào) và sau khi kết thúc một thuật
toán bao giờ cũng đưa ra một số đại lượng kết quả theo yêu cầu (output:
dữ liệu ra).
- Tính hiệu quả: hiệu quả của một giải thuật được đánh giá dựa trên các tiêu
chuẩn:
+ Dung lượng bộ nhớ cần có
+ Số các phép tính cần thực hiện
+ Thời gian cần thiết để chạy
+ Có dễ hiểu không
+ Có dễ cài đặt trên máy không
20
1.2. Cấu trúc dữ liệu và các vấn đề liên quan
21
1.3. Ngôn ngữ diễn đạt giải thuật
22
Mô tả bằng Ngôn ngữ (NN) tự nhiên
• NN tự nhiên thông qua các bước được tuần tự liệt kê để biễu
diễn thuật toán.
• Ưu điểm:
Đơn giản, không cần kiến thức về cách biểu diễn (mã giả,
lưu đồ,...)
• Nhược điểm:
Dài dòng, không cấu trúc.
Đôi lúc khó hiểu, không diễn đạt được thuật toán.
Mô tả bằng Lưu đồ
A A
Đúng
B Begin
End
Sai
amax < ai Đ
amax =ai
S
i = i+1
Bài Tập
• Vẽ lưu đồ và viết chương trình
1. Viết chương trình nhập vào hai số nguyên dương a và b.
Tìm ước số chung lớn nhất và bộI số chung nhỏ nhất của a
và b.
2. Nhập vào ngày, tháng, năm. Kiểm tra xem ngày, tháng,
năm đó có hợp lệ hay không? In kết quả ra màn hình.
3. Viết chương trình nhập số nguyên dương n. Kiểm tra số
đó có phải số nguyên tố hay không?
4. Một số hoàn thiện là một số có tổng các ước số của nó
(không kể nó) bằng chính nó. Hãy liệt kê các số hoàn thiện
nhỏ hơn 5000.
Mô tả bằng Mã giả
• Ưu điểm:
• Nhược điểm:
amax :=a0;
i :=1;
while (i<n) do
Begin
if (amax< ai) then amax := ai;
i := i+1;
End;
Mô tả bằng Ngôn ngữ lập trình
• Kỹ năng lập trình đòi hỏi cần học tập và thực hành
(nhiều).
• Với một vấn đề đặt ra, làm thế nào để đưa ra thuật toán
giải quyết nó?
• Chiến lược thiết kế:
• Chia-để-trị (divide-and-conquer)
• Quy hoạch động (dynamic programming)
• Quay lui (backtracking)
• Tham lam (greedy method)
1.4. Thiết kế giải thuật
• Ví dụ: Bài toán sắp xếp một dãy n số, theo thư tự tăng dần
• Chọn số bé nhất trong n số để vào vị trí thứ 1
• Chọn số bé nhất trong n-1 số còn lại để vào vị trí thứ 2
• …………………
• Chọn số bé nhất trong 2 số còn lại để vào vị trí thứ n-1
1.4. Thiết kế giải thuật
• Ví dụ 3 (tt)
• Tinh chỉnh 1
• x = 10…99
• x’ = 10*donvi(x)+chuc(x)
• (x,x’)=1 USCLN(x,x’)=1
• Tinh chỉnh 2
• x chạy từ 10 đến 99
• y=10*donvi(x)+chuc(x)
• nếu USCLN(x,y)=1 thì Xuất(x)
Thiết kế giải thuật (tt)
• Khi một giải thuật được xây dựng, hàng loạt yêu cầu đặt
ra
• Yêu cầu về tính đúng đắn của giải thuật
• Tính đơn giản của giải thuật.
• Yêu cầu về không gian :
• Yêu cầu về thời gian :
Thiết kế giải thuật (tt)
• Thời gian thực hiện giải thuật phụ thuộc vào các
yếu tố sau:
• Dữ liệu vào
• Tốc độ thực hiện các phép toán của máy
tính (phần cứng máy tính)
• Trình biên dịch
1.5. Phân tích độ phức tạp của giải thuật
f(n) = 2n + 6
• Ví dụ : c g(n) = 4n
f(n) = 2n+6,
g(n) = n và c = 4 , n0=3
• f(n)= O(n)
g(n) = n
N0 = 3
n
Ký pháp để đánh giá độ phức tạp tính
toán của giải thuật
• Định nghĩa Ω:
- f(n) = Ω(g(n)), nếu tồn tại các hằng số dương c và no
sao cho f(n) ≥ cg(n) khi n ≥ no
- f(n) = Ω(g(n)) g(n) = Ο(f(n))
• Định nghĩa
f(n) = (g(n)), nếu tồn tại các hằng số dương c1, c2 và n0
sao cho c1.g(n) f(n) c2. g(n) với mọi n> n0
Ký pháp để đánh giá độ phức tạp tính
toán của giải thuật
f ( n ) O ( g ( n )) f ( n ) ( g ( n ))
cg(n) f(n)
f(n)
cg(n)
n0 n0
Ký pháp để đánh giá độ phức tạp tính
toán của giải thuật
f ( n ) ( g ( n ))
c2g(n)
f(n)
c1g(n)
n0
Ký pháp để đánh giá độ phức tạp tính
toán của giải thuật
• Ta nói độ phức tạp tính toán của giải thuật có cấp f(n)
nếu thỏa :
• T(n) = O(f(n)), và
• Nếu g(n), mà T(n) = O(g(n)) thì f(n) = O(g(n)).
Một số qui tắc về ký hiệu O lớn
• f = O(f)
• f = O(g) và g = O(h) thì f = O(h)
• f = O(g) và h=O(r) thì fh = O(gr)
• f =O(g) và h=O(r) thì f+h = O(g+r)
• f =O(g) thì af = O(g) với mọi a>0.
• O(c)=O(1) , c là hằng số
Một số qui tắc về ký hiệu O lớn
• Ví dụ:
• 2n là O(n)
• 3n + 5 là O(n) thay vì 3n + 5 là O(3n)
• 4n2 + 5n + 7 la O(?)
Xác định độ phức tạp tính toán
• T1(n) và T2(n) là thời gian thực hiện của hai giai đoạn chương
trình P1 và P2 mà T1(n) = O(f(n)); T2(n) = O(g(n))
• Qui tắc tổng:
• Thời gian thực hiện đoạn P1 rồi P2 tiếp theo sẽ là T1(n) + T2(n)
= O(max(f(n),g(n))).
• Qui tắc nhân:
• Thời gian thực hiện P1 và P2 lồng nhau sẽ là : T1(n)T2(n) =
O(f(n)*g(n))
Các qui tắc tổng quát
• Câu lệnh switch được đánh giá tương tự như lệnh if-
else.
• Các lệnh lặp: for, while, do-while
• Cần đánh giá số tối đa các lần lặp, giả sử đó là L(n)
• Tiếp theo đánh giá thời gian chạy của mỗi lần lặp là
Ti(n), (i=1,2,..., L(n))
• Mỗi lần lặp, chi phí kiểm tra điều kiện lặp,là T0(n).
• Chí phí lệnh lặp là:
L(n)
T n T n
i 1
0 i
Một số ví dụ
• Ví dụ 1. Mảng A các số thực, cỡ n, cần tìm xem mảng có
chứa số thực x không.
(1) i = 0;
(2) while (i < n && x != A[i])
(3) i++;
Một số ví dụ
if (thisSum>maxSum)
maxSum=thisSum;
}
return maxSum;
Một số ví dụ
int MaxSubSum2(const int a[], int n) {
int maxSum=0;
if (thisSum>maxSum)
maxSum=thisSum;
}
}
return maxSum;
}
Một số ví dụ
if (thisSum>maxSum)
maxSum=thisSum;
O(n)
else if (thisSum<0)
thisSum=0;
}
return maxSum;
}
Một số ví dụ
Sum=0
for (j=0;j<N;j++)
for (k=0;k<N*N;k++)
Sum++; O(N
O(N ))
33
Một số ví dụ
Độ phức tạp
O(1) độ phức tạp hằng số
O(logn) độ phức tạp logarit
O(n) độ phức tạp tuyến tính
O(nlogn) độ phức tạp nlogn
O(nb) độ phức tạp đa thức
O(bn) độ phức tạp mũ
O(n!) độ phức tạp giai thừa
Sự phân lớp của giải thuật
Đánh giá độ phức tạp trong ba
trường hợp
• Độ phức tạp tính toán của giải thuật trong các trường
hợp
• Xấu nhất
• Tốt nhất
• Trung bình
Đánh giá độ phức tạp trong ba trường hợp
N
S ( N ) 1 2 N i N (1 N ) / 2
i 1
6
3
for large N
• Logarithms:
• xa = b logx b = a
Kiến thức Toán học bổ trợ về Tổng các chuỗi
N
N k 1
i 1
k
i
| k 1|
for large N and k -1
N
A N 1 1
i 0
A
i
A 1
• Đặc biệt khi A = 2
• 20 + 21 + 22 + … + 2N = 2N+1 - 1
Q&A
III - TỔNG KẾT
Slide 81
IV - CHUẨN BỊ CHO BÀI HỌC SAU
Slide 82