TRƯỜNG ĐH CÔNG NGHIỆP TP. HCM
TT CNTT
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Giáo viên: Trần Thị Kim Chi
DATA STRUCTURES & ALGORITHMS
Giới thiệu
Mục tiêu
Nắm vững khái niệm kiểu dữ liệu, kiểu dữ liệu trừu tượng.
Nắm vững và cài đặt được các kiểu dữ liệu trừu tượng cơ
bản như danh sách, ngăn xếp, hàng đợi, cây, tập hợp, bảng
băm, đồ thị bằng một ngôn ngữ lập trình căn bản.
Vận dụng được các kiểu dữ liệu trừu tượng để giải quyết bài
toán đơn giản trong thực tế.
Ngôn ngữ lập trình minh hoạ
Mã giả (pseudocode)
C++
Nội dung chương trình
TT Nội dung
Số
tiết
Phân bổ thời gian
Ghi
chú
Lý
thuyết
Thực
hành
Tự
học
1
Tổng quan 3 3
0 6
2
Đệ quy 6 3
3 10
3
Tìm kiếm 10 6
4 12
4
Sắp xếp 5 3
3 10
5
Chồng (Stacks) 6 3
3 10
6
Hàng đợi (Queues) 6 3
3 12
7
Danh sách và chuỗi 10 6
4 15
8
Các bảng và phục hồi thông tin 10 6
4 10
9
Cây nhị phân 14 9
5 10
10
Cây nhiều nhánh 5 3
2 10
TỔNG 75
45 30 105
Kiến thức tiên quyết
Đã học môn phương pháp lập trình.
Kiến thức về kỹ thuật lập trình.
Sử dụng thành thạo ngôn ngữ C++
Tài liệu
Tài liệu học tập:
[1] C & Data Structures, P. S. Deshpande, O. G. Kakde -
CHARLES RIVER MEDIA, INC. Hingham, Massachusetts.
[2] Robert L.Kruse, Alexander J.Ryba, Data Structures And
Program Design In C++, Prentice-Hall International Inc., 1999.
[3] Bài giảng & Bài thực hành CTDL - Trường ĐHCN.
Tài liệu tham khảo:
[1] Giáo trình Cấu trúc dữ liệu 1, Trần Hạnh Nhi – Dương Anh
Đức, Trường DHKHTN – DHQG TP.HCM.
[2] Cấu trúc dữ liệu, Nguyễn Trung Trực,
Trường DHBK – DHQG TP.HCM
[3] Nguyễn Ngô Bảo Trân, Giáo trình cấu trúc dữ liệu và giải
thuật – Trường Đại học Bách Khoa TP.HCM, 2005.
Tiêu chuẩn đánh giá
Kiểm tra và Thi Điểm Tuần
Kiểm tra thường xuyên 10% Bất kỳ
Thi giữa kỳ 20% Tuần5
Thi cuối kỳ 50% Tuần 9
Báo cáo tiểu luận 20% Hàng tuần
Yêu cầu đối với sinh viên:
•
Dự lớp: lý thuyết trên 80% , thực hành bắt buộc 100%
•
Bài tập: hoàn thành các bài tập trên lớp và ở nhà
•
Tham gia đầy đủ các buổi thảo luận của nhóm
Trao đổi thông tin
Địa chỉ mail:
•
Địa chỉ download tài liệu:
•
/>
Tổng quan
1.1. Khái niệm cấu trúc dữ liệu & giải thuật
1.2. Đánh giá cấu trúc dữ liệu và giải thuật
1.3. Ôn lại ngôn ngữ C++
1.4. Các kiểu dữ liệu
1.5. Kiểu dữ liệu trừu tượng
1.6. Hàm
1.7. Tổng kết
1.8. Câu hỏi và bài tập
Chương 1
Dữ liệu có thể là dữ liệu đưa vào (input data), dữ liệu trung
gian hoặc dữ liệu đưa ra (output data). Mỗi dữ liệu có một kiểu
dữ liệu riêng. Kiểu dữ liệu có thể là kiểu cơ bản hay kiểu trừu
tượng
Cấu trúc dữ liệu là sự sắp xếp có logic của thành phần dữ liệu
được kết hợp với nhau và là tập hợp các thao tác chúng ta cần
để truy xuất các thành phần dữ liệu.
Ví dụ: thư viện
Bao gồm các sách
Truy cập/tìm kiếm một cuốn sách nào đó đòi hỏi phải biết cách sắp xếp của các sách
Người dùng truy cập sách chỉ thông qua người quản lý thư viện.
Cấu trúc dữ liệu
Một cấu trúc dữ liệu tốt phải thỏa mãn:
Phản ánh đúng thực tế: Cần xem xét kỹ lưỡng cũng như dự
trù các trạng thái biến đổi của dữ liệu trong chu trình sống
để có thể chọn CTDL lưu trữ thể hiện chính xác đối tượng thực
tế.
Phù hợp với các thao tác trên đó: Tăng tính hiệu quả của đề
án, việc phát triển các thuật toán đơn giản, tự nhiên hơn =>
chương trình đạt hiệu quả cao hơn về tốc độ xử lý.
Tiết kiệm tài nguyên hệ thống: CTDL chỉ nên sử dụng tài
nguyên hệ thống vừa đủ để đảm nhiệm được chức năng của
nó. Loại tài nguyên cần quan tâm là : CPU và bộ nhớ.
Cấu trúc dữ liệu
Những cấu trúc dữ liệu cơ bản
Các cấu trúc bao gồm
Danh sách liên kết (linked lists)
Ngăn xếp (Stack), Hàng đợi (Queue)
Cây nhị phân (binary trees)
…
Giải thuật giải là gì?
Giải thuật (Algorithm):
Còn gọi là thuật toán là tập các bước có thể tính toán được
để đạt được kết quả mong muốn.
Giải thuật được xây dựng trên cơ sở của cấu trúc dữ liệu đã
được chọn.
Giải thuật có thể được minh họa bằng ngôn ngữ tự nhiên
(natural language), bằng sơ đồ (flow chart) hoặc bằng mã giả
(pseudo code).
Ví dụ: Sắp xếp các phần tử
1 2 3 4 5 6 7
1
2
3
4
5
6
7
Ví dụ: Tính tổng các số nguyên lẻ từ
1
n
B1: S=0
B2: i=1
B3: Nếu i>n thì sang B7, ngược lại sang B4
B4: S=S+i
B5: i=i+2
B6: Quay lại B3
B7: Tổng cần tìm là S
13
Giải thuật giải là gì?
Giải thuật giải là gì?
Giải thuật (Algorithm):
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 giải thuật 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 giải thuật phải
được thực hiện trong một lượng thời gian hữu hạn.
Ngoài ra một giải thuật còn phải có đầu vào (input) và đầu ra
(output).
Mối quan hệ giữa
cấu trúc dữ liệu và giải thuật
CTDL + Thuật toán = Chương
trình
Đánh giá CTDL và GT
1. Các tiêu chuẩn đánh giá cấu trúc dữ liệu
Để đánh giá một cấu trúc dữ liệu chúng ta
thường dựa vào một số tiêu chí sau:
Cấu trúc dữ liệu phải tiết kiệm tài nguyên (bộ nhớ trong),
Cấu trúc dữ liệu phải phản ảnh đúng thực tế của bài toán,
Cấu trúc dữ liệu phải dễ dàng trong việc thao tác dữ liệu.
Đánh giá CTDL và GT
Thời gian thực hiện chương trình.
Thời gian thực hiện một chương trình là một 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.
Ví dụ: Chương trình tính tổng của n số có thời gian thực hiện là
T(n) = cn trong đó c là một hằng số.
Thời gian thực hiện chương trình là một hàm không âm, tức là
T(n)
≥
0
∀
n
≥
0.
Đơn vị đo thời gian thực hiện.
Đơn vị của T(n) không phải là đơn vị đo thời gian bình thường
như giờ, phút giây mà thường được xác định bởi số các lệnh
được thực hiện trong một máy tính lý tưởng.
Ví dụ: Khi ta nói thời gian thực hiện của một chương trình là
T(n) = cn thì có nghĩa là chương trình ấy cần cn chỉ thị thực thi.
Đánh giá CTDL và GT
Tỷ suất tăng
Ta nói rằng hàm không âm T(n) có tỷ suất tăng
(growth rate) f(n) nếu tồn tại các hằng số c và n
0
sao cho T(n) ≤ c.f(n) với mọi n ≥ n
0
.
Ví dụ 1-3: Giả sử T(0) = 1, T(1) = 4 và tổng quát
T(n) = (n+1)
2
. Đặt n
0
= 1 và c = 4 thì với mọi n ≥
1 chúng ta dễ dàng chứng minh rằng T(n) =
(n+1)
2
≤ 4n
2
với mọi n ≥ 1, tức là tỷ suất tăng của
T(n) là n
2
.
Ví dụ 1-4: Tỷ suất tăng của hàm T(n) = 3n
3
+ 2n
2
là n
3
. Thực vậy, cho n
0
= 0 và c = 5 ta dễ dàng
chứng minh rằng với mọi n ≥ 0 thì 3n
3
+ 2n
2
≤ 5n
3
Đánh giá CTDL và GT
Khái niệm độ phức tạp của giải thuật
Độ phức tạp tính toán của giải thuật là một hàm
chặn trên của hàm thời gian. Vì hằng nhân tử c
trong hàm chặn trên không có ý nghĩa nên ta có thể
bỏ qua vì vậy hàm thể hiện độ phức tạp có các dạng
thường gặp sau: log
2
n, n, nlog
2
n, n
2
, n
3
, 2n, n!, n
n
.
Ba hàm cuối cùng ta gọi là dạng hàm mũ, các hàm
khác gọi là hàm đa thức.
Một giải thuật mà thời gian thực hiện có độ phức tạp
là một hàm đa thức thì chấp nhận được tức là có thể
cài đặt để thực hiện, còn các giải thuật có độ phức
tạp hàm mũ thì phải tìm cách cải tiến giải thuật.
Độ phức tạp thuật toán
Để đánh giá hiệu quả của một thuật toán, có thể
tính số lượng các phép tính phải thực hiện của
thuật toán này:
Phép so sánh
Phép gán
Thông thường số các phép tính được thực hiện
phụ thuộc vào cỡ của bài toán, tức là độ lớn của
đầu vào
Vì thế độ phức tạp thuật toán là một hàm phụ
thuộc đầu vào
Tuy nhiên, không cần biết chính xác hàm này mà
chỉ cần biết một ước lượng đủ tốt của chúng
Để ước lượng độ phức tạp của một thuật toán ta
thường dùng khái niệm Big-O
20
Ví dụ
Bước 1. Gán
T
ổng = 0. Gán i = 0.
Bước 2.
– Tăng i thêm 1 đơn vị.
– Gán Tổng = Tổng + i
Bước 3. So sánh i với
n
– Nếu i <
n
, quay lại bước 2.
– Ngược lại, dừng thuật toán.
21
• Số phép gán của thuật toán là bao nhiêu?
• Số phép so sánh là bao nhiêu?
Gán: f(2n + 2), So sánh: f(n)
Độ phức tạp: O(n)
int tong=0, i=0;
do{
i++;
tong+=i;
}while (i<n);
Các độ phức tạp thường gặp (GT.53)
Độ phức tạp hằng số: O(1) – thời gian
chạy
không phụ thuộc vào độ lớn đầu vào
Độ phức tạp tuyến tính: O(n) – thời
gian chạy
tỉ lệ thuận với độ lớn đầu vào
Độ phức tạp logarit: O(logn)
Độ phức tạp đa thức
:
O(P(n)), với P là đa
thức
có
bậc
từ
2 trở lên
Độ phức tạp hàm mũ: O(2
n
)
22
Bảng so sánh các độ phức tạp của
thuật toán
Một số lớp thuật toán
23
Thứ tự độ phức tạp của thuật toán
24
Đánh giá CTDL và GT
Cách tính độ phức tạp
Qui tắc cộng:
Nếu T1(n) và T2(n) là thời gian thực hiện của hai đoạn
chương trình P1 và P2; và T1(n)=O(f(n)), T2(n)=O(g(n)
thì thời gian thực hiện của đoạn hai chương trình đó
nối tiếp nhau là T(n)=O(max(f(n),g(n)))
Ví dụ 1-6: Lệnh gán x=15 tốn một hằng thời gian hay
O(1)
Lệnh đọc dữ liệu scanf(“%d”, x) tốn một hằng thời
gian hay O(1)
Vậy thời gian thực hiện cả hai lệnh trên nối tiếp nhau
là O(max(1,1))=O(1)