Trường hợp:
int n = 10;
for (int i = 2; i <= n; i++)
{
// Khối lệnh
}
thì độ phức tạp là sao ạ?
Em cảm ơn.
Trường hợp:
int n = 10;
for (int i = 2; i <= n; i++)
{
// Khối lệnh
}
thì độ phức tạp là sao ạ?
Em cảm ơn.
Số vòng lặp ở for
là n - 1 (n - 2 + 1), rút lại được O(n). Giả sử khối lệnh bên trong nó có độ phức tạp là O(1) thì độ phức tạp của thuật toán trên là O(n).
Trường hợp trong for có nhiều hơn 1 khối lệnh là 3 khối lệnh thì mình chỉ xét số lần của phép toán tích cực không quan tâm đến phép toán khác hay sao ạ?
Do lệnh tăng 1 và xét điều kiện là O(1) rồi bạn, chứ vẫn có tính
Em vẫn chưa hiểu lắm ạ
Trường hợp
for (int i = 3; i <= n; i++)
{
// Khối lệnh 1
// Khối lệnh 2
// Khối lệnh 3
}
thì sẽ là 3.(n - 3 + 1) = 3.(n-2) = O(n) phải ko ạ?
Em cảm ơn!
Đúng ra phải là:
Số lần lặp for là f_{for} = \frac{n-3}{1}+1=n-2 (phép tăng i++ có độ phức tạp O(1)).
Gọi độ phức tạp của khối lệnh i là O(f_i(n))
Vậy độ phức tạp của vòng lặp for này là O(f_{for}(n) * \Sigma f_i(n)) = O(n\ \Sigma f_i(n))
Bạn không nói 3 khối lệnh này làm gì nên không thể đánh giá chúng là O(1) được.
Dạ. Nếu 3 khối lệnh đó là phép gán thì sẽ là O(n*3) sử dụng quy tắc bỏ hằng số thì sẽ là O(n) đúng không ạ?
Đúng rồi cậu. Cậu nắm được rồi đấy!