Chương 1: Introduction - 10.Algorithms Analysis: Problems & Solutions(54-65)
Problem-54
public int isPrime(int n) {
for(int i=2; i <= Math.sqrt(n); i++) {
if(n%i == 0) {
System.out.println("Not Prime");
return 0;
}
}
return 1;
}
Cho function sau, ý nào sau đây là đúng:
- và
- và
- và
- Không đáp án nào ở trên
Solution: Ký hiệu Big O mô tả giới hạn trên chặt chẽ và ký hiệu Big Omega mô tả giới hạn dưới chặt chẽ cho một thuật toán.
Vòng lặp for trong câu hỏi được chạy tối đa lần và tối thiểu 1 lần. Vì vậy, và
Problem-55
public int gcd(int n, int m) {
if(n%m == 0) return m;
n = n%m;
return gcd(m,n);
}
Cho đoạn code sau với n >=m, tìm độ phức tạp của bài toán.
Solution: Không có lựa chọn nào là chính xác.
Giả sử m = 2 và với mọi n = 2 i, thời gian chạy là O (1), điều này mâu thuẫn với mọi lựa chọn.
Problem-56
Giả sử . Lựa chọn nào dưới đây là sai
Solution:
Ký hiệu Big O mô tả giới hạn trên chặt chẽ và ký hiệu Big Omega mô tả giới hạn dưới chặt chẽ cho một thuật toán.
Dựa vào master theorem , ta có
. Nó đồng nghĩa với Big O và Big Omega là như nhau, (2) và (4) đúng.
Problem-57
Tìm độ phức tạp:
public void function(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < i*i; j++) {
if(j%i == 0) {
for(int k = 0; k < j; k++) {
System.out.println("*");
}
}
}
}
}
Solution: Xem xét comment:
public void function(int n) {
for (int i = 0; i < n; i++) { //Vòng lặp này thực thi n lần
for (int j = 0; j < i*i; j++) { //Vòng lặp này thực thi n*n lần
if(j%i == 0) {
for(int k = 0; k < j; k++) {//Vòng lặp này thực thi j=n*n lần
System.out.println("*");
}
}
}
}
}
Time Complexity: .
Đây là solution mà tác giả giải thích trong sách, mình thấy có vẻ chưa chuẩn lắm, mình sẽ giải thích lại theo ý mình hiểu(Mọi người nếu thấy mình giải thích chưa đúng comment giúp để mình sửa lại nhé):
public void function(int n) {
for (int i = 0; i < n; i++) { //Vòng lặp này thực thi n lần
for (int j = 0; j < i*i; j++) { //Vòng lặp này thực thi i*i lần
if(j%i == 0) {
for(int k = 0; k < j; k++) {//Vòng lặp này thực thi j=i*i lần
System.out.println("*");
}
}
}
}
}
Vậy ta có . Áp dụng công thức cuối cùng trong bài này, ta được
Problem-58
Để tính toán , hãy đưa ra một thuật toán và thảo luận về độ phức tạp của nó.
Solution:
Bắt đầu với 1 và nhân với 9 cho đến khi đạt .
Time Complexity: Có n-1 phép nhân và mỗi phép nhân cần thời gian không đổi để thực thi =>
Problem-59
Đối với Bài toán-58, chúng ta có thể cải thiện độ phức tạp về thời gian không?
Solution: Có, chi tiết mình sẽ trình ở chương Divide and Conquer.
Problem-60
Tìm độ phức tạp
public void function(int n) {
int sum = 0;
for(int i = 0; i < n; i++) {
if(i > j) {
sum += 1;
} else {
for(int k = 0; k < n; k++) {
sum -= 1;
}
}
}
}
Solution:
Xem xét trường hợp tệ nhất worst-case
public void function(int n) {
int sum = 0;
for(int i = 0; i < n; i++) { //Vòng lặp này thực thi n lần
if(i > j) {
sum += 1; //Lệnh này thực thi n lần
} else {
for(int k = 0; k < n; k++) {//Vòng lặp này thực thi n lần
sum -= 1;
}
}
}
}
Time Complexity: Trường hợp tệ nhất vòng lặp luôn vào else =>
Problem-61
Giải quan hệ lặp lại sau bằng phương pháp cây đệ quy:
Solution: Câu hỏi đặt ra là: chúng ta thực hiện bao nhiêu công việc trong mỗi cấp của cây đệ quy?
Ở mức 0, chúng ta mất lần.
Ở mức 1, chia thành 2 vấn đề con cần:
Ở mức 2, chia thành 4 vấn đề con với zize , , và , 2 vấn đề con cần:
Tương tự khối lượng công việc ở cấp độ k tối đa là
Đặt , tổng runtime cần là:
Problem-62
Tìm độ phức tạp:
Solution:
Chúng ta thử giải quyết vấn đề bằng phương pháp guessing. Ta thấy tổng kích thước trên mỗi level lặp lại đều nhỏ hơn n, vậy ta đoán rằng sẽ chiếm ưu thế.
Giả sử với mọi i < n thì , ta được:
Nếu và thì , như vậy .\
Kết luận: nếu ta có nhiều lệnh gọi đệ quy, tổng các đối số của các lệnh gọi đó nhỏ hơn n(trong trường hợp này ), và f(n) đủ lớn thì một dự đoán tốt là .
Problem-63
Xếp hạng các chức năng sau theo thứ tự rate of growth:
Solution:
Problem-64
Ta có thể nói ?
Solution: Yes, bởi vì
Problem-65
Ta có thể nói ?
Solution: Không, bởi vì không nhỏ hơn .
Kết chương 1
Cảm ơn mọi người đã đọc tới đây, vậy là mình đã trình bày xong toàn bộ lý thuyết và bài tập của chương 1. Chương này khá khó và sử dụng nhiều kiến thức toán, bắt đầu từ chương sau sẽ đi vào các bài toán cụ thể và sẽ được áp dụng code nhiều hơn 😁😁😁
All rights reserved