Tải bản đầy đủ (.docx) (73 trang)

(TIỂU LUẬN) báo cáo CUỐI kỳ TỔNG hợp môn cấu TRÚC dữ LIỆU và GIẢI THUẬT

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (723.67 KB, 73 trang )

TỔNG LIÊN ĐỒN LAO ĐỘNG VIỆT NAM TRƯỜNG ĐẠI
HỌC TƠN ĐỨC THẮNG KHOA CƠNG NGHỆ THƠNG TIN

ĐỒ ÁN CUỐI KÌ
MƠN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

BÁO CÁO CUỐI KỲ TỔNG HỢP MÔN CẤU
TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Người hướng dẫn: TS VÕ HỒNG QN

Người thực hiện:

NGUYỄN DUY ĐƠNG – 52000749

Lớp

: 20050301
Khố

THÀNH PHỐ HỒ CHÍ MINH, NĂM 2022

: 24


TỔNG LIÊN ĐỒN LAO ĐỘNG VIỆT NAM TRƯỜNG ĐẠI
HỌC TƠN ĐỨC THẮNG KHOA CƠNG NGHỆ THƠNG TIN

ĐỒ ÁN CUỐI KÌ
MƠN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT


BÁO CÁO CUỐI KỲ TỔNG HỢP MÔN CẤU
TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Người hướng dẫn: TS VÕ HỒNG QN

Người thực hiện:

NGUYỄN DUY ĐƠNG – 52000749

Lớp

: 20050301
Khố

THÀNH PHỐ HỒ CHÍ MINH, NĂM 2022

: 24


i

LỜI CẢM ƠN
Em xin chân thành cảm ơn thầy Võ Hoàng Quân đã đồng hành và giúp đỡ em trong học kí vừa
qua, cũng như nhờ thầy mà em có thể tiếp thu và hiểu được môn học Cấu trúc dữ liệu và giải
thuật. Lần nữa, em xin chân thành cảm ơn.


ii

ĐỒ ÁN ĐƯỢC HỒN THÀNH

TẠI TRƯỜNG ĐẠI HỌC TƠN ĐỨC THẮNG
Tôi xin cam đoan đây là sản phẩm đồ án của riêng tôi và được sự hướng dẫn của
TS Võ Hoàng Quân;. Các nội dung nghiên cứu, kết quả trong đề tài này là trung thực
và chưa công bố dưới bất kỳ hình thức nào trước đây. Những số liệu trong các bảng
biểu phục vụ cho việc phân tích, nhận xét, đánh giá được chính tác giả thu thập từ các
nguồn khác nhau có ghi rõ trong phần tài liệu tham khảo.
Ngồi ra, trong đồ án cịn sử dụng một số nhận xét, đánh giá cũng như số liệu
của các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồn gốc.
Nếu phát hiện có bất kỳ sự gian lận nào tơi xin hồn tồn chịu trách nhiệm
về nội dung đồ án của mình. Trường đại học Tôn Đức Thắng không liên quan đến
những vi phạm tác quyền, bản quyền do tôi gây ra trong q trình thực hiện (nếu có).

TP. Hồ Chí Minh, ngày 10 tháng 1 năm 2022
Tác giả
(ký tên và ghi rõ họ tên)
Đông
Nguyễn Duy Đông


iii

PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN
Phần xác nhận của GV hướng dẫn

_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________

_________________________________________________________
Tp. Hồ Chí Minh, ngày tháng năm
(kí và ghi họ tên)

Phần đánh giá của GV chấm bài

_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
_________________________________________________________
Tp. Hồ Chí Minh, ngày tháng năm
(kí và ghi họ tên)


iv

TÓM TẮT

BÁO CÁO GỒM CÓ HAI PHẦN:
PHẦN 1: ĐỀ BÀI
PHẦN 2: PHÂN TÍCH VÀ GIẢI QUYẾT YÊU CẦU


1

MỤC LỤC
DANH MỤC KÍ HIỆU VÀ CHỮ VIẾT TẮT................................................................3

DANH MỤC CÁC BẢNG BIỂU, HÌNH VẼ, ĐỒ THỊ.................................................4
PHẦN 1 – ĐỀ BÀI.........................................................................................................5
I. Đệ Quy.............................................................................................................5
II. Sắp xếp...........................................................................................................5
III. Stack..............................................................................................................5
IV. Cấu trúc dữ liệu Danh sách và Cây................................................................6
V. Đồ thị..............................................................................................................6
PHẦN 2 - PHÂN TÍCH VÀ GIẢI QUYẾT YÊU CẦU.................................................8
I. Đệ quy..............................................................................................................8
1.1 Lý thuyết 8
1.2 Thực hành

