You are on page 1of 61

Cho mảng A = [10,50,33,65,77,89,39,45,67,99]

1. Sắp xếp chọn


No min A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
10 50 33 65 77 89 39 45 67 99
0 10 10 50 33 65 77 89 39 45 67 99
1 33 10 33 50 65 77 89 39 45 67 99
2 39 10 33 39 65 77 89 50 45 67 99
3 45 10 33 39 45 77 89 50 65 67 99
4 50 10 33 39 45 50 89 77 65 67 99
5 65 10 33 39 45 50 65 77 89 67 99
6 67 10 33 39 45 50 65 67 89 77 99
7 77 10 33 39 45 50 65 67 77 89 99
8 89 10 33 39 45 50 65 67 77 89 99
2.Sắp xếp chèn
No Số so A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
sánh
10 50 33 65 77 89 39 45 67 99
0 50 10 50 33 65 77 89 39 45 67 99
1 33 10 33 50 65 77 89 39 45 67 99
2 65 10 33 50 65 77 89 39 45 67 99
3 77 10 33 50 65 77 89 39 45 67 99
4 89 10 33 50 65 77 89 39 45 67 99
5 39 10 33 39 50 65 77 89 45 67 99
6 45 10 33 39 45 50 65 77 89 67 99
7 67 10 33 39 45 50 65 67 77 89 99
8 99 10 33 39 45 50 65 67 77 89 99
3.Sắp xếp nổi bọt(bubble)
0 1 2 3 4 5 6 7 8
A[0] 10 10 10 10 10 10 10 10 10 10
A[1] 50 33 33 33 33 33 33 33 33 33
A[2] 33 50 39 39 39 39 39 39 39 39
A[3] 65 39 50 45 45 45 45 45 45 45
A[4] 77 65 45 50 50 50 50 50 50 50
A[5] 89 77 65 65 65 65 65 65 65 65
A[6] 39 89 77 67 67 67 67 67 67 67
A[7] 45 45 89 77 77 77 77 77 77 77
A[8] 67 67 67 89 89 89 89 89 89 89
A[9] 99 99 99 99 99 99 99 99 99 99
4.Sắp xếp nhanh(quick)

50,10,33,65,77,89,39,45,67,99
Lấy 50 làm chốt
Phân đoạn đầu tiên:

50 10 33 65 77 89 39 45 67 99 (i=3,j=7)
50 10 33 45 77 89 39 65 67 99 (i=4,j=6)
50 10 33 45 39 89 77 65 67 99 (j=4)
39 10 33 45 50 89 77 65 67 99
5.Sắp xếp vun đống (heap)
Tạo mảng 50,10,33,65,77,89,39,45,67,99 thành 1 đống(maxheap)

50

10 33

65 77 89 39

45 67 99

50

10 33

65 99 89 39

45 67 77

50

10 33

67 99 89 39

45 65 77
50

10 89

67 99 33 39

45 65 77

50

99 89

67 77 33 39

45 65 10

99

77 89

67 50 33 39

45 65 10

T(n) = O(nlogn)
6.Sắp xếp trộn(merge)
Trộn phân đoạn cuối {50,10,33,65,77,89,39,45,67,99} (i=0,j=5)
10,33,50,65,77 39,45,67,89,99
i=2;j=5 10,33,39,50,65,77 45,67,89,99
i=3;j=6 10,33,39,45,50,65,77 67,89,99
i=6;j=7 10,33,39,45,50,65,67,77 89,99
i=7;j=7 10,33,39,45,50,65,67,77,89,99
Cây nhị phân
Cây nhị phân lý tưởng là một loại cây nhị phân trong đó mỗi nút bên trong có
đúng hai nút con và tất cả các nút lá đều ở cùng một mức.

Cây thoái hóa là cây có một nút con bên trái hoặc phải.

Cây nhị phân cân bằng là một loại cây nhị phân trong đó sự chênh lệch giữa cây
con bên trái và cây con bên phải cho mỗi nút là 0 hoặc 1.
Cho mảng {50,10,33,65,77,89,39,45,67,99}
Vẽ cây nhị phân hoàn chỉnh

