Professional Documents
Culture Documents
01. New Bài 1 - tổng Quan Cấu Trúc Dữ Liệu & Giải Thuật
01. New Bài 1 - tổng Quan Cấu Trúc Dữ Liệu & Giải Thuật
3. Số tín chỉ: 03
26/08/2023 2
Mục tiêu học phần
• Cung cấp các PP tổ chức và các thao tác cơ sở trên các
CTDL, song song là sự kết hợp hai thành phần trên để
hình thành nên một chương trình máy tính.
• Củng cố và phát triển kỹ năng lập trình được học trong
giai đoạn trước.
• Hình thành thái độ làm việc chăm chỉ, có cường độ cao
và chú ý đến chi tiết. Hình thành phong cách lập trình
chuyên nghiệp.
26/08/2023 3
Tóm tắt nội dung học phần
▪ Tìm hiểu các phương pháp tổ chức và những thao tác cơ sở
trên từng CTDL, kết hợp với việc phát triển tư duy giải thuật
để hình thành nên chương trình máy tính.
▪ Hiểu được tầm quan trọng của giải thuật và cách tổ chức dữ
liệu, hai thành tố quan trọng nhất cho một chương trình.
▪ Củng cố và phát triển kỹ năng lập trình được học trong giai
đoạn trước
26/08/2023 4
Phương pháp đánh giá
1) Điểm quá trình
Điểm bài tập/ kiểm tra trong quá trình học: 7,0 điểm
Điểm danh: 3,0 điểm
2) Điểm thi kết thúc môn
Thi tự luận theo lịch thi của Phòng Khảo thí
Điểm học phần = (1) x 50% + (2) x 50%
26/08/2023 5
Tài liệu tham khảo
1. Slide bài giảng
26/08/2023 6
Nội dung
Bài 1. Tổng quan về CTDL & GT
1.1. Vai trò của cấu trúc dữ liệu trong một đề án tin học
1.2. Các tiêu chuẩn đánh giá cấu trúc dữ liệu
1.3. Trừu tượng hóa dữ liệu
1.4. Kiểu dữ liệu cơ bản
1.5. Kiểu dữ liệu có cấu trúc
1.6. Độ phức tạp của giải thuật*
1.7 Các qui tắc đánh giá thời gian thực hiện giải thuật
1.8. Bài tập
26/08/2023 7
Nội dung
Bài 2. Cấu trúc danh sách
2.1. Khái niệm
2.2. Cấu trúc danh sách
2.3. Các phương pháp cài đặt danh sách
2.4. Hiện thực danh sách kề
2.5. Hiện thực danh sách liên kết đơn
2.6. Các loại danh sách khác
2.7. Bài tập
26/08/2023 8
Nội dung
Bài 3. Cấu trúc Stack và Queue
3.1. Giới thiệu về Stack
3.2. Hiện thực Stack
3.3. Một số bài toán ứng dụng Stack
3.4. Giới thiệu về Queue
3.5. Hiện thực Queue
3.6. Hàng đợi có ưu tiên
3.7. Bài tập
26/08/2023 9
Nội dung
Bài 4. Cấu trúc Cây - Cây nhị phân – Cây nhị phân tìm kiếm
4.1 Cấu trúc cây tổng quát
4.2 Cây nhị phân
4.3 Mô tả cây nhị phân
4.4 Hiện thực cây nhị phân tổng quát
4.5. Định nghĩa cây nhị phân tìm kiếm
4.6. Cài đặt cây nhị phân tìm kiếm
4.7. Bài tập
26/08/2023 10
Nội dung
Bài 5. Cây nhị phân tìm kiếm cân bằng - AVL
5.1. Định nghĩa cây nhị phân tìm kiếm cân bằng
26/08/2023 12
Nội dung
Bài 7. Đường đi và chu trình
26/08/2023 13
Nội dung
Bài 8. Duyệt đồ thị
26/08/2023 15
Nội dung
Bài 10. Đường đi ngắn nhất
26/08/2023 16
Bài 1. Tổng Quan Về CTDL & GT
Nội dung
• 1.1. Vai trò CTDL trong một đề án tin
học
• 1.2 Các tiêu chuẩn đánh giá CTDL
• 1.3 Trừu tượng hóa dữ liệu
• 1.4 Kiểu dữ liệu cơ bản
• 1.5 Kiểu dữ liệu có cấu trúc
• 1.6 Độ phức tạp của giải thuật
26/08/2023 17
1.1. Vai trò CTDL trong 1 đề án tin học (1)
26/08/2023 18
1.1. Vai trò CTDL trong 1 đề án tin học (2)
▪ Dữ liệu thực tế:
- Muôn hình vạn trạng, đa dạng, phong phú
- Thường có chứa đựng quan hệ với nhau
▪ Cần phải tổ chức biểu diễn thành cấu trúc thích hợp nhất
- Phản ánh chính xác dữ liệu thực tế
- Dễ dàng xử lý trong máy tính
Xây dựng
CTDL
26/08/2023 19
1.1. Vai trò CTDL trong 1 đề án tin học (3)
Xây dựng thao tác xử lý
Dựa trên Y/C cụ thể, xác định các trình tự giải
quyết vấn đề trên máy tính để đưa kết quả mong
muốn
Đối tượng DL
Kết quả
Thao tác xử lý mong
muốn
Xây dựng
giải thuật
26/08/2023 20
1.1. Vai trò CTDL trong 1 đề án tin học (4)
quan hệ chặc chẽ
Niklaus Wirth
26/08/2023 21
1.2. Các tiêu chuẩn đánh giá CTDL
• Phản ánh đúng thực tế:
– Thể hiện được đầy đủ thông tin nhập/xuất của bài toán.
• Phù hợp với thao tác xử lý:
– Tăng tính hiệu quả của chương trình → hiệu quả của dự án
tin học.
• Tiết kiệm tài nguyên hệ thống:
– Sử dụng tài nguyên vừa đủ để thực hiện chức năng &
nhiệm vụ.
26/08/2023 22
1.3. Trừu tượng hóa dữ liệu (1)
• Trừu tượng hoá
- Che đi phần chi tiết, làm nổi bật cái tổng thể
26/08/2023 23
1.3. Trừu tượng hóa dữ liệu (2)
• ADT: gồm
- Mô tả dữ liệu
• VD: tập số nguyên với các phép toán hợp, giao, hiệu là kiểu
dữ liệu trừu tượng.
26/08/2023 24
1.3. Trừu tượng hóa dữ liệu (3)
• VD: mô tả kiểu dữ liệu trừu tượng về số hữu tỉ a/b với các tác
vụ: +,*, /
• Mô tả dữ liệu
- Tử số
- Mẫu số (≠0)
26/08/2023 25
1.3. Trừu tượng hóa dữ liệu (4)
• Mô tả tác vụ
Cộng(Số_Hữu_Tỉ 1, Số_Hữu_Tỉ 2)
• Nhập:
- a, b là tử số và mẫu số của Số_Hữu_Tỉ 1
- c, d là tử số và mẫu số của Số_Hữu_Tỉ 2
• Xuất:
- ad+bc là tử số của số hữu tỉ kết quả
- bd là mẫu số của số hữu tỉ kết quả
26/08/2023 26
1.4. Kiểu dữ liệu cơ bản (1)
• Thường đơn giản và không có cấu trúc, được NNLT xây dựng
sẵn, nên còn gọi là kiểu dữ liệu dựng sẵn.
26/08/2023 27
1.4. Kiểu dữ liệu cơ bản (2)
Tên kiểu KT Miền giá trị Ghi chú
char 1 -128 đến 127 Có thể dùng như số nguyên 1 byte có dấu hay
kiểu ký tự
unsigned char 1 0 đến 255 Số nguyên 1 byte ko dấu
26/08/2023 28
1.5. Kiểu dữ liệu có cấu trúc (1)
• Kết hợp nhiều kiểu dữ liệu cơ bản để phản ánh bản chất của
đối tượng thực tế
• Đa số các ngôn ngữ đều cài đặt sẵn một số kiểu có cấu trúc
cơ bản: mảng, chuỗi, tập tin, bản ghi…
• Ngoài ra cung cấp cơ chế cho người lập trình cài đặt các dữ
liệu cấu trúc khác.
26/08/2023 29
1.5. Kiểu dữ liệu có cấu trúc (2)
▪ Kiểu mảng một chiều
• Khai báo
<Kiểu Dũ Liệu> <Tên mảng> [<Số phần tử max>];
Ví dụ: int a[100];
• Gán giá trị ban đầu
Ví dụ 1: int a[100] = {0}; // a[0]=a[1]=…=a[99]=0
Ví dụ 2: int a[5] = {3, 6, 2, 10, 17};
hoặc: int a[] = {3, 6, 2, 10, 17};
26/08/2023 30
1.5. Kiểu dữ liệu có cấu trúc (3)
Phát sinh số nguyên ngẫu nhiên <time.h>
• Khởi tạo phát sinh ngẫu nhiên:
srand((unsigned int)time(NULL));
• Phát sinh số nguyên ngẫu nhiên x:
o k: Số nguyên dương
int x = rand()%k;
o x [0..k-1]
• Ví dụ: Phát sinh 1 số nguyên ngẫu nhiên có giá trị từ 0 đến 50
srand((unsigned int)time(NULL));
int x = rand()%51;
26/08/2023 31
1.5. Kiểu dữ liệu có cấu trúc (4)
▪ Kiểu xâu ký tự
• Khai báo
char <Tên xâu> [<Số ký tự max>] ;
Ví dụ: char hoten[50];
• Xem lại các hàm
- gets, fflush, flushall
- strcpy, strcat, strlen
- strcmp, stricmp
- strchr, strstr
26/08/2023 32
1.5. Kiểu dữ liệu có cấu trúc (5)
• Cấu trúc dữ liệu Sinh viên
Mã SV: chuỗi kt
GT A GT C
GT B GT tốt
• Dạng mã giả
26/08/2023 37
1.6. Độ phức tạp của giải thuật (10)
▪ Dạng lưu đồ (sơ đồ khối)
Bắt đầu/ kết thúc Giá trị trả về
Điều Điều
kiện kiện
Rẽ nhánh Điểm nối
Luồng xử lý
Khối xử lý
Nhập/ Xuất
26/08/2023 38
1.6. Độ phức tạp của giải thuật (11)
▪ Dạng mã giả
• IF <điều kiện> THEN …ENDIF
• IF <điều kiện> THEN ... ELSE ... ENDIF
• WHILE <điều kiện> DO … ENDWHILE
• DO … UNTIL <điều kiện>
• DISPLAY …
• RETURN …
26/08/2023 39
1.6. Độ phức tạp của giải thuật (12)
▪ Ví dụ giải thuật dạng ngôn ngữ tự nhiên
Giải thuật Euclid tìm UCLN của hai số nguyên dương
• Input : m, n nguyên dương
• Output : g là ước chung lớn nhất của m và n
• Nội dung giải thuật:
Bước 1: Tìm r, phần dư của phép chia m cho n
Bước 2: Nếu r = 0, thì g n (gán giá trị của n cho g) và
dừng lại. Trong trường hợp ngược lại (r 0), thì m n, n
r và quay lại bước 1.
26/08/2023 40
1.6. Độ phức tạp của giải thuật (13)
▪ Ví dụ giải thuật dạng lưu đồ (sơ đồ khối)
Giải thuật tìm Bắt đầu
Euclid tìm UCLN
của hai số nguyên
Nhập m, n >0
dương
r = m%n; Kết thúc
m = n; Sai Đúng
r=0 g = n; In g ra
n=r;
26/08/2023 41
1.6. Độ phức tạp của giải thuật (14)
Trong phương pháp thực nghiệm, thời gian chạy chương trình
phụ thuộc vào các yếu tố:
• Các dữ liệu vào
• Chương trình dịch để chuyển chương trình nguồn thành
mã máy
• Tốc độ thực hiện các phép toán của máy tính được sử
dụng để chạy chương tình
➔ Không thể biểu diễn chính xác thời gian chạy là bao nhiêu
đơn vị thời gian chuẩn
26/08/2023 42
1.6. Độ phức tạp của giải thuật (15)
Trong phương pháp lý thuyết
▪ Coi thời gian thực hiện Giải thuật là hàm T(n) với n là cỡ
của dữ liệu.
▪ Thời gian thực hiện Giải thuật không chỉ phụ thuộc vào
cỡ dữ liệu vào mà còn phụ thuộc dữ liệu cá biệt.
▪ Thời gian thực hiện Giải thuật trong trường hợp tốt nhất.
26/08/2023 43
1.6. Độ phức tạp của giải thuật (16)
▪ Thời gian thực hiện Giải thuật trong trường hợp trung bình.
▪ Thời gian thực hiện Giải thuật trong trường hợp xấu nhất.
▪ Thời gian thực hiện T(n) là số phép toán sơ cấp cần phải tiến
hành khi thực hiện thuật toán.
26/08/2023 44
1.6. Độ phức tạp của giải thuật (17)
▪ Kí pháp biểu diễn tiệm cận (Asymptotic Notation)
• Định nghĩa:
26/08/2023 48
1.6. Độ phức tạp của giải thuật (21)
▪ Bảng minh hoạ dưới đây cho thấy thời gian thực cho cùng
một cở dữ liệu với các độ phức tạp khác nhau.
26/08/2023 49
1.6. Độ phức tạp của giải thuật (22)
▪ Bảng minh hoạ dưới đây cho n b b a
i =
2
i= ;
▪ Thường dựa vào số phép so i =1 2 i =1 6
i =1
i 3
=
4
▪ Một số công thức thường dùng
26/08/2023 50
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(1)
▪ Qui tắc tổng: Giả sử 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 mà T1(n) =
O(f1(n)) và T2(n) = O(f2(n)) thì thời gian thực hiện P1 và
P2 kế tiếp nhau sẽ là: T1(n) + T2(n) = O(max (f1(n), f2(n)))
▪ Qui tắc nhân: Nếu thời gian thực hiện tương ứng với P1
và P2 là T1(n) = O(f1(n)) và T2(n) = O(f2(n)) thì thời gian
thực hiện P1 và P2 lồng nhau sẽ là: T1(n).T2(n) = O(f1(n).f2(n)))
26/08/2023 51
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(2)
26/08/2023 53
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(4)
▪ Ví dụ: Câu lệnh gán : x = x +1 có thời gian thực hiện bằng c
(hằng số) nên được đánh giá là O(1).
Câu lệnh for (i = 1;i<= n; i++)
x = x +1;
có thời gian thực hiện O(n.1) = O(n).
▪ Ví dụ: Câu lệnh for (i = 1; i<=n; i ++)
for (j = 1;j<=n; j++)
x = x +1;
có thời gian được đánh giá là O(n.n) = O(n2)
Cũng có thể thấy O(c.f(n)) = O(f(n)) chẳng hạn O(n2/2) = O(n2).
26/08/2023 54
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(5)
▪ Ví dụ:
void BubleSort(int a[], int N )
{ int i, j,temp;
(1) for (i = 0 ; i<N-1 ; i++)
(2) for (j =N-1; j >i ; j --)
(3) if(a[j]< a[j-1]) {
(4) temp=a[j-1];
(5) a[j-1]=a[j];
(6) a[j]=temp
}
} Áp dụng các qui tắc ta được T(n)=O(N2)
26/08/2023 55
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(6)
▪ Ví dụ: int Euclid (int m, int n)
{ int r;
(1) r = m % n ;
(2) while (r != 0)
(3) { m =n;
(4) n =r;
(5) r=m%n;
}
(6) return n;
}
Áp dụng các qui tắc ta được O(n)=O(log2(n))
26/08/2023 56
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(7)
26/08/2023 57
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(8)
▪ Đánh giá
• T(1)=C1
• T(n) = C2 + T(n-1)
• →T(n) = (n-1) C2 + C1 →T(n)=0(n)
26/08/2023 59
1.8 Câu Hỏi Ôn Tập Bài 1 (1)
1. Viết chương trình C khai báo kiểu dữ liệu là mảng một chiều,
chương trình có các chức năng như sau:
• Nhập giá trị vào mảng.
• Xuất các phần tử trong mảng.
2. Viết chương trình C có khai báo kiểu dữ liệu là mảng hai
chiều, chương trình có các chức năng sau:
• Nhập giá trị vào ma trận.
• Xuất các phần tử trong ma trận.
26/08/2023 60
1.8 Câu Hỏi Ôn Tập Bài 1 (2)
3. Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng cho thông
tin sinh viên với các thao tác nhập, xuất thông tin của sinh viên.
4. Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng của số
hữu tỉ a/b với các tác vụ cộng hai số hữu tỉ, nhân hai số hữu tỉ,
chia hai số hữu tỉ.
26/08/2023 61