Big O: Bersarang Untuk Loop Dengan Ketergantungan

9

Saya diberi tugas pekerjaan rumah dengan O Besar. Saya terjebak dengan loop untuk loop yang tergantung pada loop sebelumnya. Ini adalah versi yang diubah dari pertanyaan pekerjaan rumah saya, karena saya benar-benar ingin memahaminya:

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

Bagian yang mengusir saya adalah j < ibagian. Sepertinya itu akan mengeksekusi hampir seperti faktorial, tetapi dengan tambahan. Petunjuk apa pun akan sangat dihargai.

Raphael
sumber
Penjelasan yang bagus di sini
saadtaame

Jawaban:

10

Jadi izinkan saya mengklarifikasi beberapa hal, Anda tertarik pada notasi O besar - ini berarti batas atas . Dengan kata lain, tidak apa-apa menghitung lebih banyak langkah daripada yang sebenarnya Anda lakukan. Secara khusus, Anda dapat memodifikasi algoritme untuk

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

Jadi Anda memiliki dua loop bersarang, setiap loop berjalan kali, yang memberi Anda atas terikat dari O ( n 2 )nHAI(n2)

Tentu saja, Anda ingin memiliki perkiraan yang baik untuk batas atas. Jadi untuk penyelesaian, kami ingin menentukan batas bawah. Ini berarti tidak apa-apa untuk menghitung langkah lebih sedikit. Jadi pertimbangkan modifikasi

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

Di sini, kami hanya melakukan beberapa loop-iterasi. Sekali lagi kita memiliki dua loop bersarang, tapi kali ini kami memiliki iterasi per loop, yang menunjukkan bahwa kita memiliki setidaknya n 2 / 4 tambahan. Dalam hal ini kami menunjukkan batas bawah asimptotik ini dengan Ω ( n 2 ) . Karena batas bawah dan atas bertepatan, kita bahkan dapat mengatakan bahwa nn/2n2/4Ω(n2) adalah ikatan asimptotik yang ketat, dan kita menulis Θ ( n 2 ) .n2Θ(n2)

Jika Anda ingin tahu lebih banyak, baca di sini .

A.Schulz
sumber
6
sum = 0;
for (i = 0; i < n; i++)
    for (j = 0; j < i; j++) 
        sum++;

Mari kita lacak ini:

  • Ketika saya = 0, loop dalam tidak akan berjalan sama sekali (0<0 == false ).
  • Ketika i = 1, loop dalam akan berjalan satu kali (untuk j == 0).
  • Ketika i = 2, loop dalam akan berjalan dua kali. (untuk j == 0 dan j == 1).

Algoritma ini dengan demikian akan menambah sumbeberapa kali berikut:

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

nn2-n2n2θ(n2)HAI(n2) Sebuahnd Ω(n2)

KeithS
sumber
3

mari kita lihat apakah saya bisa menjelaskan ini ...

Jadi jika loop dalam adalah j

Sekarang, untuk iterasi pertama Anda lakukan n- (n-1) kali melalui loop dalam. pada kali kedua Anda melakukan n- (n-2) kali melalui loop dalam. Pada Nth kali Anda melakukan n- (nn) kali melalui, yaitu n kali.

jika Anda rata-rata berapa kali Anda melewati loop dalam itu n / 2 kali.

Jadi bisa dibilang ini O (n * n / 2) = O (n ^ 2/2) = O (n ^ 2)

Apakah itu masuk akal?


sumber
Agak aneh, tapi saya rasa saya mengerti! Terima kasih! Mungkin butuh sedikit waktu untuk tenggelam dalam haha
Jadi jika j < ibagian itu sebenarnya j < i^2, O yang dihasilkan untuk bagian itu adalah n ^ 2/2?
Pertama-tama perhatikan bahwa O (n ^ 2/2) = O (n ^ 2). Sekarang jika Anda mengubahnya menjadi j <i ^ 2, maka Anda melakukan (n- (n-1)) ^ 2 pada iterasi pertama dan n ^ 2 pada iterasi terakhir. Saya tidak ingat apa notasi O besar untuk loop batin. O (n ^ 2) adalah batas atas yang longgar. Jadi batas atas yang longgar untuk semuanya adalah O (n ^ 3), tetapi lingkaran dalam itu kurang dari O (n ^ 2). Apakah itu masuk akal?