50

10 33

65 77 89 39

45 67 99

Duyệt thứ tự trước : 50,10,65,45,67,77,99,33,89,39


Duyệt thứ tự giữa : 45,65,67,10,99,77,50,89,33,39
Duyệt thứ tự sau : 45,67,65,99,77,10,89,39,33,50

Vẽ cây nhị phân tìm kiếm

50

65
10

77

45 33
67 89

39

99
Duyệt trước : 50,10,45,33,39,65,77,67,89,99
Duyệt giữa : 45,10,33,39,50,65,67,77,89,99
Duyệt sau : 45,39,33,10,67,99,89,77,65,50
Chuyển cây tổng quát về cây nhị phân
Data structure and Algorithms
Graph – Đồ thị
Thanh-Hai Tran

Electronics and Computer Engineering


School of Electronics and Telecommunications
Hanoi University of Science and Technology
1 Dai Co Viet - Hanoi - Vietnam
Nội dung bài học

 Các khái niệm cơ bản


 Biểu diễn đồ thị
 Ma trận lân cận
 Danh sách lân cận
 Duyệt đồ thị
 Bài toán áp dụng
 Tìm cây khung cực tiểu
 Tìm đường đi ngắn nhất
 Bài tập
 Tài liệu tham khảo

2020 2
Cây khung

 Cây: đồ thị vô hướng, không có chu trình

 Trong đồ thị vô hướng, liên thông: cây khung là cây


có chứa tất cả các đỉnh của G

2020 3
Cây khung tối thiểu
(Minimum Spanning Tree)
 Được sử dụng rộng rãi để thiết kế các mạng , MST
cho phép giá tối ưu không chu trình
 Được sử dụng để tìm kiếm đường hàng không (đỉnh
là thành phố, cạnh là đường nối giữa các thành
phố). MST được sử dụng để tối ưu đường hàng
không bởi tìm ra đường đi ngắn nhất không chu trình
 MST được sử dụng để tìm cách rẻ nhất để nối các
trạm cuối thông qua các thành phố , hàng không,
đường điện thoại
 Được sử dụng trong các bài toán định tuyến
(routing)

2020 4
Cây khung cực tiểu

 Cho một đồ thị vô hướng, liên thông có trọng số


 Giá trị của một cây khung là tổng trọng số của các
cung trong cây
 Tìm một cây khung với giá trị nhỏ nhất trên đồ thị

2020 5
Giải thuật Kruskal

 Lần lượt thêm vào cây khung cần tìm các cung có
trọng số nhỏ nhất có được tại một thời điểm nếu
cung đó không tạo thành chu trình trên phần cây
khung đang tạm có
 Khởi tạo: F = {{A}, {B}, {C}, {D}, {E}, {F}}
MST = {}
Q = {(A, D), (E, F), (C, E), (E, D), (C, D), (D, F),
(A, C), (A, B), (B, C)}

2020 6
Giải thuật Kruskal

 Bước 1: Loại bỏ cạnh (A,D) từ Q và thực hiện các


thay đổi sau:

 Bước 2: Loại bỏ cạnh (E, F) từ Q và thực hiện:

2020 7
Giải thuật Kruskal

 Bước 4: Bỏ (E,D) từ Q và thực hiện:

 Bước 5: Bỏ (C,D) từ Q:

2020 8
Giải thuật Kruskal

 Bước 6: Bỏ (D,F)

 Bước 7: Bỏ (A,C)

 Bước 8: Bỏ (A,B)

2020 9
Giải thuật Kruskal

 Bước 9: Giải thuật tiếp tục cho đến khi Q = empty

2020 10
Giải thuật Kruskal

2020 11
Bài toán tìm đường đi ngắn nhất

 Tìm đường đi ngắn nhất giữa 1 cặp đỉnh (i,j)


 Tìm đường đi ngắn nhất từ 1 đỉnh nguồn tới tất