17

II. Sắp xếp......................................................................................................... 18
2.1 Khởi tạo mảng gồm 10 phần tử:

18

III. Stack............................................................................................................ 29
3.1
trung tố (Infix) sang hậu tố (postfix)

Chuyển đổi biểu thức
29

3.2 Tính biểu thức hậu tố (postfix) 31
IV. Cấu trúc dữ liệu Danh sách và Cây.............................................................. 32
4.1


Lý thuyết

32

4.2

Thực hành

34

4.2.1 Cài đặt code bằng Linked List

34

4.2.2 Cài đặt code bằng cây AVL 39
V. Đồ thị............................................................................................................ 48
5.1 Lý thuyết 48
5.1.1 Đồ thị người dùng
5.1.2 Duyệt đồ thị

48
48


2

5.2

Thực hành


55

TÀI LIỆU THAM KHẢO............................................................................................ 61


3

DANH MỤC KÍ HIỆU VÀ CHỮ VIẾT TẮT


4

DANH MỤC CÁC BẢNG BIỂU, HÌNH VẼ, ĐỒ THỊ


5

PHẦN 1 – ĐỀ BÀI
I. Đệ Quy
a. (0.5 điểm – Lý thuyết) Chọn mỗi nhóm 01 bài tốn và giải thích tính
đệ quy (diễn giải, vẽ cây đệ quy với một ví dụ gồm ít nhất 5 lần gọi đệ
quy):
i. Nhóm 1:
• Giải bài tốn xy
• Giải bài tốn tính tổng các chữ số của một số nguyên dương gồm
số.
chữ

ii. Nhóm 2:


• Giải bài tốn tính số fibonacci thứ .
• Giải bài tốn tính tổ hợp chập
tìm số lớn nhất trong một mảng.
b. (0.5 điểm – Thực hành) Tạo một lớp bất kỳ để định nghĩa code bằng
đệ quy cho 02 ví dụ đã chọn bên trên và tạo phương thức main() để
kiểm tra lại kết quả.

II. Sắp xếp
Sinh viên tự cho một mảng số nguyên gồm 10 phần tử (thứ tự của phần
tử phải là ngẫu nhiên, không được nằm trong các trường hợp mảng đã
có thứ tự sẵn hoặc một phần mảng đã có thứ tự)
a. (0.5 điểm – Lý thuyết) Cho ví dụ chạy từng bước việc sắp xếp
mảng dùng 02 trong 03 giải thuật Bubble Sort, Insertion Sort hoặc
Selection Sort. (Sinh viên lưu ý phải thể hiện rõ sự thay đổi của các phần
tử trong mảng qua từng bước).
b. (0.5 điểm – Lý thuyết) Cho ví dụ chạy từng bước việc sắp xếp
mảng dùng 01 trong 02 giải thuật Merge Sort hoặc Quick Sort. (Sinh
viên lưu ý phải thể hiện rõ sự thay đổi của các phần tử trong mảng qua
từng bước).
BI.

Stack
a) (1 điểm – Lý thuyết) Trình bày giải thuật sử dụng Stack để tạo biểu

thức Ba Lan ngược (Reverse Polish notation – RPN). Giải thuật này
chuyển một biểu thức từ dạng trung tố (infix) sang dạng hậu tố (postfix).
Cho ví dụ một biểu thức infix gồm ít nhất 6 phép tốn (có đủ phép cộng
(+), trừ (-), nhân (*) và chia (/)) và chứa ít nhất 2 cặp ngoặc, áp dụng
giải thuật để chuyển biểu thức này thành dạng postfix.



6

b) (1 điểm – Lý thuyết) Trình bày giải thuật sử dụng Stack để tính kết

quả từ biểu thức postfix. Áp dụng giải thuật tính tốn biểu thức postfix
tại câu a).

