Từ đây tới chương 2 sẽ là các bài viết về bài tập nhằm giúp các bạn hiểu hơn về những lý thuyết đã qua.
Để không quá dài, mình sẽ chỉ để khoảng từ 8-10 bài tập mỗi bài viết.
Problem-21
Tìm độ phức tạp của hàm đệ quy:
Solution: Chúng ta hãy thử giải quyết function này bằng cách substitution(thay thế):
...
Điều này cho thấy rõ ràng rằng độ phức tạp của hàm này là .
Note: Chúng ta cũng có thể sử dụng các định lý về Subtraction and Conquer cho bài toán này.
Problem-22
Tìm độ phức tạp của hàm đệ quy:
Solution: Chúng ta hãy thử giải quyết function này bằng cách substitution(thay thế):
=> Complexity là .
Problem-23
Xác định running time của function sau:
public void Funtion(int n) { int i = 1, s = 1; while(s <= n) { i++; s = s + i; System.out.println("*"); } }
Ta có thể xác định theo quan hệ với giá trị của tăng 1 sau mỗi vòng lặp.
Giá trị chứa trong ‘s’ ở lần lặp thứ i là tổng của các số nguyên dương ‘i’ đầu tiên.
Giả sử k là tổng số lần lặp được thực hiện bởi chương trình, thì vòng lặp while kết thúc nếu:
Problem-24
Xác định running time của function sau:
public void Funtion(int n) { int i = 1, count = 0; for (i = 0; i*i <= n; i++) { count++; } }
Solution: Trong hàm được đề cập ở trên, vòng lặp sẽ kết thúc, nếu . Tương tự Problem-23
Problem-25
Xác định running time của function sau:
public void Funtion(int n) { int i,j,k, count = 0; for(i = n/2; i <= n; i++){ for(j = n/2; j <= n; j++){ for(k = n/2; k <= n; k = k*2){ count++; } } } }
Solution: Chúng ta hãy xem lại code, mình sẽ comment chi tiết ở từng vòng lặp
public void Funtion(int n) { int i,j,k, count = 0; //Vòng lặp ngoài cùng thực thi n/2 lần for(i = n/2; i <= n; i++){ //Vòng lặp giữa thực thi n/2 lần for(j = 1; j + n/2 <= n; j++){ //Vòng lặp trong cùng thực thi logn lần for(k = n/2; k <= n; k = k*2){ count++; } } } }
=> Complexity của function trên là
Problem-26
Xác định running time của function sau:
public void Funtion(int n) { int i,j,k, count = 0; for(i = n/2; i <= n; i++){ for(j = 1; j <= n; j = 2*j){ for(k = n/2; k <= n; k = k*2){ count++; } } } }
Solution: Chúng ta hãy xem lại code, mình sẽ comment chi tiết ở từng vòng lặp
public void Funtion(int n) { int i,j,k, count = 0; //Vòng lặp ngoài cùng thực thi n/2 lần for(i = n/2; i <= n; i++){ //Vòng lặp giữa thực thi logn lần for(j = 1; j <= n; j = 2*j){ //Vòng lặp trong cùng thực thi logn lần for(k = n/2; k <= n; k = k*2){ count++; } } } }
=> Complexity của function trên là
Problem-27
Xác định running time của function sau:
public void Funtion(int n) { if(n == 1) return; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { System.out.println("*"); break; } } }
Solution: Chúng ta hãy xem lại code, mình sẽ comment chi tiết ở từng vòng lặp
public void Funtion(int n) { //constant time if(n == 1) return; //Vòng lặp ngoài cùng thực thi n lần for (int i = 1; i <= n; i++) { //Vòng lặp trong chỉ thực thi 1 lần do lệnh break; for (int j = 1; j <= n; j++) { System.out.println("*"); break; } } }
=> Complexity của function trên là . Mặc dù vòng lặp bên trong có giới hạn là n, nhưng do câu lệnh break nên nó chỉ được thực thi một lần.
Problem-28
Một hàm đệ quy cho thời gian chạy của function cho dưới đây. Chứng minh bằng phương pháp lặp rằng .
public void Funtion(int n) { if(n == 1) return; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { System.out.println("*"); } } Funtion(n-3); }
Solution: Chúng ta hãy xem lại code, mình sẽ comment chi tiết ở từng vòng lặp
public void Funtion(int n) { //constant time if(n == 1) return; //Vòng lặp ngoài cùng thực thi n lần for (int i = 1; i <= n; i++) { //Vòng lặp trong cùng thực thi n lần for (int j = 1; j <= n; j++) { //constant time System.out.println("*"); } } Funtion(n-3); }
Sự lặp lại đối với mã này rõ ràng là đối với một số hằng c> 0 vì mỗi lệnh gọi in ra dấu hoa thị và chính nó gọi đệ quy với . Sử dụng định lý chính Subtraction and Conquer master theorem, ta được .
Problem-29
Xác định giới hạn Θ cho hàm sau:
Solution: Sử dụng Divide and Conquer master theorem, ta được
Problem-30
Xác định giới hạn Θ cho hàm sau:
Solution: Thay vào phương trình lặp lại, chúng ta nhận được:
, với k là 1 constant.
=>.