Döngü günlük zamanları çalıştığında karmaşıklık

If we're finding the no. of factors of a number, we can use the following efficient loop. for(i=1;i<=sqrt(n);i++), where n is the 'no' whose factors are to be found. This loop would have a complexity of O(n).

Aşağıdaki kod parçacığının zaman karmaşıklığı ne olurdu? (Günlüğün (x), temel 2'deki günlük değerini döndürdüğünü varsayalım). O (n ^ 2) ya da O (n logn)? (Döngü iki ikiye böldüğünde log n'nin karmaşıklık olduğunu kabul ediyorum.

void fun()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=log(i);j++)
            printf("hello world");
}
0
Evet, ev ödevi eğlencelidir :-)
katma yazar Thorsten Dittmar, kaynak
Yığın Taşması'nda, yardım istemeden önce insanların çalışmalarına biraz çaba göstermelerini bekliyoruz. Ve sorunu çözmek için neyi denediklerini açıklamak.
katma yazar Dialecticus, kaynak
Yığın Taşması'nda, yardım istemeden önce insanların çalışmalarına biraz çaba göstermelerini bekliyoruz. Ve sorunu çözmek için neyi denediklerini açıklamak.
katma yazar Dialecticus, kaynak
Yığın Taşması'nda, yardım istemeden önce insanların çalışmalarına biraz çaba göstermelerini bekliyoruz. Ve sorunu çözmek için neyi denediklerini açıklamak.
katma yazar Dialecticus, kaynak

6 cevap

Kodunuzda basılan gerçek "Merhaba dünya" sayısı:

Daha sonra log (n!) 'İn Srinivasa Ramanujan yaklaşımı ' nı kullanabilirsiniz:

Tüm kodun gerçek karmaşıklığını elde etmek için, O (n logn)

1
katma
Evet, a için gibi bir döngü için (i = 1; i <= n; i * = 2) veya (i = n; i> = 1; i/= 2) O (logn) ile çalışır, ancak sorunuzda böyle bir döngü yoktur. Burada logn terimi, ikinci döngüdeki j <= log (i) koşulundan gelir.
katma yazar BlackDwarf, kaynak
Ne yazık ki ne demek istediğinizi anlamadım, ne de "sayının faktörlerini bul" problemi ile sağladığınız kod pasajı arasındaki bağlantıyı alamıyorum ... (i = 1; i <= sqrt (n); i ++) karmaşıklık O (n) doğrudur, aslında O (sqrt (n)) ile çalışır.
katma yazar BlackDwarf, kaynak
Döngü ikiye bölündüğünde log n'nin karmaşıklık olduğunu kabul ediyorum. yani. I/= 2
katma yazar TheHardRock, kaynak
fakat ilk üç satırda yazdığım gibi, bu programın karmaşıklığının, döngü sqrt (n) kez çalıştırıldıktan sonra bile O (n) olacağını gösterir. Peki log n terimi önceki durumda olduğu gibi O (n) yerine j <= log (i) 'den sonra nasıl geliyor?
katma yazar TheHardRock, kaynak

Kodunuzda basılan gerçek "Merhaba dünya" sayısı:

Daha sonra log (n!) 'İn Srinivasa Ramanujan yaklaşımı ' nı kullanabilirsiniz:

Tüm kodun gerçek karmaşıklığını elde etmek için, O (n logn)

1
katma
Evet, a için gibi bir döngü için (i = 1; i <= n; i * = 2) veya (i = n; i> = 1; i/= 2) O (logn) ile çalışır, ancak sorunuzda böyle bir döngü yoktur. Burada logn terimi, ikinci döngüdeki j <= log (i) koşulundan gelir.
katma yazar BlackDwarf, kaynak
Ne yazık ki ne demek istediğinizi anlamadım, ne de "sayının faktörlerini bul" problemi ile sağladığınız kod pasajı arasındaki bağlantıyı alamıyorum ... (i = 1; i <= sqrt (n); i ++) karmaşıklık O (n) doğrudur, aslında O (sqrt (n)) ile çalışır.
katma yazar BlackDwarf, kaynak
Döngü ikiye bölündüğünde log n'nin karmaşıklık olduğunu kabul ediyorum. yani. I/= 2
katma yazar TheHardRock, kaynak
fakat ilk üç satırda yazdığım gibi, bu programın karmaşıklığının, döngü sqrt (n) kez çalıştırıldıktan sonra bile O (n) olacağını gösterir. Peki log n terimi önceki durumda olduğu gibi O (n) yerine j <= log (i) 'den sonra nasıl geliyor?
katma yazar TheHardRock, kaynak

Kodunuzda basılan gerçek "Merhaba dünya" sayısı:

