báo cáo cuối kỳ môn cấu trúc dữ liệu và giải thuật

46 0 0
Tài liệu đã được kiểm tra trùng lặp
báo cáo cuối kỳ môn cấu trúc dữ liệu và giải thuật

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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 1

TỔ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 2

TỔ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 3

ii

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 4

iii

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 6

v

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 7

vi

DANH MỤC BẢNG BIỂU

Bảng 2 1 Giải thuật Ba Lan ngược (Reverse Polish notation) 16

Trang 8

vii

DANH MỤC CÁC CHỮ VIẾT TẮT

BFS Breadth First Search DFS Depth First Search

Trang 9

1.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 10

2

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 11

Ta 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 35

27

- 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 39

31

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 40

32

}

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 41

33

+ 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 42

34

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 43

35

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 44

36

}

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 45

int 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 46

38

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

Ngày đăng: 07/05/2024, 18:24

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan