Đang tải... (xem toàn văn)
1.4 Cấu trúc dữ liệu Danh sách và Cây Bài tập này nói về phân tích, nêu ưu điểm và nhược điểm và so sánh hiệu suất của các cấu trúc dữ liệu Mảng Array, Linked List và cây AVL với các tha
Trang 1TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM
TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO CUỐI KỲ MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Người hướng dẫn: HỒ THỊ THANH TUYẾN Người thực hiện: ĐỖ MINH NHẬT – 52000697
Lớp : 20050201 Khoá : 24
THÀNH PHỐ HỒ CHÍ MINH, NĂM 2021
Trang 2TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM
TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO CUỐI KỲ MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Người hướng dẫn: HỒ THỊ THANH TUYẾN Người thực hiện: ĐỖ MINH NHẬT
Lớp : 20050201 Khoá : 24
THÀNH PHỐ HỒ CHÍ MINH, NĂM 2022
Trang 3ii
LỜI CẢM ƠN
Em xin chân thành cảm ơn cô Hồ Thị Thanh Tuyến là giảng viên giảng dạy lý thuyết môn Cấu Trúc Dữ Liệu Và Giải Thuật Vì tình hình dịch bệnh phải học trên nền tảng trực tuyến đầy khó khăn nhưng cô vẫn nhiệt tình giảng dạy và hỏi han chúng em để đảm bảo chúng em có thể hiểu được bài một cách tốt nhất Em cũng xin gửi lời cảm ơn đến thầy Dung Cẩm Quang là giảng viên giảng dạy thực hành đã giúp em có được những kiến thức thực hành cần thiết để có thể hoàn thành được bài báo cáo của mình
Trang 4iii
TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
Em xin cam đoan đây là công trình nghiên cứu của riêng em và được sự hướng dẫn khoa học của cô Hồ Thị Thanh Tuyế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
Ngoài ra, trong Báo cáo 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àoemxin hoàn toàn chịu trách nhiệm về nội dung Báo cáo 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 em gây ra trong quá trình thực hiện (nếu có)
TP Hồ Chí Minh,ngày 20 tháng 1 năm 2022 Tác giả
(Ký tên và ghi rõ họ tên)
Đỗ Minh Nhật
Trang 6v
DANH MỤC HÌNH VẼ
Hình 2 1 Cây đệ quy bài toán xy 2
Hình 2 2 Cây đệ quy bài toán tìm số lớn nhất trong mảng 3
Hình 2 3 Giải thuật Merge Sort 14
Hình 2 4 Đồ thị biểu diễn người dùng 17
Trang 7vi
DANH MỤC BẢNG BIỂU
Bảng 2 1 Giải thuật Ba Lan ngược (Reverse Polish notation) 16
Trang 8vii
DANH MỤC CÁC CHỮ VIẾT TẮT
BFS Breadth First Search DFS Depth First Search
Trang 91.2 Sắp xếp
Bài tập này nói về tự cho một mảng số nguyên gồm 10 phần tử, sau đó cho ví dụ chạy từng bước sắp xếp mảng với các thuật toán được chỉ định trong đề bài Em tham khảo slide bài giảng và [1] để có thể đưa ra lời giải cho bài tập này
1.3 Stack
Bài tập này nói về 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) và cho ví dụ một biểu thức với 6 phép toán và 2 cặp ngoặc để áp dụng giải thuật này Trình bày về giải thuật dùng stack để tính kết quả từ biểu thức postfix và áp dụng để giải thuật để tính toán biểu thức Em tham khảo slide bài giảng và [2] để có thể đưa ra lời giải cho bài tập này
1.4 Cấu trúc dữ liệu Danh sách và Cây
Bài tập này nói về phân tích, nêu ưu điểm và nhược điểm và so sánh hiệu suất của các cấu trúc dữ liệu Mảng (Array), Linked List và cây AVL với các thao tác theo đề bài Cài đặt bài toán trên bằng Linked List và cây AVL Em tham khảo slide bài giảng để đưa ra cho lời giải cho bài tập này
1.5 Đồ thị
Bài tập này nói về xây dựng đồ thị biễu diễn người dùng của một mạng xã hội và duyệt đồ thị với giải thuật BFS và DFS Cài đặt bài toán trên và cài đặt các phương thức theo đề bài Em tham khảo slide bài giảng, [3] và [4] để có thể đưa ra lời giải cho bài tập này
Trang 102
CHƯƠNG 2 NỘI DUNG –
2.1 Đệ quy
2.1.2 Lý thuyết 2.1.2.1 Câu a
Sử dụng đệ quy tuyến tính cho bài toán Ta có 2 tham số truyền vào là x tương đương với hệ số và y tương đương với số mũ
Ta có xy= x*x*…*x với y lần Vậy công thức đệ quy sẽ là: x = x*x yy-1
Ta có trường hợp đơn giản (base case) sẽ là y = 0, ta sẽ trả về 1 tương đương với lại x bằng 1, ta sẽ gọi lại hàm với y giảm lần lượt 1 đến khi nào y = 0 Vậy mỗi 0
lần gọi hàm ta sẽ trả về một phép tính đến khi y = 0 thì ta sẽ trả về 1 và tính toán các lần gọi đệ quy trước đó
Ta có ví dụ: Tính 25
Hình 2 1 Cây đệ quy bài toán x y
Vậy sau khi sử dụng đệ quy, ta tính được 25 = 32
Trang 11Ta có ví dụ: Cho mảng array = {1, 5, 8, 4, 12, 20}
Hình 2 2 Cây đệ quy bài toán tìm số lớn nhất trong mảng.
Trang 12- Câu b:
public static int FindMax(int arr[], int n){ if(n == 1){
return arr[0]; }
if(arr[n-1] >= FindMax(arr, n - 1)){ return arr[n-1];
}else{
return FindMax(arr, n-1); }
2.2.1.1 Giải thuật Selection Sort
Ta có giải thuật Selection Sort là một trong các giải thuật sắp xếp mảng và có các bước thực hiện sắp xếp mảng tăng dần như sau:
+ Đầu tiên ta sẽ tạo ra hai vòng lặp for lồng nhau, vòng for đầu tiên có số lần lặp i < n – 1 và chạy từ i = 0 Vòng for thứ hai sẽ có số lần lặp j < n và chạy từ j = i + 1, với n là độ dài mảng
Trang 3527
- Từ đỉnh 17, ta thấy rằng đỉnh kề với đỉnh 11 và đỉnh 24 là các đỉnh chưa được duyệt nên ta lựa chọn đỉnh 11 Ta đưa đỉnh 11 vào trong danh sách duyệt và đưa vào trong stack
- Từ đỉnh 11, ta thấy rằng đỉnh kề với đỉnh 22 và đỉnh 24 là các đỉnh chưa được duyệt nên ta lựa chọn đỉnh 22 Ta đưa đỉnh 22 vào trong danh sách duyệt và đưa vào trong stack
- Từ đỉnh 22, ta thấy rằng đỉnh kề với đỉnh 18 và đỉnh 28 là các đỉnh chưa được duyệt nên ta lựa chọn đỉnh 18 Ta đưa đỉnh 18 vào trong danh sách duyệt và đưa vào trong stack
- Từ đỉnh 18, ta thấy rằng đỉnh kề với đỉnh 13, đỉnh 20 và đỉnh 28 là các đỉnh chưa được duyệt nên ta lựa chọn đỉnh 13 Ta đưa đỉnh 13 vào trong danh sách duyệt và đưa vào trong stack
- Từ đỉnh 13, ta thấy rằng không còn đỉnh kề chưa được duyệt nên ta lấy đỉnh 13 ra khỏi stack, lúc này đỉnh của stack là đỉnh 18 Từ đỉnh 18, ta thấy rằng đỉnh kề với đỉnh 20 và đỉnh 28 nên ta lựa chọn đỉnh 20 Ta đưa đỉnh 20 vào trong danh sách duyệt và đưa vào trong stack
Trang 36- Từ đỉnh 18, ta thấy rằng đỉnh kề với đỉnh 28 là đỉnh chưa được duyệt nên ta sẽ lựa chọn đỉnh 28 Ta đưa đỉnh 28 vào trong danh sách duyệt và đưa vào trong stack
- Từ đỉnh 28, ta thấy rằng đỉnh kề với đỉnh 15 là đỉnh chưa được duyệt nên ta lựa chọn đỉnh 15 Ta đưa đỉnh 15 vào trong danh sách duyệt và đưa vào trong stack
- Từ đỉnh 15, ta thấy rằng không còn đỉnh kề nào chưa được duyệt nên ta sẽ lấy đỉnh 15 ra khỏi stack, lúc này ở đỉnh của stack là đỉnh 28
- Từ đỉnh 28, ta thấy rằng không còn đỉnh kề nào chưa được duyệt nên ta sẽ lấy đỉnh 28 ra khỏi stack, lúc này ở đỉnh của stack là đỉnh 18
- Từ đỉnh 18, ta thấy rằng không còn đỉnh kề nào chưa được duyệt nên ta sẽ lấy đỉnh 18 ra khỏi stack, lúc này ở đỉnh của stack là đỉnh 22
- Từ đỉnh 22, ta thấy rằng không còn đỉnh kề nào chưa được duyệt nên ta sẽ lấy đỉnh 22 ra khỏi stack, lúc này ở đỉnh của stack là đỉnh 11
- Ta thấy rằng không còn đỉnh kề với đỉnh 11 chưa được duyệt nên ta sẽ lấy đỉnh 11 ra khỏi stack, lúc này ở đỉnh của stack là đỉnh 17
Trang 38-13-20-24-28-15-2.4.2 Thực hành 2.4.2.1 Câu a
public boolean readFileGraph(String path){ String read = "";
int count = 0, j = 0;try{
File in = new File(path);
Scanner myRead = new Scanner(in); vertices = myRead.nextInt(); adj = new int[vertices][vertices];
Trang 3931
while(myRead.hasNextLine()){ read = myRead.nextLine(); String[] strp = read.split(" "); for(int i=j;i<strp.length;i++){ if(strp[i].equals("1"))
setEdge(i,j-1); if(strp[i].equals("0"))
continue; if(i==j)
continue; }
j++; }
myRead.close(); }
catch(FileNotFoundException e){System.out.print("An error occurred");
e.printStackTrace(); return false; }
return true;}
2.4.2.2 Câu b
public ArrayList<Person> friendList(int ID){
ArrayList<Person> temp=new ArrayList<Person>(); for(int i = 0; i < vertices; i++){
if(adj[ID - 1][i] == 1){temp.add(userList.get(i)); }
Trang 4032
}
return temp; }
2.4.2.3 Câu c
public int countFriend(int ID1, int ID2){ int count = 0;
for(int i = 0; i < vertices; i++){
if(adj[i][ID1 - 1] == 1 && adj[i][ID2 - 1] == 1){
count += 1; }
}
return count; }
2.5 Cấu trúc dữ liệu Danh sách và Cây
2.5.1 Lý thuyết 2.5.1.1 Câu a
+ Với Mảng (Array): việc thêm một sinh viên dễ dàng nhưng ta sẽ phải dịch chuyển mảng mà khi mảng đầy thì phải sao chép toàn bộ mảng ra mảng mới Hiệu suất của việc thêm một sinh viên là O(n)
+ Với Linked List: việc thêm một sinh viên ở đầu dễ dàng và nhanh chóng, với các thao tác đơn giản Hiệu suất của việc thêm một sinh viên là O(1)
+ Với cây AVL: Việc thêm một sinh viên không mất nhiều thời gian do cây được cân bằng, nhưng ta phải kiểm tra tính cân bằng của cây mỗi lần thêm một sinh viên Hiệu suất của việc thêm một sinh viên là O(logn)
2.5.1.2 Câu b
+ Với Mảng (Array): Việc xóa một sinh viên trong mảng không cần nhiều thao tác, nhưng phải dịch chuyển các phần từ sau phần tử phải xóa lên trên Hiệu suất của việc xóa sinh viên trong mảng là O(n)
Trang 4133
+ Với Linked List: Việc xóa một sinh viên trong Linked List không tốn nhiều bước, nhưng ta phải sẽ duyệt hết các phần tử trong danh sách đến vị trí cần xóa Hiệu suất của việc xóa sinh viên là O(n)
+ Với cây AVL: Việc xóa một sinh viên không mất nhiều thời gian, nhưng ta sẽ phải kiểm tra tính cân bằng của cây mỗi lần xóa sinh viên Hiệu suất của việc xóa sinh viên là O(logn)
2.5.1.3 Câu c
+ Với Mảng (Array): việc tìm kiếm sinh viên sẽ nhanh nếu ta biết vị trí của sinh viên đó trong mảng Nhưng nếu không biết được vị trí sinh viên đó ta sẽ phải duyệt mảng Hiệu suất của việc tìm kiếm sinh viên là O(n)
+ Với Linked List: việc tìm kiếm sinh viên không mất nhiều thao tác, nhưng ta phải duyệt các phần tử trong list để tìm Hiệu suất của việc tìm kiếm sinh viên là O(n)
+ Với cây AVL: Việc cây cân bằng nên tìm kiếm sẽ không mất nhiều thời gian Hiệu suất của việc tìm kiếm sinh viên là O(logn)
2.5.2 Thực hành 2.5.2.1 Câu a
• Linked List:
public void addStudent(Student student){ head = new NodeLL(student,head); }
Trang 4234
if(n <= -1){
x.setLeft(add(x.getLeft(), student)); }else if(n >= 1){
x.setRight(add(x.getRight(), student)); }else{
x.setStudent(student); }
x.setHeight(1+Math.max(height(x.getLeft()), height(x.getRight())));
return balance(x); }
public void addStudent(Student student){ this.root = add(this.root, student); }
if(head.getStudent().getMSSV().compareTo(student.getMSSV()) == 0){
head = head.getNext(); }else{
NodeLL temp = head;
while(temp.getNext() != null && temp.getNext().getStudent().getMSSV().compareTo(student.getMSSV()) != 0){
Trang 4335
temp = temp.getNext(); }
if(temp.getNext() == null){ return false; }else{
NodeLL rm = temp.getNext(); temp.setNext(rm.getNext()); }
} } return true;}
student.getMSSV().compareTo(x.getStudent().getMSSV()); if(n <= -1){
x.setLeft(delete(x.getLeft(), student)); }else if (n >= 1){
x.setRight(delete(x.getRight(), student)); }else{
if(x.getLeft() == null){ return x.getRight(); }
if(x.getRight() == null){ return x.getLeft();
Trang 4436
}
x.setStudent(min(x.getRight()).getStudent()); x.setRight(deletemin(x.getRight())); x.setHeight(Math.max(height(x.getLeft()),height(x.getRight())) + 1);
}
return balance(x); }
public void deleteStudent(Student student){ this.root = delete(this.root, student); }
NodeLL temp = head; while(temp != null && temp.getStudent().getMSSV().compareTo(MSSV) != 0){
temp = temp.getNext(); }
System.out.println(temp.getStudent()); }
return true;}
Trang 45int n =
MSSV.compareTo(x.getStudent().getMSSV()); if(n <= -1){
return search(x.getLeft(), MSSV); }else if(n >= 1){
return search(x.getRight(), MSSV); }
return x; }
public boolean searchStudent(String MSSV){ NodeAVL temp = search(this.root, MSSV); if(temp == null){
return false; }else{
System.out.println(temp.getStudent()); return true;
} }
Trang 4638
TÀI LIỆU THAM KHẢO
[1] Hải Hà, [2019], Các thuật toán sắp xếp cơ bản,
Access: https://viblo.asia/p/cac-thuat-toan-sap-xep- -ban-Eb85ooNO52Gco [2] Luong Viet Dung, [2018], Reserve Polish Notation,
Access: https://viblo.asia/p/reserve-polish-notation-924lJrG8lPM
[3] VietTuts, [2016], Giải thuật tìm kiếm theo chiều sâu (Depth First Search),
Access: https://viettuts.vn/cau-truc-du-lieu-va-giai-thuat/giai-thuattheo-chieu-sau-depth-first-search
-tim-kiem-[4] VietTuts, [2016], Giải thuật tìm kiếm theo chiều rộng (Breadth First Search), Access: https://viettuts.vn/cau-truc-du-lieu-va-giai-thuat/giai-thuat-tim-kiem-theo-chieu-rong-breadth-first-search