Big O (logn) log tabanı e mi?


97

İkili arama ağacı tipi veri yapıları için, Big O gösteriminin tipik olarak O (logn) olarak not edildiğini görüyorum. Günlükte küçük bir 'l' ile, bu doğal logaritma ile tanımlanan e (n) tabanını ifade eder mi? Basit soru için özür dilerim, ancak farklı zımni logaritmaları ayırt etmekte her zaman sorun yaşadım.


58
Diğerlerinin ikna edici bir şekilde işaret ettiği gibi, önemli değil. Tüm logaritmalar, yalnızca ilgili bazlara bağlı olarak sabit bir şekilde birbirinden farklıdır. Bu faktörler sabit olduğundan, asimptotik analizin amaçları için ilgisizdir. İkincisi, ima edilen temeli belirlerken, bağlama bağlıdır. Kaba bir kural olarak aşağıdakileri kullanın: 1. Bir matematikçi yazdığında log n, doğal logaritma anlamına gelir. 2. Bir bilgisayar bilimcisi yazdığında, log niki tabanını kastediyor. 3. Bir mühendis yazdığında, log non tabanını kasteder. Bunlar genellikle doğrudur.
jason

4
@Jason, (matematiğin içinde) başka bir kural, ln n'nin doğal logaritma anlamına geldiği ve log n'nin on temeli olduğudur. Think ln, Fransız 'logaritma naturelle'i temsil ediyor.
İnternet adamı

2
Logaritmanın temeli, her düğümün sahip olduğu çocuk sayısıdır. Eğer ikili bir ağaçsa, o zaman 2 temelli bir günlüktür.
Paul

3
Cevabın için minnettarım Jason, işte düşünecek bir şey var. Günlüğün hangi temelde olduğunu araştırırken (2 olduğunu varsaydım), aynı cevabı gördüm: önemli değil çünkü log_10 (2) sabitini ortadan kaldırabilirsiniz. Bununla ilgili sorunum şudur: 5 log_10 (5) <5 oysa 5 log_2 (5)> 5. O (n logn) 'nun O'dan daha iyi veya daha kötü çalışma süresine sahip olduğu yeri kavramsallaştırmaya yardımcı olmak için bunları hesaplamama hızlı bir şekilde girdim. (n). Tabana bağlı olarak ÖNEMLİDİR. Bu nedenle, bunun DOĞRU cevabının, çoğu bilgisayar bilimi uygulamasında bağlamsal olarak temel 2 anlamına gelmesi gerektiğini düşünüyorum.
Doug Mead

@jason, ln (matematikçinin yorumu);) kullanmanın daha kolay olduğunu söyleyebilirim. Diğer iki örnek makul.
belford

Yanıtlar:


78

Bir kez büyük-O () gösterimiyle ifade edildiğinde, ikisi de doğrudur. Ancak, O () polinomunun türetilmesi sırasında, ikili arama durumunda , sadece log 2 doğrudur. Bu ayrımın, sorunuzun başlaması için sezgisel ilham kaynağı olduğunu varsayıyorum.

Ayrıca, benim fikrime göre, O (log 2 N) yazmak, örneğiniz için daha iyidir, çünkü algoritmanın çalışma zamanının türetilmesini daha iyi iletir.

Big-O () gösteriminde, sabit faktörler kaldırılır. Bir logaritma tabanından diğerine dönüştürme, sabit bir faktörle çarpmayı içerir.

Yani O (log N), sabit bir faktör nedeniyle O (log 2 N) ile eşdeğerdir .

Bununla birlikte, cevabınızda log 2 N'yi kolayca yazabilirseniz , bunu yapmak daha pedagojiktir. İkili ağaç arama durumunda , big-O () çalışma zamanının türetilmesi sırasında log 2 N'nin tanıtıldığı doğru .

Sonucu büyük-O () gösterimi olarak ifade etmeden önce fark çok önemlidir. Büyük-O gösterimi ile iletilecek polinomu türetirken, bu örnekte O () - gösterimini uygulamadan önce log 2 N dışında bir logaritma kullanmak yanlış olacaktır . Polinom, en kötü durum çalışma zamanını big-O () gösterimi aracılığıyla iletmek için kullanılır kullanılmaz, hangi logaritmanın kullanıldığı önemli değildir.


