Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 14

Trường Đại học Xây Dựng Hà Nội

Nhóm gồm: Phạm Ngọc Hiệp 0214066


Trần Hồng Phát 0217966
Bùi Thị Ngọc Thanh 0219866
Trần Thu Trang 0221366
Vũ Công Tuyến 0221966
Bài 1. Giải thuật tính n!

Ý tưởng Độ phức tạp thuật toán


Ta có: 0! = 1 (suy biến) T(n) =
n! = (n-1)! * n (n ≥ 1)
giaiThua(n)
{ if n = 0 return 1; …
else { gt = giaithua(n-1);
result = gt*n;
return result; }
}
Đồ thị
Code with Java

import java.util.Scanner;
public class doThoiGianGiaiThua{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("nhap n vao");
long n = sc.nextLong();
final long startTime = System.nanoTime();
long a =giaiThua(n);
System.out.println(a);
final long endTime = System.nanoTime();
System.out.println(endTime - startTime);
}
public static long giaiThua (long n){
if (n==0){
return 1;
}
else{
long result = n * giaiThua(n-1);
return result;
}
}
}
Bài 2. Giải thuật Euclide

Ý tưởng Độ phức tạp thuật toán


UCLN(a,b) = UCLN(a’,b) = UCLN(a,b’)
UCLN(a,b) TH tệ nhất a và b nguyên
{ if (a = b) return a; tố cùng nhau thì ĐPT là
elseif (a > b)
{ a’ là phần dư của a%b;
UCLN(a’,b);
else { b’ là phần dư của b%a;
UCLN(b’,a);}
}
}
Code with Java
Đồ thị import java.util.Scanner;
public class doThoiGianUCLN{
public static void main(String[] args) {
Scanner Scan = newScanner(System.in);
System.out.println("Nhap a vao: ");
int a=Scan.nextInt();
System.out.println("Nhap b vao: ");
int b = Scan.nextInt();
final long startTime = System.nanoTime();
int c=ucln(a,b);
final long endTime = System.nanoTime();
System.out.println(c);
System.out.println("time :" + (endTime-startTime));
}
public static int ucln(int a, int b){
if (b == 0) return a;
if (a % b == 0) return b;
return ucln(b, a%b);
}
}
Bài 3. Giải thuật tìm Max

Độ phức tạp thuật toán


T(n) =


Code with Java Đồ thị
public class findMax {
public static void main(String[] args) {
int [] A ={100,8,17,789,456,13,21,7,34,90,44,};
final long startTime = System.nanoTime();
int a =Max(A,A.length);
final long endTime = System.nanoTime();
System.out.println("max: "+ a );
System.out.println("Time :" +(endTime-startTime));
System.out.println("n:" + A.length);
}
public static int Max(int [] A, int n ){
if (n == 0)
return -1;
if (n == 1)
return A[0];
else{
if (A[n - 1] > Max(A, n - 1))
return A[n - 1];
else return Max(A, n - 1);
}
}
}
Bài 4. Giải thuật tìm số Fibonacci thứ n

Ý tưởng Độ phức tạp thuật toán


Fib(n)
{if (n=1) return 1; T(n) = T(n-1) + T(n-2) + O(1)
elseif (n = 2) return 1; < 2T(n-1) + O(1)
else { result = Fib(n-1) + Fib(n-2); < 4T(n-2) + 3O(1)
return result; < ...
} < 2^k * T(n–k) + (2^k-1)O(1)
} < ...
< 2^n * T(0) + (2^n-1)O(1) ~ 2 * 2^n
= O(2^n)
Ngoài ra có thể tính T(n) theo phương trình đặc trưng

có phương trình đặc trưng:


Do đó
Thay
Vậy
Code with Java
import java.util.Scanner;
public class fibonacci {
public static void main(String[] args) {
int n = 2;
final long startTime = System.nanoTime();
int b=fib(n);
Đồ thị final long endTime = System.nanoTime();
System.out.println("n:" + n);
System.out.println("fib:" +b);
System.out.println("Time :" + (endTime-startTime));
}
public static int fib (int n){
if (n==1)
return 1;
else if (n==2)
return 1;
else {
return fib(n-1) + fib (n-2);
}
}
}
Bài 5. Giải bài toán “Tháp HN”
Ý tưởng Độ phức tạp thuật toán
- Mỗi lần chuyển 1 tầng
- Tầng nhỏ nằm trên tầng lớn
- C là trung gian
chuyen1tang(X,Y): chuyển 1 tầng từ cột A sang B
chuyen(n-1, A, B, C): chuyển n-1 tầng từ cột A sang B,
lấy cột C làm trung gian …

chuyen(n, A, B, C)
{ if n = 1 chuyen1tang(A, B);
else (chuyen(n-1, A, C, B);
chuyen1tang(A, B);
chuyen(n-1, C, B, A);}
}
Code with Java Đồ thị
package doTimeThuatToan;
public class findHN {
public static void main(String[] args) {
int disk = 4;
final long startTime = System.nanoTime();
thapHN(disk, 'A', 'B', 'C’);
final long endTime = System.nanoTime();
System.out.println("time :" + (endTime-startTime));
}
public static void thapHN(int a , char start, char mid, char end){
if(a==1){
System.out.println("Disk 1 from " + start + " to " + end);
}
else{
thapHN(a-1, start, end, mid);
System.out.println("Disk " + a + " from " + start + " to " + end);
thapHN(a - 1, mid, start, end);
}
}
}
Tìm hiểu thêm về đệ quy

Một vài thuật toán và CTDL nổi tiếng dung đệ quy:


Quick sort, Merge sort, Heap sort, DFS, Cây nhị phân, Segment
tree,…

Ưu điểm: Thực hiện lớn số lượng thao tác tính thông qua 1 đoạn
chương trình ngắn gọn

Nhược điểm: Tốn nhiều dung lượng do thực hiện nhiều phép tính
Không tối ưu về mặt thời gian
Thank you!

You might also like