IV. Cấu trúc dữ liệu Danh sách và Cây
Lý thuyết (1.5 điểm):
Phân tích bài tốn quản lý sinh viên bằng Mảng (Array), Linked List và
bằng cây AVL. Nêu ưu điểm và nhược điểm, so sánh hiệu suất của các
cấu trúc dữ liệu trên các thao tác:
a) (0.25 điểm) Thêm một sinh viên mới
b) (0.25 điểm) Xóa sinh viên
c) (0.25 điểm) Tìm kiếm sinh viên
Thực hành (1.5 điểm):
Cài đặt bài tốn trên bằng Linked List (không sử dụng thư viện) và
bằng cây AVL với dữ liệu tự cho. Tối thiếu 15 đối tượng sinh viên. Mỗi
đối tượng sinh viên có các thuộc tính: mã số sinh viên (mã 8 ký tự, ký tự
đầu có thể là chữ cái), họ tên sinh viên, điểm trung bình tích lũy và 2
thuộc tính khác sinh viên tự cho thêm. Hiện thực phương thức cho các
thao tác sau trên cả hai cấu trúc dữ liệu. (cây AVL lưu trữ theo mã số
sinh viên)
a) (0.25 điểm) Hiện thực thao tác thêm một sinh viên mới.
b) (0.25 điểm) Hiện thực thao tác xóa một sinh viên.
c) (0.25 điểm) Hiện thực thao tác tìm kiếm thơng tin theo mã số sinh
viên.

V. Đồ thị

Xây dựng đồ thị biểu diễn người dùng của một mạng xã hội mỗi người
dùng gồm các thông tin sau mã người dùng, tên người dùng, số tuổi, giới
tính, nghề nghiệp.
Lý thuyết (1.5 điểm):
a) (0.25 điểm) Vẽ đồ thị trên với ký hiệu đỉnh là mã người dùng, mỗi
người dùng có kết bạn với nhau sẽ được biểu diễn bằng cạnh nối giữa
hai đỉnh người dùng. Đồ thị gồm ít nhất 30 đỉnh và 50 cạnh. Đồ thị có
thể chứa một vài đỉnh cơ lập.
b) (0.5 điểm) Viết kết quả duyệt đồ thị bằng giải thuật BFS và DFS bắt
đầu từ một đỉnh sinh viên tự chọn.
Thực hành (1.5 điểm):
a) (0.25 điểm) Sinh viên tự cho file text, đọc file và biểu diễn đồ thị trên
(có thể dùng ma trận kề, danh sách kề, danh sách cạnh).


7

b) (0.25 điểm) Viết phương thức trả về danh sách bạn bè của một người

dùng truyền vào.
c) (0.25 điểm) Viết phương thức xác định hai tài khoản truyền vào có
bao nhiêu bạn chung.


8

PHẦN 2 - PHÂN TÍCH VÀ GIẢI QUYẾT YÊU CẦU
I. Đệ quy
1.1 Lý thuyết
a) Tính S(x, y) = xy.

Lũy thừa bật 0 của một số bất kỳ thì bằng 1. Áp dụng điều này ta có được
điều kiện dừng của chương trình đệ quy là:
if (y == 0)
return 1;
Tùy theo giá trị của y mà biểu thức đệ quy có thể khác nhau. Các trường hợp
có thể xảy ra đối với y:
 Trường hợp 1: y > 0
Lúc này xy = x*x*x*…*x (y lần).
x*S(x, y-1).
Biểu thức đệ quy lúc này sẽ là:
 Trường hợp 2: y < 0
(y lần).
Lúc này x

Biểu thức đệ quy:

1 .0
x *S(x, y + 1).

Ví dụ 1: Tính S(2,5).

Giải:
Kết quả chạy của chương trình sẽ được biểu diễn ở cây đệ quy sau:


9

S(2, 5)

2*S(2, 4) = 2 * 16 = 32


S(2, 4)

Trình tự thực hiện như sau:
 Đệ quy lần 1:
int S(int 2, int 5) //(int x, int y){
if (5 == 0) // false
return 1; //không thực hiện lệnh return trong
if if (y > 0) // true
return 2*S(2,4); // Gọi đệ quy
if (y < 0) // false
1 .0
return x *S(x, y + 1); //không thực hiện lệnh return
}
 Đệ quy lần 2:

int S(int 2, int 4) //(int x, int y){
if (4 == 0) // false
return 1; //không thực hiện lệnh return trong
if if (y > 0) // true
return 2*S(2,3); // Gọi đệ quy
if (y < 0) // false

return

1 .0
x *S(x, y + 1); //không thực hiện lệnh return


}

 Đệ quy lần 3:

