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 < i
bagian. Sepertinya itu akan mengeksekusi hampir seperti faktorial, tetapi dengan tambahan. Petunjuk apa pun akan sangat dihargai.
Jawaban:
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
Jadi Anda memiliki dua loop bersarang, setiap loop berjalan kali, yang memberi Anda atas terikat dari O ( n 2 )n O ( 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
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 / 2 n2/ 4 Ω ( n2) adalah ikatan asimptotik yang ketat, dan kita menulis Θ ( n 2 ) .n2 Θ ( n2)
Jika Anda ingin tahu lebih banyak, baca di sini .
sumber
Mari kita lacak ini:
0<0 == false
).Algoritma ini dengan demikian akan menambah
sum
beberapa kali berikut:sumber
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
j < i
bagian itu sebenarnyaj < i^2
, O yang dihasilkan untuk bagian itu adalah n ^ 2/2?