cả các đỉnh còn lại
 Tìm đường đi ngắn nhất giữa mọi cặp đỉnh

2020 12
Giải thuật Dijkstra

 Đặc trưng:
 Giải quyết bài toán tìm đường đi ngắn nhất giữa 1 cặp
đỉnh và bài toán tìm đường đi ngắn nhất từ một nguồn
tới mọi đích
 Chỉ áp dụng trên đồ thị có trọng số dương
 Ý tưởng:
 Với mỗi đỉnh v sẽ duy trì các thông số sau
 D[v] : Khoảng cách ngắn nhất biết được tại thời điểm
hiện tại từ đỉnh nguồn s tới đỉnh v.
 P[v] : Đỉnh trước của đỉnh v trên đường đi từ đỉnh nguồn
s tới v

2020 13
Giải thuật Dijkstra

 Thực hiện:
 Duy trì một cụm C chứa các đỉnh, cụm này lúc đầu
chứa đỉnh xuất phát đã cho.
 Dần dần thêm các đỉnh vào trong cụm
 Tại mỗi bước của giái thuật
 Xác định đỉnh u chưa ở trong C có giá trị d[u] nhỏ nhất
đưa vào trong C.
 Cập nhật lại giá trị d của các đỉnh lân cận của u.

2020 14
Ví dụ minh họa

2020
Ví dụ minh họa

2020
Ví dụ minh họa

2020
Ví dụ minh họa

2020
Ví dụ minh họa

2020
Ví dụ minh họa

2020
Ví dụ minh họa

2020
Ví dụ minh họa

2020
Ví dụ minh họa

2020
Ví dụ minh họa

2020
Ví dụ minh họa

2020
Ví dụ minh họa

2020
Giải thuật Dijkstra

2020
Bài tập

 Viết CT khởi tạo một đồ thị G(V,E) vô hướng, có


trọng số
 Viết CT duyệt đồ thị theo chiều rộng
 Viết CT duyệt đồ thị theo chiều sâu
 Viết CT tìm cây khung cực thiểu của G

2020 28
Tài liệu tham khảo

 Bài giảng – Nguyễn Thanh Bình - ĐTVT


 Bài giảng – Đỗ Bích Diệp
 Chapter 13 - Graph – Data structure in C – Rema
Thareja - 2014

2020 29
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI ĐỀ THI CUỐI KỲ 2021.1
TRƯỜNG ĐIỆN – ĐIỆN TỬ Học phần: ET2100 – CẤU TRÚC DỮ LIỆU VÀ
GIẢI THUẬT
Đề số: 01 Tổng số trang: 1 Ngày thi: 07/02/2022
Thời gian làm bài: 75 phút
(Được sử dụng tài liệu)
Ký Trưởng nhóm/Giảng viên phụ trách HP: Khoa phụ trách HP:
duyệt