4
Ama gösterinin çok kolay log_2 nolduğu Θ(log_a n)herhangi tabanı için aEminim tabanı 2 kullanarak "daha doğru" nasıl olduğunu görmek değilim bu yüzden.
bcat

1
Kinopkio ve bcat, kullanışlı olmasına yardımcı olduğunuz için teşekkürler. İlk başta çok iyi yazılmış değildi. :)
Heath Hunnicutt

2
Açıklık ekledim ama cevabımın insanların kafasını karıştırabileceğini düşünmeniz kesinlikle üzüldüm. Aslında, buradaki cevapların çoğu OP'nin sezgisini dikkate almadı ve ona çok şey öğretmeye çalıştı. Rekabet beni o kadar şaşırtmadı, pedagojinin düşük çıtasında biraz üzgünüm.
Heath Hunnicutt

11
"O () polinomunun türetilmesi sırasında, ikili arama durumunda, yalnızca log2 doğrudur." Zayıf matematik için -1. X (n) ~ O (f (n)) tanımı, tüm n> n_0 için c * (f (n)) <x (n) olacak şekilde bir c sabitinin var olduğunu söyler. Bu nedenle, analiz sırasında sabit katsayı tamamen ilgisizdir.
rlbond

3
Log2 (x), log10 (x) / log10 (2) 'ye eşit olduğundan, her iki şekilde de türetebilirsiniz. Günlük, hiçbir noktada kesinlikle 2. taban değildir.
rlbond

80

Farklı bazlara tüm logaritma çünkü büyük O gösterimi, logaritmik bir baz etkilenmeyen bir sabit faktör ile ilgili , O(ln n)eşdeğerdir O(log n).

görüntü açıklamasını buraya girin


2
grafikler temizdir, ancak O () - polinomunun türetilmesi hakkında düşünün ... O () uygulanmadan önce, ikili arama için sadece log-base-2 doğrudur.
Heath Hunnicutt

1
@Heath Hunnicutt: Hayır log_2 xfarklıdır log_b xbir sabit faktör ile c(b)her hangi bir baz için bbir bağımsız x.
jason

4
Ama soruyla hiçbir ilgisi olmayan ve sadece kafa karıştırmaya yaradığında neden bundan bahsediyorsun?
hobbs

4
hobbs: Çünkü OP'nin araştırma yapmak için esinlenmesinin nedeni budur. Fikirlerini cevapla birleştirmeye çalışıyorum, böylece neden sezgisine sahip olduğunu, bunun neden O () için geçerli olmadığını anlıyor, ama burada öğrendiklerini analizin türetme kısmına aşırı uygulamamaya çalışıyor. Yanlış anlamanın temel nedenine değinmeyen kısa cevaplar daha fazla yanlış anlamaya yol açabilir. Kötü pedagoji.
Heath Hunnicutt

4
@Heath Hunnicutt: Asimptotik analiz yapıyorsanız, önemli değil. Bazı büyük-O'ları atmak için son dakikaya kadar beklemeniz, tüm logaritmalarımı bazı aptalca sabitlerle çarpıp bölebileceğim ve her adımda tabanı değiştirebileceğim gerçeğini değiştirmez. Yani, içeren bir analizim varsa log_2 n, içeri girip log_2 nher yeri değiştirebilirim log_pi 2 * log_2 n / log_pi 2ve sonra her yerde olan bir analizle son log_pi 2 * log_pi nbulurum. Şimdi benim analizim açısından log_pi n.
jason

9

Büyük-O gösterimi genellikle yalnızca asimptotik olarak en yüksek dereceyi göstererek yazıldığından, tabanın ne olduğu gerçekten önemli değildir n, bu nedenle sabit katsayılar düşecektir. Farklı bir logaritma tabanı sabit bir katsayıya eşit olduğu için gereksizdir.

Bununla birlikte, muhtemelen log 2 tabanını varsayacağım.


@Kinopiko: Bunda tam olarak yanlış olan ne? Daha doğrusu, cevabım sizinkinden ve buradaki diğerlerinden gerçekte ne kadar farklı?
Daniel Pryden

Ah, belki de "katsayı" kullanımındaki hatam. Açıklığa kavuşturmak için düzenleyeceğim.
Daniel Pryden

