Big-O notasyonu O(n)
ve Little-O notasyonu arasındaki fark nedir o(n)
?
Big-O notasyonu O(n)
ve Little-O notasyonu arasındaki fark nedir o(n)
?
Yanıtlar:
f ∈ O (g) diyor ki, esasen
İçin en az bir sabit seçimi k > 0, bir sabiti bulabilirsiniz bir tür eşitsizlik 0 a <= f (x) <= kg (x) tüm x için geçerlidir> söyledi.
O (g) 'nin, bu koşulun sahip olduğu tüm işlevler kümesi olduğunu unutmayın.
f ∈ o (g) diyor ki, esasen
İçin her bir sabit seçimi k > 0, bir sabiti bulabilirsiniz bir tür eşitsizlik 0 a <= f (x) <kg (x) tüm x için geçerlidir> söyledi.
Bir kez daha, o (g) 'nin bir küme olduğunu unutmayın.
Big-O'da, sadece eşitsizliğin minimum x'in ötesinde tuttuğu belirli bir çarpan k'yi bulmanız gerekir .
Little-o'da, k'yi ne kadar küçük yaparsanız yapın , negatif veya sıfır olmadığı sürece , eşitsizliğin asgari x olması gerekir .
Her ikisi de üst sınırları açıklar, ancak sezgisel olarak biraz da olsa, Little-o daha güçlü bir ifadedir. F ∈ o (g) ise f ve O büyüme hızları arasında f ∈ O (g) 'ye göre çok daha büyük bir boşluk vardır.
Eşitsizliğin bir örneği şudur: f ∈ O (f) doğrudur, ancak f ∈ o (f) yanlıştır. Bu nedenle, Big-O "f ∈ O (g), f'nin asimptotik büyümesinin g'lerden daha hızlı olmadığı anlamına gelir" oysa "f ∈ o (g), f'nin asimptotik büyümesinin g'lerden kesinlikle daha yavaş olduğu anlamına gelir". Sanki <=
karşısında <
.
Daha spesifik olarak, g (x) değeri f (x) değerinin sabit bir katı ise, f-O (g) doğrudur. Bu nedenle big-O notasyonu ile çalışırken sabitleri bırakabilirsiniz.
Bununla birlikte, f o (g) 'nin doğru olması için, g formülünde daha yüksek bir x gücü içermelidir ve bu nedenle f (x) ve g (x) arasındaki göreceli ayrım, x büyüdükçe daha da büyüymelidir.
Sadece matematik örneklerini kullanmak için (algoritmalara başvurmak yerine):
Aşağıdakiler Big-O için doğrudur, ancak little-o kullandıysanız doğru olmaz:
Little-o için aşağıdakiler geçerlidir:
F ∈ o (g) ise, bu f ∈ O (g) anlamına gelir. örneğin x² ∈ o (x³) bu yüzden x² ∈ O (x³), (yine, O <=
ve o gibi düşünün <
)
a
biri k
için: ..." değil, "her k
biri için a
: ..."
Gibi büyük-O az o için ≤
etmektir <
. Big-O kapsayıcı bir üst sınır, little-o ise sıkı bir üst sınırdır.
Örneğin, işlev f(n) = 3n
:
O(n²)
, o(n²)
veO(n)
O(lg n)
, o(lg n)
yao(n)
Benzer şekilde, sayı 1
:
≤ 2
, < 2
Ve≤ 1
≤ 0
, < 0
ya< 1
İşte genel fikri gösteren bir tablo:
(Not: tablo iyi bir kılavuzdur, ancak sınır tanımı normal sınır yerine üst sınır olarak olmalıdır . Örneğin, 3 + (n mod 2)
sonsuza kadar 3 ile 4 arasında salınır. O(1)
Normal bir sınırlamaya sahip olmamasına rağmen, hala vardır a lim sup
: 4.)
Big-O gösteriminin asimtotik karşılaştırmalara nasıl dönüştüğünü ezberlemenizi tavsiye ederim. Karşılaştırmaları hatırlamak daha kolaydır, ancak daha az esnektir, çünkü n O (1) = P gibi şeyleri söyleyemezsiniz .
Kavramsal olarak bir şeyi kavrayamadığım zaman, birinin X'i neden kullanacağını düşünmenin X'i anlamak için yararlı olduğunu görüyorum.
[bildiğiniz şeyler] Algoritmaları sınıflandırmanın yaygın bir yolu çalışma zamanıdır ve bir algoritmanın büyük Oh karmaşıklığını göstererek hangisinin "daha iyi" olduğu konusunda oldukça iyi bir tahmin alabilirsiniz - hangisi "en küçük" işleve sahipse O! Gerçek dünyada bile, O (N) O (N²) 'den "daha iyi", süper büyük sabitler ve benzerleri gibi aptalca şeyleri engelliyor. [/ Bildiğiniz şeyler]
Diyelim ki O (N) 'de çalışan bir algoritma var. Oldukça iyi, ha? Ama diyelim ki siz (siz zekice bir kişi, siz) O ( N ⁄ loglogloglogN ) içinde çalışan bir algoritma buldunuz . YAŞASIN! O daha hızlı! Ama tezinizi yazarken bunu tekrar tekrar yazmayı aptalca hissedersiniz. Yani bir kez yazıyorsunuz ve “Bu makalede, daha önce O (N) zamanında hesaplanan X algoritmasının aslında o (n) olarak hesaplanabilir olduğunu kanıtladım.”
Böylece, herkes algoritmanızın daha hızlı olduğunu bilir - ne kadar belirsiz olduğu, ancak daha hızlı olduğunu bilir. Teorik olarak. :)