Cho một chuỗi các số nguyên K sinh ra bằng cách nhập Mã số sinh viên và Họ tên sinh viên vào
file excel đính kèm. Giả sử chuỗi K gồm các số sau: {71, 58, 74, 84, 70, 21}
Câu 1. Mảng và tìm kiếm (1,5đ)
- (0,5đ) Khai báo và khởi tạo mảng các số nguyên từ chuỗi K
- (1đ) Viết hàm tìm cặp số trong mảng có tổng bằng một số cho trước. In ra màn hình cặp số và
trả về 1 nếu tìm thấy, trả về 0 nếu không tồn tại cặp số nào. Ví dụ với chuỗi K, tổng là 95 có thể
tìm thấy cặp số (74, 21)
Câu 2. Danh sách liên kết đơn (2,5đ)
Cho một hàm như sau: f(x, y) = K[0]x3y2+K[1]x2 y + K[2]xy + K[3]x+ K[4]y + K[5] với K[i] là
phần tử thứ i trong chuỗi K ở trên
- (0,5đ) Vẽ minh hoạ danh sách liên kết biểu thị hàm số trên
- (0,5đ) Định nghĩa cấu trúc nút của danh sách và cấu trúc danh sách liên kết đơn biểu diễn hàm
số theo cách trên
- (0,5đ) Viết hàm chèn vào một phần tử vào cuối danh sách liên kết đơn biểu diễn hàm số
- (0,5đ) Viết hàm hiển thị hàm f(x,y) như trên
- (0,5đ) Viết hàm tính giá trị hàm f(x,y) tại một (x,y) nào đó với cách biểu diễn f(x,y) bằng danh
sách liên kết ở câu trên
Câu 3. Cây (2đ)
- (0,5đ) Vẽ cây nhị phân hoàn chỉnh (BT) từ chuỗi K - (0,5đ) Trật tự các nút khi duyệt cây theo
thứ tự trước.
- (0,5đ) Vẽ cây nhị phân tìm kiếm (BST) từ chuỗi K và trật tự các nút khi duyệt BST theo thứ tự
giữa
- (0,5đ) Chuyển cây nhị phân tìm kiếm (BST) thành MaxHeap và trật tự các nút khi duyệt đống
theo thứ tự sau.
Câu 4. Đồ thị (2,5đ) Cho đồ thị vô hướng có trọng số được biểu diễn bởi ma trận đỉnh cận kề trong
đó M[i,j]=INF được hiểu là không có cạnh giữa nút i và j
K[0] K[1] K[2] K[3] K[4] K[5]
K[0] INF 3 INF INF INF 10
K[1] 3 INF 12 INF 1 5
K[2] INF 12 INF 4 9 8
K[3] INF INF 4 INF 7 INF
K[4] INF 1 9 7 INF 6
K[5] 10 5 8 INF 6 INF
- (0.5đ) Cho một đồ thị với các nút có ID là các giá trị trong chuỗi K. Vẽ đồ thị.
- (0.5đ) Trật tự các nút và trạng thái của stack khi duyệt đồ thị theo chiều sâu bắt đầu nút có ID
nhỏ nhất
- (0.5đ) Trật tự các nút và trạng thái của queue khi duyệt đồ thị theo chiều rộng bắt đầu nút có ID
lớn nhất
- (1đ) Tìm cây khung nhỏ nhất của đồ thị bằng giải thuật Kruskal và tìm tổng trọng số của cây
khung tối thiểu
Câu 5. Sắp xếp (1,5đ) Cho một tập hợp các công việc, mỗi công việc được biểu diễn bởi một cặp số
lưu thời gian bắt đầu và kết thúc. Xác định số công việc lớn nhất mà một người có thể làm, biết rằng
một người chỉ làm một việc tại tại một thời điểm. Nêu tư tưởng của thuật toán và thực hiện với ví dụ
gồm các hoạt động sau {1, 2}, {4, 6}, {0, 5}, {5, 8}, {2, 7}, {1, 9}, {6, 10}, {8, 9}, {8, 11}, {2, 10},
{12, 13}.

-------------------- Hết ------------------------

1.
2.

Head K[0]x^3y^2 K[1]x^2y K[2]xy

NULL K[5] K[4]y K[3]x


3.cây nhị phân hoàn chỉnh
71

58 74

84 70 21

Duyệt cây theo trước : 71,58,84,70,74,21

Cây nhị phân tìm kiếm

71

58 74

21 70 84

Duyệt cây theo giữa : 21,58,70,71,74,84

Chuyển cây nhị phân tìm kiếm thành maxheap

71

70 74

21 58 84
71

70
84

21 58 74

84

70 74

21 58 71

Duyệt cây theo sau: 21,58,70,71,74,84

4. 12
58 74
3 4
5
71
10 1 8 7 84
9

70 6 21
-Trật tự các nút và trạng thái stack khi duyệt theo chiều sâu từ nút 21

Nút đã duyệt Nút đang chờ duyệt(stack) Nút còn lại


21 70,71,58,74,84
21 71,58,74,70 84
21,71 58,74,70 84
21,71,58 74,70 84
21,71,58,74 84,70
21,71,58,74,84 70
21,71,58,74,84,70