Daha sonra log (n!) 'İn Srinivasa Ramanujan yaklaşımı ' nı kullanabilirsiniz:

Tüm kodun gerçek karmaşıklığını elde etmek için, O (n logn)

1
katma
Evet, a için gibi bir döngü için (i = 1; i <= n; i * = 2) veya (i = n; i> = 1; i/= 2) O (logn) ile çalışır, ancak sorunuzda böyle bir döngü yoktur. Burada logn terimi, ikinci döngüdeki j <= log (i) koşulundan gelir.
katma yazar BlackDwarf, kaynak
Ne yazık ki ne demek istediğinizi anlamadım, ne de "sayının faktörlerini bul" problemi ile sağladığınız kod pasajı arasındaki bağlantıyı alamıyorum ... (i = 1; i <= sqrt (n); i ++) karmaşıklık O (n) doğrudur, aslında O (sqrt (n)) ile çalışır.
katma yazar BlackDwarf, kaynak
Döngü ikiye bölündüğünde log n'nin karmaşıklık olduğunu kabul ediyorum. yani. I/= 2
katma yazar TheHardRock, kaynak
fakat ilk üç satırda yazdığım gibi, bu programın karmaşıklığının, döngü sqrt (n) kez çalıştırıldıktan sonra bile O (n) olacağını gösterir. Peki log n terimi önceki durumda olduğu gibi O (n) yerine j <= log (i) 'den sonra nasıl geliyor?
katma yazar TheHardRock, kaynak

İç döngü printf yaklaşık log (i) kez çağırır, i için [1..n] . Toplam arama sayısı yaklaşık

log(1)+log(2)+log(3)+...log(n) = log(n!)

Şimdi, Stirling asimptotik formülü size çözümü verecektir.


Temel 2 logaritma için kesin sayı

0 + 1 + 1 + 2 + 2 + 2 + 2 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + ... + floor(Lg(n))

veya

1.0 + 2.1 + 4.2 + 8.3 + ... + k.floor(Lg(n))

Fveyaconvenience, assume that n is of the form n=2^m-1, so that the last run is complete (and k=2^(m-1)).

Now take the sum of x^k from 0 to m-1, which equals (x^m-1)/(x-1) and derive on x to get the sum of x^k.k. Evaluating fveyax=2, you get

s = m.2^m-2^m+2 = (n+1).Lg(n+1)-n+1

Fveyaother n, you need to add a correction term fveyathe last partial run. With m=floor(Lg(n+1)):

t = m.(n+1-2.2^m)
0
katma

İç döngü printf yaklaşık log (i) kez çağırır, i için [1..n] . Toplam arama sayısı yaklaşık

log(1)+log(2)+log(3)+...log(n) = log(n!)

Şimdi, Stirling asimptotik formülü size çözümü verecektir.


Temel 2 logaritma için kesin sayı

0 + 1 + 1 + 2 + 2 + 2 + 2 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + ... + floor(Lg(n))

veya

1.0 + 2.1 + 4.2 + 8.3 + ... + k.floor(Lg(n))

Fveyaconvenience, assume that n is of the form n=2^m-1, so that the last run is complete (and k=2^(m-1)).

Now take the sum of x^k from 0 to m-1, which equals (x^m-1)/(x-1) and derive on x to get the sum of x^k.k. Evaluating fveyax=2, you get

s = m.2^m-2^m+2 = (n+1).Lg(n+1)-n+1

Fveyaother n, you need to add a correction term fveyathe last partial run. With m=floor(Lg(n+1)):

t = m.(n+1-2.2^m)
0
katma

İç döngü printf yaklaşık log (i) kez çağırır, i için [1..n] . Toplam arama sayısı yaklaşık

log(1)+log(2)+log(3)+...log(n) = log(n!)

Şimdi, Stirling asimptotik formülü size çözümü verecektir.


Temel 2 logaritma için kesin sayı

0 + 1 + 1 + 2 + 2 + 2 + 2 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + ... + floor(Lg(n))

veya

1.0 + 2.1 + 4.2 + 8.3 + ... + k.floor(Lg(n))

Fveyaconvenience, assume that n is of the form n=2^m-1, so that the last run is complete (and k=2^(m-1)).

Now take the sum of x^k from 0 to m-1, which equals (x^m-1)/(x-1) and derive on x to get the sum of x^k.k. Evaluating fveyax=2, you get

s = m.2^m-2^m+2 = (n+1).Lg(n+1)-n+1

Fveyaother n, you need to add a correction term fveyathe last partial run. With m=floor(Lg(n+1)):

t = m.(n+1-2.2^m)
0
katma