Big O: lồng cho vòng lặp với sự phụ thuộc


9

Tôi đã được giao bài tập về nhà với Big O. Tôi bị mắc kẹt với các vòng lặp lồng nhau phụ thuộc vào vòng lặp trước đó. Đây là một phiên bản thay đổi của câu hỏi bài tập về nhà của tôi, vì tôi thực sự muốn hiểu nó:

sum = 0;
for (i = 0; i < n; i++ 
    for (j = 0; j < i; j++) 
        sum++;

Phần ném tôi đi là j < iphần. Có vẻ như nó sẽ thực hiện gần giống như một nhân tố, nhưng có thêm. Bất kỳ gợi ý sẽ được thực sự đánh giá cao.


Giải thích hay ở đây
saadtaame

Câu trả lời:


10

Vì vậy, hãy để tôi làm rõ một vài điều, bạn quan tâm đến ký hiệu big-O - điều này có nghĩa là giới hạn trên . Nói cách khác, bạn có thể đếm nhiều bước hơn bạn thực sự làm. Cụ thể, bạn có thể sửa đổi thuật toán thành

 ...
    for (j = 0; j < n; j++) 
 ...

nÔi(n2)

Tất nhiên, bạn muốn có một ước tính tốt cho giới hạn trên. Vì vậy, để hoàn thành, chúng tôi muốn xác định một giới hạn thấp hơn. Điều này có nghĩa là nó ổn để đếm ít bước hơn. Vì vậy, hãy xem xét sửa đổi

for (i = n/2; i < n; i++)
    for (j = 0; j < n/2; j++) 
        sum++;

n/2n2/4Ω(n2)n2Θ(n2)

Nếu bạn muốn biết thêm, đọc ở đây .


6
sum = 0;
for (i = 0; i < n; i++)
    for (j = 0; j < i; j++) 
        sum++;

Hãy tìm ra điều này:

  • Khi i = 0, vòng lặp bên trong sẽ không chạy ở tất cả ( 0<0 == false).
  • Khi i = 1, vòng lặp bên trong sẽ chạy một lần (cho j == 0).
  • Khi i = 2, vòng lặp bên trong sẽ chạy hai lần. (cho j == 0 và j == 1).

Do đó, thuật toán này sẽ tăng sumsố lần sau:

Σx= =1nx-1= =0+1+2+3+4...+n-1= =n(n-1)2

nn2-n2n2θ(n2)Ôi(n2) mộtnd Ω(n2)


3

hãy xem tôi có thể giải thích điều này ...

Vì vậy, nếu vòng lặp bên trong là j

Bây giờ, đối với lần lặp đầu tiên, bạn thực hiện n- (n-1) lần qua vòng lặp bên trong. vào lần thứ hai bạn thực hiện n- (n-2) lần qua vòng lặp bên trong. Vào lần thứ N bạn thực hiện n- (nn) lần, tức là n lần.

nếu bạn tính trung bình số lần bạn đi qua vòng lặp bên trong thì nó sẽ không có 2 lần.

Vì vậy, bạn có thể nói đây là O (n * n / 2) = O (n ^ 2/2) = O (n ^ 2)

Điều đó có ý nghĩa?


Hơi lạ một chút, nhưng tôi nghĩ tôi hiểu rồi! Cảm ơn! Có thể mất một chút thời gian để chìm trong haha

Vì vậy, nếu j < iphần đó thực sự j < i^2, kết quả O cho phần đó sẽ là n ^ 2/2?

Trước hết lưu ý rằng O (n ^ 2/2) = O (n ^ 2). Bây giờ nếu bạn thay đổi nó thành j <i ^ 2, thì bạn đang làm (n- (n-1)) ^ 2 ở lần lặp đầu tiên và n ^ 2 ở lần lặp cuối cùng. Tôi không nhớ ký hiệu big-O sẽ là gì cho vòng lặp bên trong. O (n ^ 2) là giới hạn trên lỏng lẻo. Vì vậy, một giới hạn trên lỏng lẻo cho toàn bộ điều sẽ là O (n ^ 3), nhưng vòng lặp bên trong đó nhỏ hơn O (n ^ 2). Điều đó có ý nghĩa?
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.