-Trật tự các nút và trạng thái queue khi duyệt theo chiều rộng từ nút 84

Nút đã duyệt Nút đang chờ duyệt(queue) Nút còn lại


84 71,58,74,70,21
84 74,70 71,58,21
84,74 70,58,21 71
84,74,70 58,21 71
84,74,70,58 21,71
84,74,70,58,21 71
84,74,70,58,21,71

-Tìm cây khung nhỏ nhất bằng giải thuật Kruskal

Khởi tạo
MST = {}
Q = {(58,70);(71,58);(74,84);(58,21);(70,21);(84,70);(74,21);(74,70);(71,21);(58,74)}

Bước 1: Loại bỏ cạnh (58,70) từ Q thêm vào MST


MST = {(58,70)}
Q = {(71,58);(74,84);(58,21);(70,21);(84,70);(74,21);(74,70);(71,21);(58,74)}

58 74

71
84
1

70 21
Bước 2 : Loại bỏ cạnh (71,58) them vào MST
MST = {(58,70);(71,58)}
Q = {(74,84);(58,21);(70,21);(84,70);(74,21);(74,70);(71,21);(58,74)}

58 74
3
71
84
1

70 21

Bước 3: Loại bỏ cạnh (74,84) them vào MST


MST = {(58,70);(71,58);(74,84)}
Q = {(58,21);(70,21);(84,70);(74,21);(74,70);(71,21);(58,74)}

58 74
3 4
71
84
1

70 21

Bước 4: Loại bỏ cạnh (58,21) them vào MST


MST = {(58,70);(71,58);(74,84);(58,21)}
Q = {(70,21);(84,70);(74,21);(74,70);(71,21);(58,74)}

58 74
3 4
5
71
84
1

70 21
Bước 5: Loại bỏ cạnh (70,21) không thêm vào MST vì nó tạo thành 1 chu trình
MST = {(58,70);(71,58);(74,84);(58,21)}
Q = {(84,70);(74,21);(74,70);(71,21);(58,74)}

Bước 6: Loại bỏ cạnh (84,70) thêm vào MST


MST = {(58,70);(71,58);(74,84);(58,21),(84,70)}
Q = {(74,21);(74,70);(71,21);(58,74)}

58 74
3 4
5
71
84
1 7

70 21

Khi số cạnh của MST bằng số đỉnh của đồ thị -1 ta thu được cây khung nhỏ nhất với tổng trọng số
là: 1+3+4+5+7 = 20.

5.
Sắp xếp từng công việc sao cho thời gian kết thúc tăng dần:
Q = (1,2);(0,5);(4,6);(2,7);(5,8);(1,9);(2,10);(6,10);(8,11);(12,13)
R = {}
Lấy lần lượt từng công việc . Nếu thời gian bắt đầu >= thời gian kết thúc của công việc cuối cùng
trong R thì lấy.

Bước 1 : lấy (1,2) => R = {1,2}


Bước 2 : bỏ (0,5)
Bước 3 : bỏ (4,6)
Bước 4 : lấy (2,7) => R = {(1,2);(2,7)}
Bước 5 : bỏ (5,8)
Bước 6 : bỏ (1,9)
Bước 7 : bỏ (2,10)
Bước 8 : bỏ (6,10)
Bước 9 : lấy (8,11) => R = {(1,2);(2,7);(8,11)}
Bước 10 : lấy (12,13) => R = {(1,2);(2,7);(8,11),(12,13)}
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI ĐỀ THI MÔN: CTDL & GT
VIỆN ĐIỆN TỬ - VIỄN THÔNG Lần thi: Cuối kỳ Ngày thi: 18.08.2021
-------- Thời gian làm bài: 75 phút
Mã đề: Tổng số trang: 1 (Được sử dụng slide, sách vở)

Ký duyệt Trưởng nhóm Môn học: Trưởng Bộ môn:

