Hãy xem nào:
int j = 3;
mất thời gian không đổi O (1).
int k = j * n / 345
mất một số hàm thời gian logarit của các biến j và n
if (k > 100)
mất thời gian không đổi O (1).
System.out.println("k: " + k);
mất chức năng thời gian logarit của k
for (int i=1; i<n; i*=2)
lấy hàm thời gian logarit của n , (log (n)) là chính xác, bởi vì nếu t là số lần lặp của vòng lặp này thì giá trị của i có thể được biểu thị là: i = 2 t-1 , nếu t = 1 trong lần lặp đầu tiên, do đó vòng lặp tiếp tục miễn là 2 t - 1 <n , trong đó n không thay đổi.
Trong phép tính, nếu 2 t - 1 <n thì t - 1 <log 2 (n)
Và nếu t-1 <log 2 (n) thì t <log 2 (n) +1
Và nếu trong mỗi lần lặp, t được tăng thêm 1, chúng ta có thể thấy rằng vòng lặp này thực sự mất thời gian Θ (log (n)), nếu độ phức tạp thời gian chạy của mã bên trong vòng lặp này là không đổi, tức là O (1) tất nhiên!
Bên trong vòng lặp này, có một vòng lặp khác:
for (int j=0; j<i; j++)
k++;
Hãy phân tích điều này:
k++;
mất thời gian không đổi, tức là thời gian O (1).
Vì vậy, thật thú vị khi phân tích độ phức tạp thời gian chạy của vòng lặp for bên trong.
Hãy xem nào:
Theo mã của vòng lặp for bên trong này, có vẻ như có i lặp trong vòng lặp for bên trong này, vì vậy thời gian chạy của nó là Θ (i) , không chỉ O (i) , vì nó không bị ngắt ở giữa, nhưng hãy nhớ rằng i <n , vì vòng lặp for bên ngoài, nên mặc dù lúc đầu, nó chỉ cần 1 lần lặp khi i = 1 , 2 lần lặp khi i = 2 , 4 lần lặp khi i = 4 , 8 lần lặp khi i = 8 . .. và v.v., vì tôi nhân đôi chính nó ở cuối vòng lặp for bên ngoài trong dòng i * = 2 , nên trong tổng số thực hiện là 1 + 2 + 4 + 8 + ... lặp đi lặp lại nhưng cho đến khi invì vậy số lần lặp tối đa có thể có trong vòng lặp for bên trong này là khi i = n-1 trong trường hợp xấu nhất, vì vậy nếu trong lần thực hiện cuối cùng của vòng lặp for bên trong, nó đã chạy các lần lặp n-1 , vì vậy trước khi nó chạy ( n-1) / 2 lần lặp và trước đó nó đã chạy (n-1) / 4 lần lặp và trước đó nó đã chạy (n-1) / 8 lần lặp ... vì vậy trong tổng số lần thực hiện là:
n-1 + (n-1) / 2 + (n-1) / 4 + (n-1) / 8 ... = (n-1) (1 + 1/2 + 1/4 + 1/8 ...) = (n-1) (2) = 2n-2 = Θ (n)
Hãy nhớ lại rằng 1 + 1/2 + 1/4 + 1/8 ... = 2 là tổng của chuỗi hình học nổi tiếng.
Hãy nhớ rằng vòng lặp for bên ngoài mất (log (n))
Và vòng lặp for bên trong mất Θ (n).
Và độ phức tạp thời gian chạy của vòng lặp for bên trong vòng lặp for là độ phức tạp thời gian chạy của vòng lặp for bên ngoài nhân với độ phức tạp thời gian chạy của vòng lặp for bên trong, do đó cần có thời gian chạy Θ (nlogn).
Vì vậy, tóm lại, thời gian chạy của chức năng này là Θ (nlogn) .
Hy vọng rằng điều này trả lời tốt câu hỏi của bạn và dạy cho bạn cách phân tích độ phức tạp thời gian chạy của các thuật toán và hàm.