Yanıtlar:
Sadece birkaç grafik çizerseniz, iyi durumda olacaksınız. Wolfram Alpha bu tür araştırmalar için harika bir kaynaktır:
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.
, 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.
vs n k , çünkü k < 1 aynıdır: n / log n vs n / n 1 - k
olarak büyük için n , n / log n > n k için k < 1 ve geniş n .
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 n
en sonunda ile çarparak (ya da bölünerek) ile karşılaştırıldığında ihmal edilecek n^f
herhangi 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^f
sütun.
f
1'e yakın olsa bile , n^f
sütun daha yavaş başlayacaktır, ancak n iki katına çıktığında, paydadaki değişim hızı hızlanırken, n/log n
sütunun paydası sabit bir hızda değişmektedir.
Belirli bir durumu grafik üzerinde çizelim
Kaynak: Wolfram Alpha
Seçili O(n^k)
şekilde k
oldukç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)
.
Ç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