Cevabınızla ilgili temel sorunum buydu. Ayrıca, "yine de bazı etkileri olacak" derken ne kastettiğin biraz belirsiz. Neye etkisi var?
bcat

1
Cevabınız en yüksek dereceden katsayıları tartışıyor. Söylediğiniz her zaman doğru, ancak logaritma tabanının alakasız olmasının nedeni bu değil. Bunun nedeni, farklı taban logaritmaları arasındaki farkın O () tarafından emilen bir sabit olmasıdır.

1
@Kinopiko: Tamam. Sanırım aynı şeyi söylüyoruz. O (100) = O (1) derdim çünkü O (100) = O (100 * 1) = O (C * 1) = O (1). Gereksiz olan sürekli ifadelerden kastettiğim buydu. Yani, sipariş ait herhangi sabit 1'dir
Daniel Pryden

7

İkisi de doğru. Bunun hakkında düşün

log2(n)=log(n)/log(2)=O(log(n))
log10(n)=log(n)/log(10)=O(log(n))
logE(n)=log(n)/log(E)=O(log(n))

3

Evet, büyük-O notasyonundan bahsederken, taban önemli değil. Ancak, gerçek bir arama problemiyle karşılaşıldığında sayısal olarak önemlidir.

Ağaç yapıları hakkında bir sezgi geliştirirken, bir ikili arama ağacının O (n log n) zamanında aranabileceğini anlamak yararlıdır çünkü bu, ağacın yüksekliğidir - yani düğümleri olan bir ikili ağaçta, ağaç derinlik O (n log n) (taban 2). Her düğümün üç alt öğesi varsa, ağaç yine de O (n log n) zamanında, ancak 3 tabanlı logaritma ile aranabilir. Hesaplama açısından, her bir düğümün sahip olduğu çocuk sayısının performans üzerinde büyük bir etkisi olabilir (örneğin bkz: bağlantı metni )

Zevk almak!

Paul


bir ikili ağacın yüksekliğinin n log n değil, log n olduğunu söylemek istediniz, değil mi?
hücre

1

Teknik olarak temelin önemi yoktur, ancak bunu genellikle temel-2 olarak düşünebilirsiniz.


1

Öncelikle bir f (n) fonksiyonunun O (g (n)) olmasının ne anlama geldiğini anlamalısınız.

Biçimsel tanımı şöyledir: * Bir f (n) fonksiyonunun O (g (n)) iff | f (n) | olduğu söylenir. <= C * | g (n) | n> k olduğunda, C ve k sabittir. *

Öyleyse f (n) = log a tabanında n, burada a> 1 ve g (n) = log tabanı b n, burada b> 1

NOT: Bu, a ve b değerlerinin 1'den büyük herhangi bir değer olabileceği anlamına gelir, örneğin a = 100 ve b = 3

Şimdi şunu elde ederiz: a'nın log tabanının O olduğu söylenir (n'nin log tabanı b) iff | log base a of n | <= C * | günlük bazında b n | ne zaman n> k

K = 0'ı ve C = b'nin a tabanını günlük olarak seçin.

Şimdi denklemimiz şuna benziyor: | log temel a n | <= log a tabanında b * | günlük b tabanında n | ne zaman n> 0

Sağ tarafa dikkat edin, denklemi değiştirebiliriz: = log a tabanında b * | log taban b n | = | günlük bazında b n | * log a tabanında b = | log a tabanında b ^ (günlük bazında b n) | = | log a tabanında n |

Şimdi denklemimiz şuna benziyor: | log temel a n | <= | log a tabanında n | ne zaman n> 0

Denklem, sınırlamaları a, b> 1 ve n> 0 dışında n, b veya a değerleri ne olursa olsun her zaman doğrudur. Yani log tabanı a, O'dur (log tabanı b n'dir) ve a, b'nin önemi olmadığından, onları kolayca atlayabiliriz.

Burada bir YouTube videosu görebilirsiniz: https://www.youtube.com/watch?v=MY-VCrQCaVw

Bununla ilgili bir makaleyi buradan okuyabilirsiniz: https://medium.com/@randerson112358/omitting-bases-in-logs-in-big-o-a619a46740ca

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.