Các vòng lặp lồng nhau luôn là O (n ^ k)?


9

Nếu tôi có một vòng lặp trong một vòng lặp khác, nhưng tôi biết vòng lặp bên trong sẽ chỉ chạy một lần, thuật toán này có còn là O (n ^ 2) không?

For i = 1 to n do

     For j = 1 to i do

          If (i==j) do

              For k = 1 to n

                  {Do stuff}

Vòng lặp rất bên trong sẽ chạy tối đa 1 lần, vì isẽ chỉ bằng jmột lần mỗi lần lặp của vòng lặp thứ hai. Đây có còn là n ^ 3 không?

Câu trả lời:


7

Nghĩ theo cách này. Bất kể N, hàm trong cùng sẽ chỉ thực hiện một lần cho mỗi lần thực hiện vòng lặp thứ hai. Điều này có nghĩa là, số lần nó thực hiện phụ thuộc vào N tuyến tính. Điều này có nghĩa là bạn có thể coi mọi thứ bên trong vòng lặp đầu tiên là hoạt động thời gian tuyến tính (O (n)) (giả sử {do Stuff} cũng là thời gian không đổi). Nếu bạn xem xét vòng lặp ngoài cùng, bạn sẽ thấy rằng bạn làm một cái gì đó mất O (n), n lần. Điều này có nghĩa là thời gian chạy tổng thể là O (n ^ 2)

Nếu bạn nhân đôi N, sẽ có tổng cộng N ^ 2 lần lặp thêm. Do đó, thời gian chạy tổng thể là N ^ 2.


Cảm ơn rât nhiều! Đây là những gì tôi tin, nhưng cách mà tôi luôn nghĩ về các vòng lặp lồng nhau làm tôi bối rối
john

@john, không vấn đề gì. Thật khó để làm đúng. Nó có ích nếu bạn nghĩ về việc nhân đôi N, và sau đó hỏi xem nó ảnh hưởng đến số lần bạn làm gì đó.
Oleksi

Huh? Vòng lặp đầu tiên và THIRD phụ thuộc vào n. Điều kiện chỉ đúng một lần cho mỗi lần thực hiện vòng lặp thứ hai. Chúng tôi có hai nhiệm vụ n ^ 2 ở đây, cặp vòng lặp ij và cặp vòng lặp ik. Kết quả vẫn là n ^ 2, mặc dù.
Loren Pechtel

@LorenPechtel rất tiếc. Lấy làm tiếc. Tôi bỏ qua điều này. Tôi đã cập nhật câu trả lời để phản ánh điều này.
Oleksi

9

Không, các vòng lặp lồng nhau không tự động có nghĩa là thuật toán của bạn là O (n ^ k). Đơn vị công việc cơ bản trong ví dụ của bạn là {Do stuff}, vì vậy bạn cần tính số lần sẽ thực hiện khi ntăng. Bạn thậm chí không cần jvòng lặp, vì nó chỉ đếm từ 1 đến ivà không làm gì cho đến khi đạt được i. Chỉ trên một lần lặp đó, nó thực sự làm bất kỳ công việc nào, vì vậy mã ví dụ của bạn là O (n ^ 2).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.