log(2n + k) >= log(2n) - log(1 + k/n) >= log(n)- log(1 + k/n) Chọn c = 1/2 và n0 = 1: log(2n + k) >= 1/2*log(n), với mọi n >=n0. Do đó, log(2n + k) = Q(log(n)). (**) Từ (*)(**) suy ra: log(2n + k) = O(log(n)). a. - Vòng lặp bên ngoài chạy từ i = 1 đến i = n, vì vậy nó sẽ được thực hiện n lần. - Vòng lặp bên trong chạy từ j = 1 đến j = n, và với mỗi giá trị của i trong vòng lặp bên ngoài, vòng lặp này sẽ được thực hiện n lần. Do đó, tổng số lần lặp của cả hai vòng lặp là n * n = n^2. Do trong từng lần lặp, các câu lệnh được thực hiện chỉ là lệnh gán và tăng biến đếm cnt1, có độ phức tạp là O(1) (tương đương với việc không ảnh hưởng đến độ phức tạp khi tăng giá trị của biến), vì vậy độ phức tạp của vòng lặp là O(n^2). b. - Vòng lặp bên ngoài duyệt từ 1 đến n - Vòng lặp bên trong duyệt từ 1 đến i. Với mỗi giá trị của i, vòng lặp bên trong chạy i lần. Vì vậy, với i = 1, vòng lặp bên trong chạy một lần, với i = 2, vòng lặp bên trong chạy hai lần, và cứ tiếp tục như vậy. Biến cnt2 sau đó được tăng lên 1 cho mỗi lần lặp của vòng lặp bên trong. Do đó, giá trị cuối cùng của cnt2 sẽ là tổng của các số nguyên từ 1 đến n, tương đương với (n * (n + 1))/ 2. Nói cách khác, đoạn mã này tính tổng của dãy số: 1+2+3+...+n. Đây là một chuỗi số học có tổng bằng (n * (n+1)) / 2. Do đó, độ phức tạp tính toán của đoạn mã này là O(n^2), vì có hai vòng lặp lồng nhau và số lần lặp tăng theo cấp số nhân. c. - Vòng lặp bên ngoài chạy với giá trị của i tăng theo cấp số nhân: 1, 2, 4, 8, ... Khi i vượt quá giá trị n thì vòng lặp dừng. Vòng lặp bên trong chạy n lần cho mỗi giá trị của i. Số lần lặp của vòng lặp bên ngoài được tính như sau: Khi i = 1, vòng lặp bên trong chạy n lần. Khi i = 2, vòng lặp bên trong vẫn chạy n lần. Khi i = 4, vòng lặp bên trong vẫn chạy n lần. Khi i = 8, vòng lặp bên trong vẫn chạy n lần. ... Tổng số lần lặp của cả hai vòng lặp là: n + n + n + ... (ở mỗi bước i được nhân đôi) = n * log2(n) Do đó, độ phức tạp tính toán của đoạn mã này là O(nlogn), vì có hai vòng lặp lồng nhau và số lần lặp tăng theo cấp số nhân. d. Vòng lặp bên ngoài chạy với giá trị của i tăng theo cấp số nhân: 1, 2, 4, 8, ... Khi i vượt quá giá trị n thì vòng lặp dừng. Vòng lặp bên trong chạy i lần cho mỗi giá trị của i. Số lần lặp của vòng lặp bên ngoài được tính như sau: Khi i = 1, vòng lặp bên trong chạy 1 lần. Khi i = 2, vòng lặp bên trong chạy 2 lần. Khi i = 4, vòng lặp bên trong chạy 4 lần. Khi i = 8, vòng lặp bên trong chạy 8 lần. ... Tổng số lần lặp của cả hai vòng lặp là: 1+2+4 +8 + ... (ở mỗi bước i được nhân đôi) = n Do đó, độ phức tạp tính toán của đoạn mã này là O(n), vì có hai vòng lặp lồng nhau và số lần lặp tăng theo cấp số nhân, nhưng không vượt quá giới hạn của n. Problem 3. a. Độ phức tạp của phép cộng hai ma trận nxn như trên là O(n^2). Vì có hai vòng lặp for lồng nhau chạy từ 0 đến n-1, và mỗi phần tử trong ma trận được cộng với phần tử tương ứng của ma trận khác. Cụ thể: Vòng lặp bên ngoài chạy n lần. Vòng lặp bên trong chạy n lần cho mỗi giá trị của i. Mỗi lần lặp, thực hiện một phép cộng. Do đó, tổng số phép tính cộng là O(n^2). Phép nhân hai ma trận nxn có độ phức tạp là O(n^3), và phép dời hình (transpose) của một ma trận nxn cũng có độ phức tạp là O(n^2). b. Độ phức tạp của phép nhân hai ma trận nxn như trên là O(n^3). Vì có ba vòng lặp for lồng nhau chạy từ 0 đến n-1, và trong mỗi giá trị của i và j, thực hiện n phép nhân và n-1 phép cộng. Cụ thể: Vòng lặp bên ngoài chạy n lần. Các vòng lặp bên trong chạy n lần cho mỗi giá trị của i và j. Trong vòng lặp bên trong thứ ba, thực hiện một phép nhân và một phép cộng. Do đó, tổng số phép tính (nhân và cộng) là O(n^3). c. Độ phức tạp của phép dời hình (transpose) một ma trận nxn như trên là O(n^2). Vì có hai vòng lặp for lồng nhau chạy từ 0 đến n-1. Problem 4. Trong từng lần lặp, thực hiện một phép gản và một phép trao đổi giá trị giữa hai phần tử của ma trận. Cụ thể: Vòng lặp bên ngoài chạy n-1 lần. Vòng lặp bên trong chạy từ i+1 đến n-1 cho mỗi giá trị của i. Trong mỗi lần lặp, thực hiện một phép gán và một phép trao đổi giá trị giữa hai phần tử của ma trận. Do đó, tổng số phép gán và phép trao đổi là O(n^2). Hàm Min trả về giá trị nhỏ nhất trong một mảng gồm n phần tử. Độ phức tạp của hàm này là O(n), vì có một vòng lặp for duyệt qua từng phần tử trong mảng. Trong vòng lặp, chỉ có một phép so sánh và gán được thực hiện với mỗi phần tử. Do đó số phép tính toán là hằng số (không phụ thuộc vào n). End of document