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
NỘI DUNG
Đệ quy
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ó x y = x*x*…*x với y lần Vậy công thức đệ quy sẽ là: x = x*x y y-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 2 5
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 2 5 = 32
Sử dụng đệ nhị phân cho bài toán Ta có tham số truyền vào sẽ là một mảng array chứa các số nguyên và độ dài n của mảng
Ta có để tìm số lớn nhất của một mảng, ta sẽ so sánh lần lượt các số trong mảng để tìm ra số lớn nhất Vậy công thức đệ quy sẽ là: array[n-1] >= FindMax(array, n - 1)
FindMax(array, n − 1), nếu array[n − 1] < array[n − 2]
Ta có trường hợp cơ bản (base case) sẽ là n = 1, ta sẽ trả về array[0] tương đương với phần tử đầu tiên của mảng Ta sẽ gọi hàm so sánh phần tử và phần tử sau nó và gọi lần lượt đến khi nào n = 1 thì ta sẽ trả về phần tử đầu tiên và bắt đầu so sánh phần tử thứ hai và phần tử đầu tiên và trả ngược lại kết quả cho lần gọi đệ quy trước để tiếp tục thực hiện việc so sánh
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.
- Câu a: public static int Power(int x,int y){ if(y == 0) return 1; return x*Power(x,y-1);
- 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];
Sắp xếp
Cho một mảng số nguyên gồm 10 phần tử Array = {20, 5, 9, 1, 13, 30, 16, 8,
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
- 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
- Từ đỉnh 20, ta thấy rằng đỉnh chỉ kề với đỉnh 24 là đỉnh chưa được duyệt nên ta lựa chọn đỉnh 24 Ta đưa đỉnh 24 vào trong danh sách duyệt và đưa vào trong stack
- Từ đỉnh 24, 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 24 ra khỏi stack, lúc này ở đỉnh của stack là đỉnh 20 Từ đỉnh 20, ta thấy rằng không còn đỉnh kề nào chưa được duyệt nên ta lấy đỉnh 20 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 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
- Ta thấy rằng không còn đỉnh kề với đỉnh 17 chưa được duyệt nên ta sẽ lấy đỉnh 17 ra khỏi stack, lúc này ở đỉnh của stack là đỉnh 10
- Ta thấy rằng không còn đỉnh kề với đỉnh 10 chưa được duyệt nên ta sẽ lấy đỉnh 10 ra khỏi stack, lúc này ở đỉnh của stack là đỉnh 21
- Từ đỉnh 21, ta thấy rằng không còn đỉnh kề với đỉnh 21 chưa được duyệt nên ta sẽ lấy đỉnh 21 ra khỏi stack, lúc này đỉnh của stack là đỉnh 8
- Từ đỉnh 8, ta thấy rằng không còn đỉnh kề với đỉnh 8 chưa được duyệt nên ta sẽ lấy đỉnh 8 ra khỏi stack, lúc này đỉnh của stack là đỉnh 14
- Từ đỉnh 14, ta thấy rằng không còn đỉnh kề với đỉnh 14 chưa được duyệt nên ta sẽ lấy đỉnh 14 ra khỏi stack, lúc này đỉnh của stack là đỉnh 12
- Từ đỉnh 12, ta thấy rằng đỉnh kề với đỉnh 30 chưa được duyệt nên ta sẽ lựa chọn đỉnh 30, Ta đưa đỉnh 30 vào trong danh sách duyệt và đưa vào trong stack
- Từ đỉnh 30, ta thấy rằng không còn đỉnh kề với đỉnh 30 chưa được duyệt nên ta sẽ lấy đỉnh 30 ra khỏi stack, lúc này đỉnh của stack là đỉnh 12
- Từ đỉnh 12, ta thấy rằng không còn đỉnh kề với đỉnh 12 chưa được duyệt nên ta sẽ lấy đỉnh 12 ra khỏi stack, lúc này đỉnh của stack là đỉnh 19
- Từ đỉnh 19, ta thấy rằng không còn đỉnh kề với đỉnh 19 chưa được duyệt nên ta sẽ lấy đỉnh 19 ra khỏi stack, lúc này đỉnh của stack là đỉnh 7
- Từ đỉnh 7, ta thấy rằng đỉnh kề với đỉnh 26 chưa được duyệt nên ta sẽ lựa chọn đỉnh 26, Ta đưa đỉnh 26 vào trong danh sách duyệt và đưa vào trong stack
- Từ đỉnh 26, ta thấy rằng không còn đỉnh kề với đỉnh 26 chưa được duyệt nên ta sẽ lấy đỉnh 26 ra khỏi stack, lúc này đỉnh của stack là đỉnh 7
- Từ đỉnh 7, ta thấy rằng không còn đỉnh kề với đỉnh 7 chưa được duyệt nên ta sẽ lấy đỉnh 7 ra khỏi stack, lúc này đỉnh của stack là đỉnh 23
- Từ đỉnh 23, ta thấy rằng không còn đỉnh kề với đỉnh 23 chưa được duyệt nên ta sẽ lấy đỉnh 23 ra khỏi stack, lúc này đỉnh của stack là đỉnh 16
- Từ đỉnh 16, ta thấy rằng không còn đỉnh kề với đỉnh 16 chưa được duyệt nên ta sẽ lấy đỉnh 16 ra khỏi stack, lúc này đỉnh của stack là đỉnh 6
- Từ đỉnh 6, ta thấy rằng không còn đỉnh kề với đỉnh 6 chưa được duyệt nên ta sẽ lấy đỉnh 6 ra khỏi stack, lúc này đỉnh của stack là đỉnh 5
- Từ đỉnh 5, ta thấy rằng đỉnh kề với đỉnh 25 chưa được duyệt nên ta sẽ lựa chọn đỉnh 25, Ta đưa đỉnh 25 vào trong danh sách duyệt và đưa vào trong stack
- Từ đỉnh 25, ta thấy rằng đỉnh kề với đỉnh 29 chưa được duyệt nên ta sẽ lựa chọn đỉnh 29, Ta đưa đỉnh 29 vào trong danh sách duyệt và đưa vào trong stack.
- Ta tiếp tục lấy và kiểm tra các đỉnh kề chưa duyệt đến khi stack rỗng
Vậy kết quả duyệt đồ thị bằng giải thuật DFS là:
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];
31 while(myRead.hasNextLine()){ read = myRead.nextLine(); String[] strp = read.split(" "); for(int i=j;i