int S(int 2, int 3) //(int x, int y){
if (3 == 0) // false


10

return 1; //không thực hiện lệnh return trong
if if (y > 0) // true
return 2*S(2,2); // Gọi đệ quy
if (y < 0) // false
1 .0
return x *S(x, y + 1); //không thực hiện lệnh return
}

 Đệ quy lần 4:

int S(int 2, int 2) //(int x, int y){
if (2 == 0) // false
return 1; //không thực hiện lệnh return trong
if if (y > 0) // true
return 2*S(2,1); // Gọi đệ quy
if (y < 0) // false

return

1 .0
x *S(x, y + 1); //không thực hiện lệnh return


}
 Đệ quy lần 5:

int S(int 2, int 1) //(int x, int y){
if (1 == 0) // false
return 1; //không thực hiện lệnh return trong
if if (y > 0) // true
return 2*S(2,0); // Gọi đệ quy
if (y < 0) // false

return

1 .0
x *S(x, y + 1); //không thực hiện lệnh return

}
 Đệ quy lần 6:

int S(int 2, int 0) //(int x, int y){
if (0 == 0) // true
return 1; // thực hiện lệnh return


11

//Không thực hiện các lệnh bên dưới
if (y > 0) // false
return 2*S(2,0); // Gọi đệ quy
if (y < 0) // false
1 .0

return x *S(x, y + 1); //không thực hiện lệnh return
}
 Sau khi chương trình gặp điều kiện dừng tại lần gọi đệ quy thứ 6, kết

quả của phép toán như sau:
 S(2,0) = 1
 S(2,1) = 2*S(2,0) = 2*1 = 2
 S(2,2) = 2*S(2,1) = 2*2 = 4
 S(2,3) = 2*S(2,2) = 2*4 = 8
 S(2,4) = 2*S(2,3) = 2*8 = 16
 S(2,5) = 2*S(2,4) = 2*16 = 32
Ví dụ 2: Tính S(2,-5)
Giải:
Kết quả của chương trình được biểu diễn ở cây đệ quy sau:
S(2, -5)

*S(2, -4) = * =

S(2, -4)
S(2, -3)

*S(2, -2) = *

S(2, -2)

Trình tự thực hiện như sau:
 Đệ quy lần 1:
int S(int 2, int -5) //(int x, int y){
if (5 == 0) // false



return 1; //không thực hiện lệnh return trong
if if (y > 0) // fasle


12

return 2*S(x, y-1); //không thực hiện lệnh return trong if
if (y < 0) // true
1 .0
return x *S(2, -4); //Gọi đệ quy
}

 Đệ quy lần 2:

int S(int 2, int -4) //(int x, int y){
if (-4 == 0) // false
return 1; //không thực hiện lệnh return trong
if if (y > 0) // fasle
return 2*S(x, y-1); // không thực hiện lệnh return trong if
if (y < 0) // true
1 .0
return x *S(2, -3); //Gọi đệ quy
}
 Đệ quy lần 3:

int S(int 2, int -3) //(int x, int y){
if (-2 == 0) // false
return 1; //không thực hiện lệnh return trong
if if (y > 0) // fasle

return 2*S(x, y-1); // không thực hiện lệnh return trong if
if (y < 0) // true
1 .0
return x *S(2, -2); //Gọi đệ quy
}
 Đệ quy lần 4:

int S(int 2, int -2) //(int x, int y){
if (-2 == 0) // false
return 1; //không thực hiện lệnh return trong if


13

if (y > 0) // fasle
return 2*S(x, y-1); // không thực hiện lệnh return trong if
if (y < 0) // true
1 .0
return x *S(2, -1); //Gọi đệ quy
}

 Đệ quy lần 5:

int S(int 2, int -1) //(int x, int y){
if (-1 == 0) // false
return 1; //không thực hiện lệnh return trong
if if (y > 0) // fasle
return 2*S(x, y-1); // không thực hiện lệnh return trong if
if (y < 0) // true
1 .0

return x *S(2, 0); //Gọi đệ quy
}
 Đệ quy lần 6:

int S(int 2, int 0) //(int x, int y)
{ if (0 == 0) // true
return 1; //thực hiện lệnh return
//Không thực hiện các lệnh bên dưới
if (y > 0) // fasle
return 2*S(x, y-1); // không thực hiện lệnh return trong if
if (y < 0) // false
1 .0
return x *S(x, y + 1); //Không thực hiện lệnh return
}
 Sau khi chương trình gặp điều kiện dừng tại lần gọi đệ quy thứ 6, kết

