Professional Documents
Culture Documents
CTDL Đã G P Đã G P
CTDL Đã G P Đã G P
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
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
2020 2
Cây khung
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
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
2020 7
Giải thuật Kruskal
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
2020 10
Giải thuật Kruskal
2020 11
Bài toán tìm đường đi ngắn nhất
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
2020 28
Tài liệu tham khảo
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}.
1.
2.
58 74
84 70 21
71
58 74
21 70 84
71
70 74
21 58 84
71
70
84
21 58 74
84
70 74
21 58 71
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
-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
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)}
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
58 74
3 4
71
84
1
70 21
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)}
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.
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
76 69 78 62 25 89
Câu 2
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
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) -
-