Big O: Bağımlılıkla Döngü İçin İç İçe


9

Bana Big O ile bir ev ödevi verildi. Bir önceki döngüne bağımlı olan döngüler için iç içe geçmişim. İşte benim ödev sorumun değiştirilmiş bir versiyonu, çünkü gerçekten anlamak istiyorum:

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

Beni fırlatan j < ikısım. Neredeyse bir faktöriyel gibi yürütülecek gibi görünüyor, ancak ek olarak. Herhangi bir ipucu gerçekten takdir edilecektir.


Güzel açıklama burada
saadtaame

Yanıtlar:


10

Bu yüzden birkaç şeyi açıklığa kavuşturayım, büyük O gösterimi ile ilgileniyorsunuz - bu üst sınır anlamına geliyor . Başka bir deyişle, gerçekte yaptığınızdan daha fazla adım saymanız uygundur. Özellikle, algoritmayı şu şekilde değiştirebilirsiniz:

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

İki iç içe döngüler, her döngü çalışır sahip Yani defa hangi bir verir üst bağlanmış aitnÖ(n2)

Tabii ki, üst sınır için iyi bir tahmin yapmak istersiniz. Bu nedenle, tamamlanması için bir alt sınır belirlemek istiyoruz. Bu, daha az adım saymanın iyi olduğu anlamına gelir. Bu yüzden değişikliği düşünün

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

Burada, döngü yinelemelerinin sadece bir kısmını gerçekleştiriyoruz. Yine iki iç içe döngümüz var, ama bu sefer döngü başına yinelememiz var, bu da en az 2/4 eklememiz olduğunu gösteriyor . Bu durumda bu asimptotik alt sınırı . Alt ve üst sınır çakıştığından, sıkı bir asimtotik bağ olduğunu bile söyleyebiliriz ve yazarız .n/2n2/4Ω(n2)n2Θ(n2)

Daha fazlasını öğrenmek istiyorsanız, burayı okuyun .


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

Bunu izleyelim:

  • İ = 0 olduğunda, iç döngü hiç çalışmaz ( 0<0 == false).
  • İ = 1 olduğunda, iç döngü bir kez çalışır (j == 0 için).
  • İ = 2 olduğunda, iç döngü iki kez çalışır. (j == 0 ve j == 1 için).

Bu algoritma böylece sumaşağıdaki sayıda artacaktır :

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

İncelemeyle, toplamın bir "üçgen sayı" olduğunu görebiliriz. Dağıtım pay geri kalanına, en gelmesi hızlı büyüyen bir terimdir, bunlardan dolayısıyla Bachman-Landau Büyük-Teta karmaşıklığı .nn2-n2n2θ(n2)Ö(n2) birnd Ω(n2)


3

Bakalım bunu açıklayabilir miyim ...

İç döngü j olsaydı

Şimdi, ilk yineleme için iç döngüden n- (n-1) kez yaparsınız. ikinci kez iç döngüden n- (n-2) kez yaparsınız. N'inci kez n - (nn) kez, yani n kere yaparsınız.

iç döngüden geçme sayısını ortalama yaparsanız, n / 2 kez olur.

Yani bunun O (n * n / 2) = O (n ^ 2/2) = O (n ^ 2) olduğunu söyleyebilirsiniz.

bu mantıklı mı?


Biraz garip, ama sanırım anladım! Teşekkürler!

Eğer o j < ikısım aslında olsaydı, o kısım j < i^2için elde edilen O n ^ 2/2 olurdu?

Her şeyden önce O (n ^ 2/2) = O (n ^ 2) olduğuna dikkat edin. Şimdi j <i ^ 2 olarak değiştirirseniz, ilk yinelemede (n- (n-1)) ^ 2 ve son yinelemede n ^ 2 yapıyorsunuz. İç döngü için büyük O gösteriminin ne olacağını hatırlamıyorum. O (n ^ 2) gevşek bir üst sınırdır. Dolayısıyla, her şey için gevşek bir üst sınır O (n ^ 3) olacaktır, ancak bu iç döngü O (n ^ 2) 'den daha azdır. bu mantıklı mı?
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.