quả của phép toán như sau:
 S(2,0) = 1


14

 S(2,1) =

1
1
1
2*S(2,0) = 2*1 = 2

1

1
1
1
2*S(2,1) = 2* 2 = 4
1
1
1
1
 S(2,3) = 2*S(2,2) = 2* 4 = 8
1
1
1
1
 S(2,4) = 2*S(2,3) = 2* 8 = 16
1
1
1
1
 S(2,5) = 2*S(2,4) = 2* 16 = 32
 S(2,2) =

k

b) Tính C(n,k) = C

n

Tính chất của tổ hơp:
0
n

 C n=C n=1
1
 C n=n
k − 1
k
k
 C n − 1 + C n−1 = C n
Dựa vào các tính chất trên ta thấy:
 Khi:
o k = 0 hoặc k = n thì Ckn = 1
if (k == 0 || k == n)
return 1;
k
o k = 1 thì C n = n
if (k == 1)
return n;
 Tính dừng của đệ quy
 Biểu thức đệ quy:
C(n-1, k) + C(n-1, k-1)
Ví dụ: Tính C(5,4)
Giải:
Kết quả chạy của chương trình được biểu diễn ở cây đệ quy sau:
return

5

C(5,4)
return

1


return

4

C(4,3)

C(4,4)
return

1

C(3,3)

return

3

C(3,2)


15

Trình tự thực hiện của chương trình như sau:
int C(5,4) // (int n, int k) {
if (4 == 0 || 4 == 5) // (k == 0 || k == n)  false
return 1;
không thực thi if
if (4 == 1) // (k == 1)  false
return 5; // return n

không thực thi if
return C(4,4) + C(4,3); // C(n-1, k) + C(n-1, k-1)
//Gọi đệ quy
}
int C(4,4) // (int n, int k) {
if (4 == 0 || 4 == 4) // (k == 0 || k == n)  true
return 1;
thực thi if
if (4 == 1) // (k == 1)  false
return 4; // return n
không thực thi if
return C(n-1, k) + C(n-1, k-1)
//Không thực hiện gọi đệ quy
}
int C(4,3) // (int n, int k) {
if (3 == 0 || 3 == 4) // (k == 0 || k == n)  false
return 1;


16

không thực thi if
if (3 == 1) // (k == 1)  false
return 4; // return n
không thực thi if
return C(3,3) + C(3,2); // C(n-1, k) + C(n-1, k-1)
//Gọi đệ quy
}

int C(3,3) // (int n, int k) {

if (3 == 0 || 3 == 3) // (k == 0 || k == n)  true
return 1;
thực thi if
if (3 == 1) // (k == 1)  false
return 3; // return n
không thực thi if
return C(n-1, k) + C(n-1, k-1)
//không thực hiện gọi đệ quy
}
int C(3,2) // (int n, int k) {
if (2 == 0 || 2 == 3) // (k == 0 || k == n)  false
return 1;
không thực thi if
if (2 == 1) // (k == 1)  false
return 3; // return n
không thực thi if
return C(2,2) + C(2,1); // C(n-1, k) + C(n-1, k-1)
//Gọi đệ quy
}
int C(2,2) // (int n, int k) {
if (2 == 0 || 2 == 2) // (k == 0 || k == n)  true
return 1;


17

thực thi if
if (2 == 1) // (k == 1)  false
return 2; // return n
không thực thi if

return C(n-1, k) + C(n-1, k-1)
//không thực hiện gọi đệ quy
}

int C(2,1) // (int n, int k) {
if (1 == 0 || 1 == 2) // (k == 0 || k == n)  false
return 1;
không thực thi if
if (1 == 1) // (k == 1)  true
return 2; // return n
thực thi if
return C(n-1, k) + C(n-1, k-1)
//không thực hiện gọi đệ quy
}
Kết quả của chương trình như sau:
 C(2,1) = 2
 C(2,2) = 1
 C(3,2) = C(2,1) + C(2,2) = 3
 C(3,3) = 1
 C(4,3) = C(3,3) + C(3,2) = 3 + 1 = 4
 C(4,4) = 1
 C(5,4) = C(4,4) + C(4,3) = 3 + 1 = 5

1.2 Thực hành
public class Cau1 {
public static double Xy(int x, int y) {


×