n * log n ve n / log n polinom çalışma süresine karşı


14

Θ(n) den daha hızlı ve dan daha yavaş olduğunu anlıyorum . Ne beni anlamak için zordur aslında karşılaştırmak nasıl ve ile .Θ(ngünlükn)Θ(n/günlükn)Θ(ngünlükn)Θ(n/günlükn)Θ(nf)0<f<1

Örneğin, ile veyaΘ(n/logn)Θ(n2/3)Θ(n1/3)

Bu gibi durumlarda ilerlemeye yönelik bazı talimatlara sahip olmak istiyorum. Teşekkür ederim.

Yanıtlar:


3

Sadece birkaç grafik çizerseniz, iyi durumda olacaksınız. Wolfram Alpha bu tür araştırmalar için harika bir kaynaktır:

denklemler

grafik

Bu bağlantı tarafından oluşturulur . Grafikte, log (x) 'in doğal logaritma olduğunu unutmayın, bu da bir grafiğin denkleminin biraz komik görünmesinin sebebidir.



Raphael ile hemfikir olmanın yanı sıra, bu resim çok daha iyi bir fikir verecek , daha geniş bir aralık seçmek ikinci işlevin kaybolmasına neden olacak ve bu da kafa karıştırıcı olabilir.
phant0m

9

, 2 n'nin tersidir. Tıpkı 2'ye n herhangi polinom daha hızlı büyür n k bakılmaksızın ne kadar büyük sonlu bir k deyişle, log n herhangi polinom fonksiyonları daha yavaş büyüyecek n k bakılmaksızın ne kadar küçük bir Sıfır dışındaki olumlu k olduğunu.logn2n2nnkklognnkk

vs n k , çünkü k < 1 aynıdır: n / log n vs n / n 1 - kn/lognnkk<1n/lognn/n1k

olarak büyük için n , n / log n > n k için k < 1 ve geniş n .n1k>lognnn/logn>nkk<1n


3

Birçok algoritma için bazen sabitler farklı olur, bir veya diğeri daha küçük veri boyutları için daha hızlı veya daha yavaş olur ve algoritmik karmaşıklık tarafından iyi sıralanmaz.

Söyledikten sonra, sadece süper büyük veri boyutlarını dikkate alırsak , yani. biri sonunda kazanır ki, o zaman O(n^f)daha hızlı olduğu O(n/log n)için 0 < f < 1.

Algoritmik karmaşıklık büyük bir kısmı böylece bilerek sonunda hızlıdır hangi algoritmanın belirlemektir O(n^f)daha hızlı olduğu O(n/log n)için 0 < f < 1, çoğu zaman yeterlidir.

Genel bir kural ile çarparak (ya da bölen) olan log nen sonunda ile çarparak (ya da bölünerek) ile karşılaştırıldığında ihmal edilecek n^fherhangi f > 0.

Bunu daha net göstermek için, n arttıkça neler olduğunu ele alalım.

   n       n / log n         n^(1/2)
   2        n/ 1              ?
   4        n/ 2             n/ 2
   8        n/ 3              ?
  16        n/ 4             n/ 4
  64        n/ 6             n/ 8
 256        n/ 8             n/16
1024        n/10             n/32

Hangisinin daha hızlı azaldığını fark ettiniz mi? Bu n^fsütun.

f1'e yakın olsa bile , n^fsütun daha yavaş başlayacaktır, ancak n iki katına çıktığında, paydadaki değişim hızı hızlanırken, n/log nsütunun paydası sabit bir hızda değişmektedir.

Belirli bir durumu grafik üzerinde çizelim

resim açıklamasını buraya girin resim açıklamasını buraya girin

Kaynak: Wolfram Alpha

Seçili O(n^k)şekilde koldukça yakın 1'e (yer almaktadır 0.9). Ayrıca sabitleri seçtim, böylece başlangıçta O(n^k)yavaşlar. Ancak, sonunda "kazanır" ve daha az zaman alır dikkat edin O(n/log n).


n / log n hakkında

Biraz yazım hatasıydı, başlangıçta kastettiğim buydu. Her neyse, n^ksabitler başlangıçta daha yavaş olacak şekilde seçilse bile , sonunda daha hızlı olduğunu gösteren daha uygun bir grafik ekledim .

3

Sadece n olarak düşünnf . Yani örneğin,n2/3=n/n1/3. Sonra büyümesini karşılaştırmak kolaydırnn1fn2/3=n/n1/3

nlognvs.nn1f.

lognnεε>0


1

Çalışma sürelerini karşılaştırırken, büyük n değerleri kullanarak bunları karşılaştırmak her zaman yararlıdır. Benim için bu, hangi fonksiyonun daha yavaş olduğu hakkında sezginin oluşturulmasına yardımcı olur

Sizin durumunuzda n = 10 ^ 10 ve a = .5 düşünün

O(n/logn) = O(10^10/10) = O(10^9)
O(n^1/2) = O(10^10^.5) = O(10^5)

Bu nedenle, O (n ^ a) O (n / logn) 'dan daha hızlıdır, 0 <a <1 Yalnızca bir değer kullandığımda, işlev hakkında sezgi oluşturmak için birden çok değer kullanabilirsiniz


1
Yazmayın O(10^9), ancak sezgi oluşturmak için bazı sayıları denemenin ana noktası doğrudur.

Başarısız. Bu doğru değil. Önyargılı olabilen tek bir n sabiti değiştirdiniz. Farklı sabitleri seçersem, herhangi bir algoritmanın daha iyi görünmesini sağlayabilirdim. Büyük O gösterimi, uzun vadede daha hızlı olacak eğilimleri belirlemek için kullanılır. Bunu yapmak için, n daha küçük olduğunda daha yavaş olsa bile, büyük n için daha hızlı olduğunu gösterebilmelisiniz.

Teşekkürler. Birden fazla değer bölümü eklendi ve daha büyük sayıları dikkate almak için

Bazı sabit a için f (a)> g (a) olduğu için mutlaka O (f (x))> O (g (x)) anlamına gelmediğine dikkat edilmelidir. Bu, sezgi oluşturmak için yararlıdır, ancak titiz bir kanıt oluşturmak için yetersizdir. Bu ilişkinin geçerli olduğunu göstermek için, bunun tek bir büyük n değil, TÜM büyük n için geçerli olduğunu göstermeniz gerekir. Benzer şekilde, <1 pozitif derecedeki tüm polinomlar için doğru olduğunu göstermelisiniz.

1

fg

nα1(logn)α2(loglogn)α3nβ1(logn)β2(loglogn)β3(α1,α2,α3)<(β1,β2,β3)

(2,10)<(3,5)(2,10)>(2,5)

Örneğinize uygulanır:

Ö(n/günlükn)(1,-1,0)

Ö(n2/3)(2/3,0,0)

Ö(n1/3)(1/3,0,0)

(1/3,0,0)<(2/3,0,0)<(1,1,0)O(n1/3)O(n2/3)O(n/logn)

Şunu söyleyebilirsiniz: n'nin güçleri, kütük kütüğünün güçlerine egemen olan kütük güçlerine hükmeder.

Kaynak: Somut Matematik, s. 441

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.