Tải bản đầy đủ (.pdf) (46 trang)

báo cáo cuối kỳ 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 (1.31 MB, 46 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM

<b>TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN </b>

<b>BÁO CÁO CUỐI KỲ MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT </b>

<i><b>Người hướng dẫn: HỒ THỊ THANH TUYẾN Người thực hiện: ĐỖ MINH NHẬT – 52000697 </b></i>

Lớp : 20050201 Khoá : 24

<b>THÀNH PHỐ HỒ CHÍ MINH, NĂM 2021</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM

<b>TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN </b>

<b>BÁO CÁO CUỐI KỲ MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT </b>

<b>Người hướng dẫn: HỒ THỊ THANH TUYẾN Người thực hiện: ĐỖ MINH NHẬT </b>

Lớp : 20050201 Khoá : 24

<b>THÀNH PHỐ HỒ CHÍ MINH, NĂM 2022</b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

ii

<b>LỜI CẢM ƠN </b>

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ể hồn thành được bài báo cáo của mình.

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

iii

<b>TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG </b>

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.

Ngồ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.

<b>Nếu phát hiện có bất kỳ sự gian lận nào</b>em<b>xin hồn tồn chịu trách nhiệm về nội dung </b>Báo cáo <b>của mình</b>. 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 q trình thực hiện (nếu có).

<i>TP. Hồ Chí Minh,ngày 20 tháng 1 năm 2022 Tác giả </i>

<i>(Ký tên và ghi rõ họ tên) </i>

<i>Đỗ Minh Nhật </i>

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

v

<b>DANH MỤC HÌNH VẼ</b>

<b>Hình 2. 1 Cây đệ quy bài tốn x</b><small>y</small>... 2

<b>Hình 2. 2 Cây đệ quy bài tốn tìm số lớn nhất trong mảng. ... 3</b>

<b>Hình 2. 3 Giải thuật Merge Sort. ... 14</b>

<b>Hình 2. 4 Đồ thị biểu diễn người dùng. ... 17</b>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

vi

<b>DANH MỤC BẢNG BIỂU</b>

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

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

vii

<b>DANH MỤC CÁC CHỮ VIẾT TẮT </b>

BFS Breadth First Search DFS Depth First Search

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

1.2 <b>Sắp xếp</b>

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 tố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.

<b>1.4 Cấu trúc dữ liệu Danh sách và Cây </b>

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.

<b>1.5 Đồ thị </b>

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

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

2

<b>CHƯƠNG 2 NỘI DUNG – </b>

2.1 <b>Đệ quy</b>

2.1.2 Lý thuyết 2.1.2.1 Câu a

Sử dụng đệ quy tuyến tính cho bài tố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ó x<small>y</small>= x*x*…*x với y lần. Vậy công thức đệ quy sẽ là: x = x*x . <small>yy-1</small>

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 <small>0</small>

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 tốn các lần gọi đệ quy trước đó.

Ta có ví dụ: Tính 2<small>5</small>

Hình 2. 1 Cây đệ quy bài toán x . <small>y</small>

Vậy sau khi sử dụng đệ quy, ta tính được 2<small>5</small> = 32.

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

Ta có ví dụ: Cho mảng array = {1, 5, 8, 4, 12, 20}

Hình 2. 2 Cây đệ quy bài tốn tìm số lớn nhất trong mảng.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="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.

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="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.

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="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.

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="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];

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="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)); }

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="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; }

<b>2.5 Cấu trúc dữ liệu Danh sách và Cây </b>

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).

</div><span class="text_page_counter">Trang 41</span><div class="page_container" data-page="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); }

</div><span class="text_page_counter">Trang 42</span><div class="page_container" data-page="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){

</div><span class="text_page_counter">Trang 43</span><div class="page_container" data-page="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();

</div><span class="text_page_counter">Trang 44</span><div class="page_container" data-page="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;}

</div><span class="text_page_counter">Trang 45</span><div class="page_container" data-page="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;

} }

</div><span class="text_page_counter">Trang 46</span><div class="page_container" data-page="46">

38

<b>TÀI LIỆU THAM KHẢO </b>

[1] Hải Hà, [2019], <i>Các thuật toán sắp xếp cơ bản</i>,

Access: a/p/cac-thuat-toan-sap-xep- -ban-Eb85ooNO52Gco . [2] Luong Viet Dung, [2018], Reserve Polish Notation,

Access: a/p/reserve-polish-notation-924lJrG8lPM.

<i>[3] VietTuts, [2016], Giải thuật tìm kiếm theo chiều sâu (Depth First Search), </i>

Access:

-tim-kiem-[4] VietTuts, [2016], <i>Giải thuật tìm kiếm theo chiều rộng (Breadth First Search)</i>, Access:

</div>

×