Cho dãy khóa K = {76,69,78,62,25,89}được tạo ra bằng cách nhập MSSV và họ tên của
sinh viên vào file excel có tên là “K.xlsx”. (Sinh viên không nhập đúng thông tin của
mình sẽ nhận điểm 0)
1. Trình bày sự thay đổi của dãy K trong quá trình thực hiện các thuật toán sắp xếp:
a. Lựa chọn (Selection sort). (1.5đ)
b. Phân đoạn (Partition sort) (1đ)
2. Mô tả cấu trúc của ngăn xếp có kích thước N=4 và dãy thao tác sau: (1.5đ)
A={1, 1, 1, 0, 1, 0, 1}
Với Ai = 1 : Push lần lượt một phần của dãy K vào ngăn xếp
Ai = 0 : Pop một phần tử ra khỏi ngăn xếp
3. Dựng cây nhị phân tìm kiếm từ dãy K (0.5đ), sau đó hãy:
a. Duyệt cây theo thứ tự trước (0.5đ)
b. Duyệt cây theo thứ tự giữa (0.5đ)
c. Duyệt cây theo thứ tự sau (0.5đ)
d. Tạo đống ban đầu cho thuật toán sắp xếp vun đống (Heap sort). (0.5đ)
4. Cho đồ thị G với các đỉnh là các phần tử của dãy K và các cạnh được lưu trữ bằng
ma trận lân cận A (ma trận trọng số) sau:
76 69 78 62 25 89
76

θ 2 2 θ θ θ
69

2 θ 3 6 2 θ
78

2 3 θ 5 θ 3
θ 6 5 θ 4 1
62

θ 2 θ 4 θ θ
θ θ θ θ
25

3 1
89

Lưu ý: A[i, j] là trọng số của cung nối từ đỉnh i đến đỉnh j.


A[i,j]= θ thể hiện không tồn tại cung nối đỉnh i tới đỉnh j.
a. Vẽ đồ thị G. (1đ)
b. Cho biết thứ tự duyệt đồ thị G theo chiều sâu bắt đầu từ đỉnh nhỏ nhất. (1đ)
c. Cho biết thứ tự duyệt đồ thị G theo chiều rộng bắt đầu từ đỉnh nhỏ nhất. (1đ)
d. Tìm đường đi ngắn nhất từ đỉnh nhỏ nhất đến tất cả các đỉnh còn lại bằng thuật
toán Dijkstra (mô tả bằng bảng). (0.5đ)
Câu 1:
a,Selecsion sort

No Min K[0] K[1] K[2] K[3] K[4] K[5]


76 69 78 62 25 89
1 25 25 69 78 62 76 89
2 62 25 62 78 69 76 89
3 69 25 62 69 78 76 89
4 76 25 62 69 76 78 89
5 78 25 62 69 76 78 89

b, Phân đoạn (Partition sort)


Chốt 76 , i=0,j=5

76 69 78 62 25 89

76 69 25 62 78 89 (swap K[i = 2] với K[j = 4])

62 69 25 76 78 89 (swap chốt với K[j=3])

Câu 2

Thao tác stack


1 76
1 69 , 76
1 78 , 69 , 76
0 69 , 76
1 62 , 69 , 76
0 69 , 76
1 25 , 69 ,76

Câu 3
Cây nhị phân tìm kiếm

76

69 78

62 89

25
a, trước : 76,69,62,25,78,89
b,giữa: 25,62,69,76,78,89
c,sau : 25,62,69,89,78,76
d, tạo đống
4.

3
69
78
2
3
76 2
6
2 5
89

25 1
62
4

Duyệt theo chiều sâu từ đỉnh 25:


25,62,89,78,76,69
Duyệt theo chiều rộng từ đỉnh 25:
25,62,69,89,78,76

25 62 89 78 76 69
0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)
- (4,25) (∞,-) (∞,-) (∞,-) (2,25)
(4,25) (∞,-) (5,69) (4,69) -
(4,25) (∞,-) (5,69) -
- (5,62) (5,69)
(5,62) -
-

You might also like