8/4/2020
BÀI GIẢNG ĐIỆN TỬ
HP:CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Số TC: 3
Bộ môn: Tin học
Cấu trúc dữ liệu và giải thuật
1
Giới thiệu học phần
Số tín chỉ: 3 (36,9)
Mục tiêu: Cung cấp:
▪ Một số khái niệm cơ bản về giải thuật và cấu trúc dữ
liệu; vai trò của cấu trúc dữ liệu và giải thuật (CTDL
và GT) trong hệ thống thông tin (HTTT); Một số cấu
trúc dữ liệu cơ bản bao gồm: Mảng (Array), Danh
sách (List), Danh sách liên kết (Linked List), Ngăn
xếp (Stack) và Hàng đợi (Queue), và Cây (Tree)
Cấu trúc dữ liệu và giải thuật
2
1
8/4/2020
Giới thiệu học phần
Nội dung chính:
Chương 1: Các khái niệm cơ bản về CTDL & GT (6t)
Chương 2: Mảng và danh sách (12t)
Chương 3: Cây (12t)
Chương 4: Một số giải thuật sắp xếp và tìm kiếm (15t)
Cấu trúc dữ liệu và giải thuật
3
Tài liệu tham khảo
❖Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật, NXB
ĐHQGHN, 2008
❖Nguyễn ĐÌnh Hóa, Cấu trúc dữ liệu và giải thuật, 2008,
NXB ĐHQGHN
❖Lê Minh Hoàng, Bài giảng chuyên đề
❖ />hms/
❖b/bookreader.php/138793/Advanced_C.pdf.
Cấu trúc dữ liệu và giải thuật
4
2
8/4/2020
Chương 1. Các khái niệm cơ bản về CTDL & GT
1.1 Cấu trúc dữ liệu
1.2 Giải thuật
Cấu trúc dữ liệu và giải thuật
5
1.1 Cấu trúc dữ liệu (Data Structures)
1.1.1 Khái niệm chung
1.1.2 Các vấn đề liên quan
1.1.3 Một số cấu trúc dữ liệu cơ bản
Cấu trúc dữ liệu và giải thuật
6
3
8/4/2020
1.1.1 Khái niệm chung
❖Mục tiêu của tin học?
❖Dữ liệu là gì? →Kiểu dữ liệu ? (kiểu cơ sở/ kiểu có cấu
trúc phức tạp)
❖Khái niệm chung: CTDL là một cách thể hiện và tổ chức
dữ liệu trong máy tính sao cho nó được sử dụng một cách
có hiệu quả nhất.
❖Khái niệm khác: CTDL là một dữ liệu phức hợp, gồm
nhiều thành phần dữ liệu, mỗi thành phần hoặc là dữ liệu
cơ sở hoặc là một CTDL đã được xây dựng. Các thành
phần dữ liệu tạo nên một CTDL được liên kết với nhau theo
một cách nào đó.
Cấu trúc dữ liệu và giải thuật
7
1.1.2 Các vấn đề liên quan
Tầm quan trọng của việc lựa chọn CTDL
▪ Tổ chức dữ liệu : dl vào/ra/trung gian
▪ Xây dựng giải thuật
→Các cách cài đặt khác nhau
→Thực hiện thao tác thuận lợi/khôngthuận lợi
→CTDL thay đổi → Thuật toán thay đổi
Cấu trúc dữ liệu và giải thuật
8
4
8/4/2020
1.1.2 Các vấn đề liên quan
Các tiêu chuẩn khi lựa chọn CTDL
▪ CTDL phải biểu diễn được đầy đủ các thơng tin của
bài tốn. (in/out) → phản ánh đúng thực tế
▪ Cài đặt được trên máy tính và ngơn ngữ lập trình đang
sử dụng
▪ Phù hợp với các thao tác của thuật toán (đặc biệt thao
tác được sử dụng nhiều) → phát triển thuật toán đơn
giản và đạt hiệu quả.
▪ Tiết kiệm tài nguyên
Cấu trúc dữ liệu và giải thuật
9
1.1.3 Một số cấu trúc dữ liệu cơ bản
❖Mảng (array)
❖Bản ghi (record)/cấu trúc (struct)
❖Tập hợp (set)
❖Tệp (file)
❖Xâu (string)
❖….(bảng băm, danh sách liên kết)
Cấu trúc dữ liệu và giải thuật
10
5
8/4/2020
1.2 Giải thuật (Algorithm)
1.2.1 Khái niệm chung
1.2.2 Ngôn ngữ diễn đạt giải thuật
1.2.3 Thiết kế và phân tích giải thuật
1.2.4 Giải thuật đệ quy
Cấu trúc dữ liệu và giải thuật
11
1.2.1 Khái niệm chung
❖Thuật toán là một dãy hữu hạn các bước được
sắp xếp theo một trật tự xác định, mỗi bước mơ
tả chính xác các phép tốn hoặc hành động cần
thực hiện, để giải quyết một vấn đề.
❖Thuật toán là một dãy hữu hạn các thao tác, sắp
xếp theo một trật tự xác định, sau khi thực hiện,
từ Input ta nhận được Output cần tìm.
Cấu trúc dữ liệu và giải thuật
12
6
8/4/2020
1.2.1 Khái niệm chung
❖Các tính chất (đặc trưng) của thuật tốn:
▪
▪
▪
▪
▪
▪
▪
Tính
Tính
Tính
Tính
Tính
Tính
Tính
vào (input)
ra (output)
đơn định (xác định / đơn nghĩa)
đúng đắn
dừng (tính kết thúc / tính đóng)
phổ dụng
khả thi/hiệu quả
Cấu trúc dữ liệu và giải thuật
13
1.2.2 Ngôn ngữ diễn đạt giải thuật
❖Cách liệt kê: liệt kê các bước cần thực hiện
❖Sơ đồ khối: sử dụng các hình khối oval, chữ nhật,
hình thoi và mũi tên,…
❖Ngơn ngữ lập trình: dùng các ký hiệu và các quy
tắc của ngơn ngữ lập trình
Cấu trúc dữ liệu và giải thuật
14
7
8/4/2020
1.2.2 Ngơn ngữ diễn đạt giải thuật
Ví dụ:
- Input:N ngun dương, dãy a 1,..., an.
- Output : Tìm Max của dãy đã cho.
Ý tưởng:
❖Giả thiết Max = a1. Với mỗi i, nếu ai > Max thì thay giá
trị Max= ai.
Cấu trúc dữ liệu và giải thuật
15
1.2.2 Ngôn ngữ diễn đạt giải thuật
❖Cách liệt kê
Bước 1. Nhập N và dãy a1, ..., an
Bước 2. Đặt Max = a1, i = 2;
Bước 3. Nếu i > N thì đến Bước 5;
Bước 4.
4.1. N ếu ai > Max thì Max = ai.
4.2. Đặt i=i+1 rồi quay B.3;
Bước 5. Đưa ra Max rồi kết thúc.
Cấu trúc dữ liệu và giải thuật
16
8
8/4/2020
1.2.2 Ngôn ngữ diễn đạt giải thuật
Bắt đầu
Nhập N, a1,a2, …an
Max=a1,i=2
i=i+1
i>N
Max= ai
ai>Max
Xuất Max
Kết thúc
Cấu trúc dữ liệu và giải thuật
17
1.2.2 Ngơn ngữ diễn đạt giải thuật
❖Dùng ngơn ngữ lập trình
int max(int *x,int n) //hàm tìm max
{
int result;
result=x[0];
for (int i=1;i
if (result
return result;
}
Cấu trúc dữ liệu và giải thuật
18
9
8/4/2020
1.2.3 Thiết kế và phân tích giải thuật
❖Thiết kế giải thuật
▪ Ý nghĩa: Sự đa dạng và phức tạp của các bài toán
→cần sử dụng nguồn nhân lực lớn hơn
→Thời gian để thử nghiệm, bảo trì và mở rộng hệ thống
chiềm phần đáng kể so với thời gian xây dựng CT.
Cấu trúc dữ liệu và giải thuật
19
1.2.3 Thiết kế và phân tích giải thuật
❖Module hóa và việc giải quyết bài toán
▪ Chiến thuật “chia để trị” (divide and conquer)
▪ Cách thiết kế “từ đỉnh xuống”(top-down)
❖Phương pháp tinh chỉnh từng bước (stepwise
refinement): là phương pháp thiết kế giải thuật
gắn liền với lập trình
→Phản ánh: q trình modun hóa bài tốn và thiết kế
kiểu top-down (từ bài tốn đến chương trình)
Cấu trúc dữ liệu và giải thuật
20
10
8/4/2020
Ví dụ
❖ Quản lý học bổng của sinh viên, lập báo cáo tổng kết theo kỳ
❖ Thiết kế:
❖ B1: xác định input/ouput
▪ Input: file chứa thông tin HB của SV: mã SV, ĐTB, Mức HB
▪ Output: Tìm kiếm, cập nhập, hiển thị thông tin của SV, In bảng tổng kết
❖ B2: Xác định các công việc chủ yếu
▪ Đọc file vào bộ nhớ trong → lấy thông tin của SV
▪ Xử lý thông tin đọc được
▪ Ghi file → Lưu thông tin cập nhật vào file
❖ B3: Giải quyết từng công việc một cách chi tiết bằng cách lặp
lại B1 và B2
Cấu trúc dữ liệu và giải thuật
21
Ví dụ
Cấu trúc dữ liệu và giải thuật
22
11
8/4/2020
Ví dụ
❖ Đọc file:
▪ Input: file thơng tin trên đĩa
▪ Output: đọc file và lưu vào mảng (mỗi ptử lưu thông tin một sinh viên)
❖ Ghi file
▪ Input: Mảng lưu thông tin các sinh viên
▪ Output: Lưu trở lại file
❖ Xử lý thông tin
▪ Input: Mảng lưu thông tin của các sinh viên
▪ Output:
•
•
•
•
Tìm một sinh viên cho trước
Hiển thị thông tin của sinh viên
Cập nhật thông tin của sinh viên
In bản tổng kết
Cấu trúc dữ liệu và giải thuật
23
Ví dụ
Cấu trúc dữ liệu và giải thuật
24
12
8/4/2020
1.2.3 Thiết kế và phân tích giải thuật
❖Các chiến lược thiết kế giải thuật:
▪
▪
▪
▪
▪
Module hóa→Chia để trị (divide and conquer/top-down)
Phương pháp tham lam (greedy)
Phương pháp quy hoạch động
Phương pháp nhánh cận
Phương pháp quay lui
Cấu trúc dữ liệu và giải thuật
25
1.2.3 Thiết kế và phân tích giải thuật
❖Phân tích giải thuật
▪ Tại sao cần phân tích giải thuật?
▪ Chương trình chạy đúng chưa đủ, cần xét tính hiệu
quả (kg/tg) với các tập dữ liệu khác nhau
▪ Lưu ý: chỉ phân tích các giải thuật đúng – là thuật
toán mà với một bộ dữ liệu vào bất kỳ thì thuật tốn
dừng và cho kết quả đúng
Cấu trúc dữ liệu và giải thuật
26
13
8/4/2020
1.2.3 Thiết kế và phân tích giải thuật
❖Các lưu ý khi phân tích giải thuật
▪ Tính đúng đắn của giải thuật
▪ Tính đơn giản của giải thuật
▪ Tốc độ thực hiện (hoặc thời gian thực hiện) và dung
lượng bộ nhớ cần chiếm dụng của giải thuật (cịn gọi
là tính hiệu quả của giải thuật )
→ chỉ đánh giá thời gian thực hiện giải thuật
Cấu trúc dữ liệu và giải thuật
27
1.2.3 Thiết kế và phân tích giải thuật
❖Đánh giá thời gian thực hiện giải thuật
▪ Thử nghiệm: khơng chính xác (vì phụ thuộc vào
nhiều yếu tố)
▪ Lý thuyết: Coi thời gian thực hiện giải thuật là một
hàm của cỡ dữ liệu vào. T(n)→ gọi là “độ phức tạp
của giải thuật”
▪ Cách xác định: tính số các phép tốn sơ cấp mà giải
thuật cần dùng (lưu ý thao tác đặc trưng của giải
thuật)
Cấu trúc dữ liệu và giải thuật
28
14
8/4/2020
1.2.3 Thiết kế và phân tích giải thuật
❖Khái niệm hàm O lớn: Hàm T(n) được gọi là
Omega lớn của g(n), ký hiệu T(n) =O (g(n))
nếu c>0 và n0 sao cho với mọi n n0 :
T(n) c g(n)
Trong đó: g(n) là giới hạn trên của T(n).
Cấu trúc dữ liệu và giải thuật
29
1.2.3 Thiết kế và phân tích giải thuật
❖Quy tắc xác định độ phức tạp của giải thuật
▪ Quy tắc hằng số: Nếu P có T(n)= O(c1f(n)) →P có độ
phức tạp O(f(n)).
▪ Quy tắc lấy max: Nếu P có T(n)= O( f(n)+g(n)) thì P
có độ phức tạp là O( max ( f(n), g(n))).
▪ Quy tắc cộng: Nếu P1 có T1(n) = O(f(n)) và P2 có
T2(n)= O(g(n)), khi đó: T1(n) +T2(n) = O(f(n) +g(n)).
▪ Quy tắc nhân: Nếu P có T(n)= O(f(n)). Khi đó nếu
thực hiện k(n) lần P với k(n)=O(g(n)) thì độ phức tạp là
O(f(n) g(n)).
Cấu trúc dữ liệu và giải thuật
30
15
8/4/2020
1.2.3 Thiết kế và phân tích giải thuật
Áp dụng đánh giá chương trình
Câu lệnh đơn thực hiện một thao tác
→QT hằng số
❖Câu lệnh hợp thành là một dãy các câu lệnh
→QT tổng
❖Câu lệnh rẽ nhánh dạng If ...else.
→QT Max
❖ Các câu lệnh lặp: while, do …while, for
→QT Nhân
❖
Cấu trúc dữ liệu và giải thuật
31
1.2.3 Thiết kế và phân tích giải thuật
❖Ví dụ: chương trình lấy max ở trên
Cấu trúc dữ liệu và giải thuật
32
16
8/4/2020
1.2.4 Giải thuật đệ quy
❖Khái niệm: Ta nói một đối tượng là đệ quy nếu nó được
định nghĩa qua chính nó hoặc một đối tượng khác cùng
dạng với nó bằng quy nạp.
❖Ví dụ: Tính giai thừa/ tính tổ hợp
❖Giải thuật đệ quy: Nếu lời giải một bài toán P được thực
hiện bằng lời giải của bài tốn P’ có dạng giống như P
thì đố là một lời giải đệ quy. Giải thuật tương ứng với lời
giải như vậy gọi là giải thuật đệ quy
Cấu trúc dữ liệu và giải thuật
33
1.2.4 Giải thuật đệ quy
❖Điều kiện:
▪ Có điểm dừng (trường hợp suy biến khơng cần đệ quy/
phần neo)
▪ Làm cho kích thước bài toán nhỏ hơn (để về gần TH
suy biến/ phần đệ quy)
❖Chú ý:
▪ P’ giống P
▪ P’ “nhỏ hơn” P theo nghĩa nào đó
Cấu trúc dữ liệu và giải thuật
34
17
8/4/2020
1.2.4 Giải thuật đệ quy
❖Thiết kế giải thuật đệ quy: 3bước
▪ Thơng số hóa bài tốn
▪ Tìm điều kiện dừng
▪ Phân rã bài toán
Cấu trúc dữ liệu và giải thuật
35
1.2.4 Giải thuật đệ quy
❖Ví dụ:
▪ Tìm từ trong từ điển
▪ Tìm tệp trong tệp trên máy tính
Cấu trúc dữ liệu và giải thuật
36
18
8/4/2020
1.2.4 Giải thuật đệ quy
❖Ưu điểm:
▪ Mạnh, rõ ràng, chặt chẽ
▪ Thiết kế TT đơn giản, ngắn gọn
▪ Trong một số giải thuật đệ quy cũng có hiệu quả cao (quick sort)
❖Nhược điểm:
▪ Lời gọi hàm tốn rất nhiều thời gian, không gian nhớ.
▪ Tốc độ chậm
▪ Thận trọng đừng để chạy vô hạn
❖Lưu ý: mọi giải thuật đệ quy đều có thể thay bằng một giải
thuật khơng đệ quy → khử đệ quy
Cấu trúc dữ liệu và giải thuật
37
1.2.4 Giải thuật đệ quy
❖Khử đệ quy (tự học)
Cấu trúc dữ liệu và giải thuật
38
19
8/4/2020
1.2.2 Ngôn ngữ diễn đạt giải thuật
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int max(int *x,int n)
{ int result = x[0];
for (int i=1;i
if (result
result=x[i];
return result;
}
void main()
{
int n,*a;
printf("nhap so phan tu:"); scanf("%d",
&n);
a=(int*)malloc(n*sizeof(int));
if (a==NULL)
{
printf("khong du bo nho");
exit(0);
}
printf("\n nhap cac phan tu cua day:\n");
for (int i=0;i
scanf("%d",&a[i]);
printf("gia tri max cua day
la:%d",max(a,n));
getch();
}
Cấu trúc dữ liệu và giải thuật
39
Chương 2 (12t)
2.1 Mảng
2.2 Danh sách
2.3 Ngăn xếp
2.4 Hàng đợi
Cấu trúc dữ liệu và giải thuật
40
20