O (log n) tam olarak ne anlama geliyor?


2139

Big O Notation çalışma sürelerini ve amortisman sürelerini öğreniyorum. O (n) doğrusal zaman kavramını anlıyorum , yani girişin boyutu algoritmanın büyümesini orantılı olarak etkiliyor ... ve aynısı, örneğin, ikinci dereceden O (n 2 ) vb. faktöriyelere göre büyüyen O (n!) kez permütasyon üreteçleri gibi .

Örneğin , algoritma giriş n ile orantılı olarak büyüdüğü için aşağıdaki fonksiyon O (n) 'dir :

f(int n) {
  int i;
  for (i = 0; i < n; ++i)
    printf("%d", i);
}

Bir iç içe döngü olduğunu, benzer şekilde, O (n olacaktır 2 ).

Peki O tam olarak nedir (log n) ? Örneğin, tam bir ikili ağacın yüksekliğinin O (log n) olduğunu söylemek ne anlama gelir ?

Logaritmanın ne olduğunu (belki de ayrıntılı olarak değil) biliyorum, yani log 10 100 = 2, ancak logaritmik bir zamanla bir fonksiyonun nasıl tanımlanacağını anlayamıyorum.


60
1 düğümlü bir ikili ağacın yükseklik günlüğü2 (1) +1 = 1, 2 düğümlü bir ağacın yükseklik günlüğü2 (2) +1 = 2, 4 düğümlü bir ağacın yükseklik günlüğü2 (4) +1 = 3 ve yakında. Bir n-düğüm ağacının yükseklik log2 (n) +1 değeri vardır, bu nedenle ağaca düğüm eklemek ortalama yüksekliğinin logaritmik olarak büyümesine neden olur.
David R Tribble

36
Çoğu cevapta gördüğüm bir şey, temelde "O (bir şey)" tanımlamasıdır, algoritmanın çalışma süresinin "bir şey" ile orantılı olarak büyüdüğü anlamına gelir. "O (log n)" kelimesinin "tam anlamını" sorduğunuzda, bu doğru değildir. Bu Big-Theta gösteriminin sezgisel açıklaması, Big-O değil. O (log n) sezgisel çalışma süresi büyür demektir en : orantılı "log n" için stackoverflow.com/questions/471199/...
Mehrdad Afshari

31
Her zaman bölmeyi hatırla ve O (log n) için örnek olarak fethediyorum
RichardOD

14
Günlük tabanı 2'nin (taban 10 değil) fark edilmesi önemlidir. Bunun nedeni, bir algoritmanın her adımında kalan seçeneklerinizin yarısını kaldırmanızdır. Bilgisayar biliminde hemen hemen her zaman log tabanı 2 ile uğraşırız çünkü sabitleri görmezden gelebiliriz. Ancak bazı istisnalar vardır (yani Quad Tree çalışma süreleri günlük tabanıdır 4)
Ethan,

13
@Ethan: Hangi dönüşümde olduğunuz önemli değil, çünkü temel dönüşüm sadece sabit bir çarpmadır, formül log_b (x) = log_d (x) / log_d (b) şeklindedir. Log_d (b) sadece bir sabit olacaktır.
mindvirüs

Yanıtlar:


2710

Bir günlük zamanı olan bir fonksiyonun nasıl tanımlanacağını anlayamıyorum.

Logaritmik çalışma zamanı işlevinin en yaygın özellikleri şunlardır:

  • bazı eylemlerin gerçekleştirileceği bir sonraki öğenin seçimi birkaç olasılıktan biridir ve
  • sadece birinin seçilmesi gerekecek.

veya

  • eylemin gerçekleştirildiği öğeler n rakamlarıdır

Bu yüzden, örneğin, bir telefon rehberindeki insanları aramak O (log n). Doğru kişiyi bulmak için telefon rehberindeki herkesi kontrol etmenize gerek yoktur ; bunun yerine, adlarının alfabetik olarak nerede bulunduğuna bakarak sadece bölebilir ve fethedebilirsiniz ve her bölümde, sonunda birinin telefon numarasını bulmadan önce her bölümün bir alt kümesini keşfetmeniz gerekir.

Tabii ki, daha büyük bir telefon rehberi hala daha uzun zaman alacaktır, ancak ek boyuttaki oransal artış kadar hızlı büyümeyecektir.


Biz operasyonların diğer tür ve karşılaştırmak için telefon rehberi örneği genişletebilirsiniz onların çalışma süresi. Telefon rehberimizin benzersiz isimleri olan işletmeler ("Sarı Sayfalar") ve benzersiz isimleri olmayan kişiler ("Beyaz Sayfalar") olduğunu varsayacağız . Bir telefon numarası en fazla bir kişiye veya işletmeye atanır. Ayrıca, belirli bir sayfaya geçmenin sürekli zaman aldığını varsayacağız.

Telefon rehberinde gerçekleştirebileceğimiz bazı işlemlerin en hızlıdan en yavaşına çalışma süreleri şunlardır:

  • O (1) (en kötü durumda): Bir işletmenin adının açık olduğu sayfaya ve işletme adına bakıldığında telefon numarasını bulun.

  • O (1) (ortalama durumda): Bir kişinin adının açık olduğu sayfaya ve adlarına bakıldığında, telefon numarasını bulun.

  • O (log n): Bir kişinin adı verildiğinde, henüz arama yapmadığınız kitabın yarısında rastgele bir nokta seçerek, ardından kişinin adının o noktada olup olmadığını kontrol ederek telefon numarasını bulun. Daha sonra işlemi kitabın kişinin adının bulunduğu bölümünde yarıya kadar tekrarlayın. (Bu, bir kişinin adı için ikili bir aramadır.)

  • O (n): Telefon numaraları "5" rakamını içeren tüm kişileri bulun.

  • O (n): Bir telefon numarası verildiğinde, bu numaraya sahip kişiyi veya işletmeyi bulun.

  • O (n log n): Yazıcının ofisinde bir karışıklık vardı ve telefon rehberimizin tüm sayfaları rastgele bir sırayla eklenmişti. Her sayfadaki ilk ada bakarak ve sonra yeni, boş bir telefon defterinde bu sayfayı uygun noktaya koyarak sıralamayı düzeltin.

Aşağıdaki örnekler için, şimdi yazıcının ofisindeyiz. Telefon rehberleri her bir sakine veya işletmeye postalanmayı bekliyor ve her telefon defterinde nereye postalanması gerektiğini belirten bir çıkartma var. Her kişi veya işletme bir telefon defteri alır.

  • O (n log n): Telefon defterini kişiselleştirmek istiyoruz, bu yüzden her kişinin veya işletmenin adını belirtilen kopyasında bulacağız, daha sonra kitaptaki adlarını daire içine alacak ve himayeleri için kısa bir teşekkür notu yazacağız .

  • O (n 2 ): Ofiste bir hata oluştu ve telefon rehberlerinin her birinde telefon numarasının sonunda fazladan bir "0" var. Biraz beyazlık çıkarın ve her sıfırı kaldırın.

  • O (n · n!): Telefon defterlerini nakliye platformuna yüklemeye hazırız. Ne yazık ki, kitapları yüklemesi gereken robot samanlaştı: kitapları kamyona rastgele bir sırayla koyuyor! Daha da kötüsü, tüm kitapları kamyona yükler, sonra doğru sırada olup olmadıklarını kontrol eder ve eğer değilse, onları kaldırır ve baştan başlar. (Bu korkunç bogo çeşididir .)

  • O (n n ): Robotu, işleri doğru şekilde yükleyecek şekilde sabitlersiniz. Ertesi gün, iş arkadaşlarınızdan biri size bir şaka yapar ve yükleme platformu robotunu otomatik baskı sistemlerine bağlar. Robot her orijinal kitabı yüklediğinde, fabrika yazıcısı tüm telefon defterlerini tekrarlar! Neyse ki, robotun hata algılama sistemleri, robotun yükleme için yinelenen bir kitapla karşılaştığında daha fazla kopya yazdırmaya çalışmayacak kadar sofistike, ancak yine de yazdırılan her orijinal ve yinelenen kitabı yüklemesi gerekiyor.


81
@cletus: Tesadüf, korkarım. Telefon defterlerinin büyük bir N'si olduğu, insanların ne olduklarını ve ne yaptıklarını anladıkları ve örnek olarak çok yönlü olduğu için seçtim. Ayrıca açıklamamda robotları kullanmak zorundayım! Her yerde bir galibiyet. (Ayrıca, cevabınız StackOverflow'da bile üye olmadan önce yapılmış gibi görünüyor!)
John Feminella

12
"Ofiste bir hata oluştu ve her telefon rehberindeki her girişte telefon numarasının sonunda fazladan" 0 "var. Biraz beyaz atın ve her sıfırı kaldırın." <- Bu sipariş N kare değil. N, girişin boyutu olarak tanımlanır. Girişin boyutu telefon numarası sayısıdır; bu, kitap başına numara sayısı, kitap sayısıdır. Bu hala doğrusal bir zaman operasyonu.
Billy ONeal

21
@Billy: Bu örnekte, Ntek bir kitaptaki kişi sayısıdır. Telefon rehberindeki her kişi aynı zamanda kitabın kendi kopyasını aldığından , içinde her biri O (N ^ 2) olan N aynı telefon defterleri vardır N.
John Feminella

48
O (1) garip bir şekilde vurgulandığı için en kötü durum değil, en iyi durum değil mi?
Svip

54
Sonunda mantıklı bir O (log n) tanımı bulmak O (long⅝n! N-55/2) zamanımı aldı. +1
iAteABug_And_iLiked_it

611

O(log N)temelde zaman lineer olarak artarken, nkatlanarak artar. Dolayısıyla , öğelerin 1hesaplanması saniye alırsa 10, öğelerin 2hesaplanması saniye, öğelerin hesaplanması saniye vb. Sürecektir .10031000

Öyle O(log n)biz Algoritmaların örneğin ikili arama bölmek ve fethetmek türü bir söz vardır. Diğer bir örnek, diziyi her iki bölüme O(N)ayırdığımızda ve bir pivot öğesi bulmak için her zaman aldığımızda hızlı sıralamadır . Dolayısıyla N O(log N)


108
Diğer tüm makale cevaplarını yenen üç bilgelik satırı ... :) Birisinin eksik olması durumunda, programlama bağlamında, log tabanı 2 (10 değil), yani O (log n) 10 saniye 1 ölçek elemanları, 20 için 2 sn, 40 vb için 3
nawfal

3
Anlaşılan, özlü ve açık, OP'nin son sorusu, logaritmik bir fonksiyonun nasıl tanımlanacağı olmasına rağmen, oldukça "ne" değil
Adam

4
evet, logaritmik fonksiyon üstel fonksiyonun tersidir. ((log x) tabanı a), (güç x) 'in tersidir. Bu fonksiyonların grafiklerle nitel analizi daha fazla sezgi verecektir.
14'te

7
Bu, yanlış olmadığını fark etmem için yaklaşık 3 okuma aldı. Eleman sayısı üstelken zaman lineer olarak artar . Bu, daha kısa sürede daha fazla eleman anlamına gelir . Bu, bir grafikte tanıdık günlük eğrisi olarak görselleştirenler için zihinsel olarak vergilendiriyor . log
Qix - MONICA

1
İkili aramanın bir bölme ve fethetme algoritması olduğunu iddia ettiği bölüm dışında, bu çok iyi bir cevap olduğunu düşünüyorum. Öyle değil.
code_dredd

579

Bu soruya çok sayıda iyi cevap gönderildi, ancak gerçekten önemli bir cevabı kaçırdığımıza inanıyorum - yani resimli cevap.

Tam bir ikili ağacın yüksekliğinin O (log n) olduğunu söylemek ne anlama geliyor?

Aşağıdaki çizim ikili bir ağacı göstermektedir. Her bir seviyenin yukarıdaki seviyeye kıyasla iki kat fazla düğüm içerdiğine dikkat edin (dolayısıyla ikili ):

İkili ağaç

İkili arama karmaşıklığı olan bir örnektir O(log n). Şekil 1'deki ağacın alt seviyesindeki düğümlerin, bazı sıralanmış koleksiyondaki öğeleri temsil ettiğini varsayalım. İkili arama bir bölme ve fethetme algoritmasıdır ve çizim, bu 16 öğe veri kümesinde aradığımız kaydı bulmak için nasıl en fazla 4 karşılaştırmaya ihtiyacımız olacağını gösterir.

Bunun yerine 32 öğeli bir veri kümemiz olduğunu varsayın. Aradığımızı bulmak için şimdi 5 karşılaştırmaya ihtiyacımız olduğunu bulmak için yukarıdaki çizime devam edin, çünkü ağaç veri miktarını çarptığımızda sadece bir seviye daha da büyüdü. Sonuç olarak, algoritmanın karmaşıklığı logaritmik bir düzen olarak tanımlanabilir.

log(n)Düz bir kağıda çizim yapmak , eğrinin yükselmesinin narttıkça yavaşladığı bir grafikle sonuçlanır :

O (giriş n)


60
"Her bir seviyenin, yukarıdaki seviyeye kıyasla çift düğüm sayısını nasıl içerdiğine dikkat edin (dolayısıyla ikili). Bu yanlıştır. Tanımladığınız şey dengeli bir ikili ağaçtır. İkili ağaç, her düğümün en fazla iki çocuğu olduğu anlamına gelir.
Oenotria

8
Aslında, tam bir ikili ağaç olarak adlandırılan çok özel dengeli bir ikili ağaçtır. Cevabı düzenledim ancak onaylaması için birine ihtiyacım var.
user21820

5
Tam bir ikili ağacın tamamen doldurulması için son seviyeye sahip olması gerekmez. Bir 'tam ikili ağaç' daha uygun olduğunu söyleyebilirim.
Bay AJ

Cevabınız OP'nin orijinal sorununa daha somut bir şekilde yanıt vermeye çalışır, bu yüzden mevcut kabul edilen cevaptan (IMO) daha iyidir, ancak yine de çok eksik: sadece yarım örnek ve 2 resim ver ...
nbro

2
Bu ağaçta 16 değil 31 öğe var. Neden 16 öğe veri kümesi deniyor? Üzerindeki her düğüm bir sayıyı temsil eder, aksi takdirde verimsiz bir ikili ağaç olur: P
Perry Monschau

245

Aşağıdaki açıklama, logaritmik zaman karmaşıklığını nasıl elde ettiğimizi anlamanıza yardımcı olmak için tamamen dengeli bir ikili ağaç kullanmaktadır.

İkili ağaç, boyut 1 probleminin, boyut 1 sorununa ulaşıncaya kadar n / 2 boyut alt problemine ayrıldığı bir durumdur:

ikili ağacın yüksekliği

Bu şekilde, bir çözüm elde etmek için yukarıdaki ağaçta yapılması gereken iş miktarı olan O (log n) elde edersiniz.

O (log n) zaman karmaşıklığına sahip ortak bir algoritma, yinelemeli ilişkisi T (n / 2) + O (1) olan, yani ağacın sonraki her seviyesinde sorunu yarıya bölüp sabit miktarda ek iş yapan İkili Arama'dır.


2
Burada acemi. Yani ağaç yüksekliğinin n = 1 boyutuna ulaşmak için özyineleme ile bölünme oranı olduğunu söyleyebilir misiniz?
Cody

@Cody, evet çoğunlukla gözleminiz doğrudur. Bu örnek göstermektedir / kullanmaktadır log_2. Gözleminizin ötesine log_2geçecek ve herhangi bir log_xyer için doğru olacaktır x > 1. Düz bölme yapmak tam olarak 1'e yol açmayabilir, bu nedenle Ceiling()en son bölmenin 1'e veya benzer bir şeye eşit olana kadar yinelemeli bölmeyi söylemek isteyebilirsiniz .
James Oravec

198

genel bakış

Diğerleri ağaç diyagramları gibi iyi diyagram örnekleri verdiler. Basit kod örnekleri görmedim. Bu yüzden açıklamama ek olarak, farklı algoritma kategorilerinin karmaşıklığını göstermek için bazı baskı algoritmalarına basit baskı ifadeleri sunacağım.

İlk olarak, https://en.wikipedia.org/wiki/Logarithm'den edinebileceğiniz genel bir Logaritma fikrine sahip olmak istersiniz . Doğa bilimi kullanımı eve doğa günlüğü. Mühendislik öğrencileri log_10 (günlük tabanı 10), bilgisayar bilimcileri de bilgisayarlar ikili tabanlı olduğundan log_2 (günlük tabanı 2) kullanır. Bazen doğal ln()log'un kısaltmalarını görürsünüz , mühendisler normalde _10'u kapalı bırakırlar ve sadece kullanırlar log()ve log_2 kısaltılır lg(). Tüm logaritma türleri benzer şekilde büyür, bu yüzden aynı kategoriyi paylaşırlar log(n).

Aşağıdaki kod örneklerine baktığınızda, O (1), sonra O (n), sonra O (n ^ 2) 'ye bakmanızı öneririm. Bunlarla iyi olduktan sonra, diğerlerine bakın. İnce örneklerin hala aynı kategorizasyonla nasıl sonuçlanabileceğini göstermek için temiz örneklerin yanı sıra varyasyonları da ekledim.

O (1), O (n), O (logn) vb. Sınıfları veya büyüme kategorileri olarak düşünebilirsiniz. Bazı kategorilerin yapılması diğerlerinden daha fazla zaman alacaktır. Bu kategoriler bize algoritma performansını sipariş etmenin bir yolunu sunar. Bazıları girdi n büyüdükçe daha hızlı büyüdü. Aşağıdaki tablo, söz konusu büyümeyi sayısal olarak göstermektedir. Aşağıdaki tabloda log (n) 'yi log_2'nin tavanı olarak düşünün.

resim açıklamasını buraya girin

Çeşitli Büyük O Kategorilerinin Basit Kod Örnekleri:

O (1) - Sabit Zaman Örnekleri:

  • Algoritma 1:

Algoritma 1 bir kez merhaba yazdırır ve n'ye bağlı değildir, bu yüzden her zaman sabit zamanda çalışır, bu yüzden öyle O(1).

print "hello";
  • Algoritma 2:

Algoritma 2, 3 kez merhaba yazdırır, ancak giriş boyutuna bağlı değildir. N büyüdükçe bile, bu algoritma her zaman sadece 3 kez merhaba yazacaktır. 3 denilen bir sabittir, dolayısıyla bu algoritma da aynıdır O(1).

print "hello";
print "hello";
print "hello";

O (log (n)) - Logaritmik Örnekler:

  • Algoritma 3 - "log_2" gibi davranır

Algoritma 3, log_2 (n) içinde çalışan bir algoritmayı gösterir. For döngüsünün post operasyonunun i'nin mevcut değerini 2 ile içarptığına dikkat edin , bu yüzden 1'den 2'den 4'e 8'den 16'ya 32'ye gider ...

for(int i = 1; i <= n; i = i * 2)
  print "hello";
  • Algoritma 4 - Bu "log_3" gibi davranır

Algoritma 4 log_3'ü gösterir. Uyarı i1'den 3'e 9'dan 27'ye kadar gider ...

for(int i = 1; i <= n; i = i * 3)
  print "hello";
  • Algoritma 5 - "log_1.02" gibi davranır

Algoritma 5 önemlidir, çünkü sayı 1'den büyük olduğu ve sonucun tekrar tekrar kendisiyle çarpıldığı sürece, logaritmik bir algoritmaya baktığınızı gösterir.

for(double i = 1; i < n; i = i * 1.02)
  print "hello";

O (n) - Doğrusal Zaman Örnekleri:

  • Algoritma 6

Bu algoritma basittir, ki bu da n kere basılabilir.

for(int i = 0; i < n; i++)
  print "hello";
  • Algoritma 7

Bu algoritma, n / 2 kez merhaba yazdıracağı bir varyasyonu gösterir. n / 2 = 1/2 * n. 1/2 sabitini görmezden geliriz ve bu algoritmanın O (n) olduğunu görürüz.

for(int i = 0; i < n; i = i + 2)
  print "hello";

O (n * log (n)) - nlog (n) Örnekler:

  • Algoritma 8

Bir kombinasyonu olarak düşünün O(log(n))ve O(n). For döngülerinin yuvalanması,O(n*log(n))

for(int i = 0; i < n; i++)
  for(int j = 1; j < n; j = j * 2)
    print "hello";
  • Algoritma 9

Algoritma 9, algoritma 8'e benzer, ancak döngülerin her biri, yine de nihai sonucun elde edilmesine neden olan varyasyonlara izin verir. O(n*log(n))

for(int i = 0; i < n; i = i + 2)
  for(int j = 1; j < n; j = j * 3)
    print "hello";

O (n ^ 2) - n kare Örnekler:

  • Algoritma 10

O(n^2) ilmekler için yuvalama standardı ile kolayca elde edilir.

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j++)
    print "hello";
  • Algoritma 11

Algoritma 10 gibi, ancak bazı varyasyonlarla.

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j = j + 2)
    print "hello";

O (n ^ 3) - n küp Örnekler:

  • Algoritma 12

Bu algoritma 10 gibidir, ancak 2 yerine 3 döngü ile.

for(int i = 0; i < n; i++)
  for(int j = 0; j < n; j++)
    for(int k = 0; k < n; k++)
      print "hello";
  • Algoritma 13

Algoritma 12 gibi, ancak yine de bazı varyasyonlar var O(n^3).

for(int i = 0; i < n; i++)
  for(int j = 0; j < n + 5; j = j + 2)
    for(int k = 0; k < n; k = k + 3)
      print "hello";

özet

Yukarıda birkaç basit örnek ve analizi gerçekten değiştirmeyen hangi ince değişikliklerin uygulanabileceğini göstermeye yardımcı olacak varyasyonlar verilmiştir. Umarım size yeterince fikir verir.


17
Muhteşem. Benim için gördüğüm en iyi açıklama. Eğer daha hoş olurdu O(n^2)bir kombinasyonu olarak belirtilmektedir O(n)ve O(n)bu nedenle, O(n) * O(n) = O(n * n) = O(n^2). Bu denklem olmadan biraz zıplıyor gibi geliyor. Bu, önceki açıklamanın tekrarıdır, ancak bence bu tekrar, okuyucular için anlayış için daha fazla güven sağlayabilir.
Eonil

2
Bu sadece şimdiye kadarki en iyi açıklamadır.
Edgar Kiljak

2
@IceTea, sorunuza içgörü / sezgi vermek için. Eğer dışarı tablolandırırsak nkarşı n/2onlar hem düz bir çizgi yapmak olduğunu göreceksiniz. Bu, onları benzer büyüme oranlarına sahip oldukları ile aynı sınıfa yerleştirir (bunu grafiğin şekli olarak düşünün). Benzer şekilde, dışarı manyak eğer log_2karşı log_3göreceğiniz onlar o "benzer şekiller" ya da "benzer büyüme oranları" hem take.
James Oravec

1
@IceTea, @Shai ve @James tarafından verilen açıklama daha doğrudur, n/2 or 2n or n+2 or ngrafikte farklı farklı bir çizgiye sahip olacaklar, ancak aynı büyüme oranına sahip olacaklar, bu da hepsinin doğrusal bir büyümeyi takip edeceği anlamına geliyor.
Naresh Joshi

2
İki iç içe döngümüzün olduğu durumda, ancak ikinci yineleyici birincisine bağlıdır, bu bağımlılık zaman karmaşıklığını etkiler mi?
Bionix1441

131

Aşağıdakileri alan bir işleviniz varsa:

1 millisecond to complete if you have 2 elements.
2 milliseconds to complete if you have 4 elements.
3 milliseconds to complete if you have 8 elements.
4 milliseconds to complete if you have 16 elements.
...
n milliseconds to complete if you have 2^n elements.

Sonra günlük 2 alır (n) zaman alır. Büyük O gösterimi , gevşek ilişki sadece büyük n için gerçek olması gerektiğini, aracı konuşan ve bu sabit faktörleri ve daha küçük terimler göz ardı edilebilir.


log2 (n) o (log n) ile aynı mıdır?
Sven van den Boogaart

Evet, burada başka bir cevap için nawfal'ın açıklamasına bakınız: (kopyala yapıştırma) - programlama bağlamında, günlüğün tabanı 2'dir (10 değil), bu nedenle O (log n) 10 eleman için 1 saniye, 20 saniye için 2 saniye ölçeklendirir , 40 vb. İçin 3
Andrejs

@SvenvandenBoogaart, bu çözümdeki örnek log_2, sınıfta olanları göstermektedir O(log(n)). O(log(n))Yani log_xburada aynı sınıfta başka pek çok kişi varx > 1
James Oravec

@Andrejs, yorumunuz so O(log n) scales like 1 sec for 10 elements, 2 sec for 20, 3 for 40 etcyanlış. Bu desen / sınıf ile / hizalama eşleşir O(n)değil O(log(n)). Birisi ilgileniyorsa, log_10eşdeğer bir örnek 10 eleman için 1 sn, 100 için 2 saniye, 1000 için 3 vb.
Olacaktır

99

Logaritmik çalışma süresi ( O(log n)) esas olarak çalışma süresinin girdi boyutunun logaritması ile orantılı olarak büyüdüğü anlamına gelir - örnek olarak, 10 öğe en fazla zaman xalıyorsa ve 100 öğe en fazla, örneğin 2x10.000 öğe alıyorsa en fazla 4xzaman alır , o zaman bir O(log n)zaman karmaşıklığı gibi görünüyor .


1
+1, ancak gerçekten log10 değil log2 olduğunu belirtmelisiniz.
Adriano Varoli Piazza

62
log2 veya log10 önemsizdir. Sadece aynı düzende yapan bir ölçek faktörü ile farklılık gösterirler, yani hala aynı oranda büyürler.
Noldorin

17
Logaritmalarla ilgili eğlenceli olan şey, göreceli yükseklikleri karşılaştırırken, kullandığınız tabanın önemli olmamasıdır. log 10,000 / log 100hangi tabanı kullanırsanız kullanın 2'dir.
Anon.

12
Nitpicky olması için, O (lg n) çalışma zamanının en fazla lg n ile orantılı olduğu anlamına gelir . Açıkladığınız şey Theta (lg n).

1
@rgrig: Bu doğru. Big-O'nun üst sınır doğasını belirtmek için birkaç "en fazla" düzenledim.
Anon.

95

Logaritma

Tamam, bir logaritmanın gerçekte ne olduğunu tam olarak anlayalım.

Halat olduğunu ve onu bir ata bağladığımızı düşünün. Halat doğrudan atın üzerine bağlıysa, atın atması gereken kuvvet (örneğin, bir erkekten) doğrudan 1'dir.

Şimdi ipin bir direğe döndüğünü hayal edin. Kurtulmak için at artık çok daha fazla zorlamak zorunda kalacak. Süreler, ipin pürüzlülüğüne ve direğin boyutuna bağlı olacaktır, ancak diyelim ki kişinin gücü 10 ile çarpılacaktır (ip tam bir dönüş yaptığında).

Şimdi ip bir kez ilmeklenirse, atın 10 kat daha fazla çekmesi gerekecektir. İnsan at için gerçekten zorlaşmaya karar verirse, halatı bir direk etrafında tekrar ilmeleyebilir ve gücünü 10 kat daha artırabilir. Üçüncü bir döngü, gücü 10 kat daha artıracaktır.

resim açıklamasını buraya girin

Her döngü için değerin 10 arttığını görebiliriz. Herhangi bir sayı elde etmek için gereken dönüş sayısına sayının logaritması denir, yani gücünüzü 1000 katına çıkarmak için 3 mesaja, gücünüzü 1,000,000.

3, 1,000 logaritması ve 6, 1,000,000 logaritmasıdır (baz 10).

O halde O (log n) aslında ne anlama geliyor?

Yukarıdaki örneğimizde, 'büyüme oranımız' O (log n) 'dir . Her ek döngü için, ipimizin kaldırabileceği kuvvet 10 kat daha fazladır:

Turns | Max Force
  0   |   1
  1   |   10
  2   |   100
  3   |   1000
  4   |   10000
  n   |   10^n

Şimdi yukarıdaki örnek 10 tabanını kullandı, ancak neyse ki büyük o notasyondan bahsettiğimizde kütüğün tabanı önemsiz.

Şimdi 1-100 arasında bir sayı tahmin etmeye çalıştığınızı düşünelim.

Your Friend: Guess my number between 1-100! 
Your Guess: 50
Your Friend: Lower!
Your Guess: 25
Your Friend: Lower!
Your Guess: 13
Your Friend: Higher!
Your Guess: 19
Your Friend: Higher!
Your Friend: 22
Your Guess: Lower!
Your Guess: 20
Your Friend: Higher!
Your Guess: 21
Your Friend: YOU GOT IT!  

Bunu doğru anlamanız için 7 tahmin yapmanız gerekiyor. Fakat buradaki ilişki nedir? Her ek tahminde tahmin edebileceğiniz en fazla öğe miktarı nedir?

Guesses | Items
  1     |   2
  2     |   4
  3     |   8
  4     |   16
  5     |   32
  6     |   64
  7     |   128
  10    |   1024

Grafiği kullanarak, 1-100 arasında bir sayı tahmin etmek için bir ikili arama kullanırsak, bizi en fazla 7 denemeye çıkaracağını görebiliriz . 128 numaramız olsaydı, 7 denemede sayıyı da tahmin edebilirdik ama 129 sayı bizi götürecek en fazla denemede 8 denemeye (logaritmalarla ilgili olarak, burada 128 değer aralığı için 7 tahmin, 1024 değer aralığı için 10 tahmin gerekir) 7, 128 logaritmasıdır, 10, 1024 (lokal 2) logaritmasıdır.

'En fazla' cesaret ettiğime dikkat edin. Big-O notasyonu her zaman daha kötü duruma işaret eder. Eğer şanslıysanız, bir seferde sayıyı tahmin edebilirsiniz ve bu yüzden en iyi durum O (1), ancak bu başka bir hikaye.

Her tahmin için veri setimizin küçüldüğünü görebiliriz. Bir algoritmanın logaritmik zamanı olup olmadığını belirlemek için iyi bir kural, veri setinin her yinelemeden sonra belirli bir sıraya göre küçülüp küçülmediğini görmektir.

O (n log n) ne olacak?

Sonunda bir doğrusal zaman O (n log (n)) algoritması ile karşılaşacaksınız. Yukarıdaki kural tekrar uygulanır, ancak bu sefer logaritmik fonksiyon n kez çalıştırılmalıdır, örneğin bir birleştirme gibi algoritmalarda oluşan bir listenin boyutunu n kez küçültmek.

Algoritmik sürenin n log n olup olmadığını kolayca belirleyebilirsiniz. Bir liste boyunca yinelenen bir dış döngü arayın (O (n)). Sonra bir iç döngü olup olmadığına bakın. İç döngü her yinelemede veri kümesini kesiyor / azaltıyorsa , bu döngü (O (log n)) olur ve bu nedenle genel algoritma = O (n log n) olur .

Feragatname: Halat-logaritma örneği W.Sawyer'ın mükemmel Matematikçinin Delight kitabından alınmıştır .


No. In our example above, our 'growth rate' is O(log n). For every additional loop, the force our rope can handle is 10 times more, n == döngü sayısını ve our 'growth rate'=> 10 ^ n'yi gösteren ve log n DEĞİLDİR gösteren bir grafik tarafından desteklenir . Örnek, n=# horseslog n döngülerinin kısıtlanmasını gerektiren şekilde yapılabilir . Kötü pedogojik örnekler sadece anladıklarına inanan öğrenciler üretir.
psimpson

56

O'nun (log N) zamanın N'deki basamak sayısıyla orantılı olduğunu söyleyerek sezgisel olarak düşünebilirsiniz.

Bir işlem, bir girdinin her bir basamağı veya biti üzerinde sürekli zaman çalışması yaparsa, tüm işlem, girdinin büyüklüğüyle değil, girdideki basamak veya bit sayısıyla orantılı olarak zaman alacaktır; dolayısıyla, O (N) yerine O (log N).

Bir işlem, her biri yarı yarıya (3, 4, 5 .. oranında azalır) bir dizi sabit zaman kararı verirse, dikkate alınacak girdinin boyutu, tamamı günlük tabanı 2 (taban 3) ile orantılı olarak zaman alacaktır. , taban 4, taban 5 ...), O (N) olmak yerine girişin N boyutundadır.

Ve bunun gibi.


7
Doğru ve çoğu açıklamadan daha kolay kavranır, sanırım.
T.

bu bir açıklama log<sub>10</sub> N, değil mi?
LiuYan 刘 研

1
@LiuYan 刘 研 basamak sayısının hangi temelde olduğunu söylemediler. Yine de, log₂ (n) = log₁₀ (n) / log₁₀ (2) ve 1 / log₁₀ (2) bu nedenle sabit bir çarpan, aynı prensip diğer tüm üsler için de geçerlidir. Bu iki şey gösterir. Birincisi, moonshadow ilkesi temel ne olursa olsun geçerlidir (taban ne kadar düşükse, tahminde daha az "jag") ve ayrıca sizi o sonuca götüren hesaplama ne temel olursa olsun O (log n) O (log n) .
Jon Hanna

"orantılı" ... "her biri girişin boyutunu yarıya indiriyor" ??????
csguy

52

O (log n) ile çalışan bir algoritmayı her zaman zihinsel olarak görselleştirmenin en iyi yolu şöyledir:

Sorun boyutunu çoğaltıcı bir miktarda artırırsanız (yani boyutunu 10 ile çarparsanız), çalışma yalnızca bir katkı maddesi miktarı ile artar.

İyi bir uygulamanız olması için bunu ikili ağaç sorunuza uygulamak: bir ikili ağaçtaki düğüm sayısını iki katına çıkarırsanız, yükseklik yalnızca 1 (ek bir miktar) artar. Tekrar iki katına çıkarırsanız, hala sadece 1 arttı. (Açıkçası dengeli ve böyle kaldığını varsayıyorum). Bu şekilde, sorun büyüklüğü çarpıldığında işinizi iki katına çıkarmak yerine, sadece biraz daha fazla iş yaparsınız. Bu yüzden O (log n) algoritmaları harika.


52

İlk önce aşağıdaki kitabı okumanızı tavsiye ederim;

Algoritmalar (4. Baskı)

İşte bazı fonksiyonlar ve beklenen karmaşıklıkları. Sayılar, ifade yürütme sıklıklarını gösterir .

İşte bazı fonksiyonlar ve beklenen karmaşıklıkları

Aşağıdaki Big-O Karmaşıklık Şeması ayrıca alınan bigocheatsheet Big-O Karmaşıklık Tablosu

Son olarak çok basit bir vitrin nasıl hesaplandığını gösterir;

Bir programın ifade yürütme frekanslarının anatomisi.

Bir programın çalışma süresini analiz etme (örnek).

Bir programın çalışma süresini analiz etme


5
Kötü sepete O (n log n) koymazdım. Adil olana aittir .
André Werlang

Big-O karmaşıklık tablosunu (yukarıda) görüntülerken, O (n) 'nin pembe / turuncu yatılı değil gerçek doğrusal nokta olduğunu hatırlamanız gerekir. @Andre Bu yüzden O (n log n) 'kötü' performans parantezinde doğru bir şekilde işaretlenmiş, lineerden daha kötü performans.
JavaBeast

@JavaBeast doğru, O (n log n) performansı teknik olarak O (n) 'den daha kötü olsa da, bunların iyi bir karşılaştırmasını sunan yukarıdaki tabloya bakın (ikisinin büyümesine bakın). farklı bir kaynaktan gelen grafik çelişkilidir çünkü O (1) ve O (log n) 'yi aynı iyi / mükemmel kılar. nispi büyüme sıraları O (n) ve O (n log n) ile karşılaştırılabilir. tl; dr; O (n log n) mükemmel değil, ama kötü olmaktan uzak.
André Werlang

1
Bu cevap yanlış! N = N * N olduğunu varsayar. Aslında N = N! Örneğin aslında N küp. Aynı şeyi grafiğinizde de yapabilirsiniz. O (n) 'nuz aslında korkunç ile kötü arasındaki ayrım olmalıdır. Matematiksel kanıt: Döngü için O (1) ile sabit olduğunu söylüyorsunuz. Bu 1'in gerçekte anlamı, N'ye bağlı değil. Sadece değişken değil. Fakat N. N'ye ve iki kez yarıya bağımlı olduğu için değişkendir. Bu nedenle geçersiz. Eğer o kitaptan geliyorsa, satın almayın! Gösterdiğiniz kod grafiği gerçek değil, şaka, bak, "Theesome", üç kişinin aynı anda seks yapması anlamına geliyor! OMG
jgmjgm

1
O (n) diyagonal üzerinde olmamalı mı?
gyosifov

46

Log b (n) nedir?

1 boyunda bir bölüme ulaşmadan önce, n uzunluğundaki bir günlüğü b eşit parçaya tekrar tekrar kesebileceğiniz sayıdır.


Mükemmel Yorum! Özlü ve tam olarak peşinde olduğum cevap.
DennisL

18

Bölme ve fethetme algoritmaları genellikle lognçalışma süresinin bir bileşenine sahiptir. Bu, girişin tekrarlanan yarılarından gelir.

İkili arama durumunda, girdinin yarısını attığınız her yineleme. Big-O gösterimlerinde günlüğün log tabanı 2 olduğuna dikkat edilmelidir.

Düzenleme: Belirtildiği gibi, günlük tabanı önemli değil, ama bir algoritmanın Big-O performansını türetirken, günlük faktörü yarıya, bu yüzden neden temel 2 olarak düşünüyorum gelecektir.


2
Neden günlük tabanı 2? Örneğin randomize quicksort'da, bunun temel 2 olduğunu düşünmüyorum. Bildiğim kadarıyla, tabanın bir önemi yok, günlük tabanı a (n) = log2 (n) / log2 (a), yani her logaritma bir sabit ile diğerinden farklıdır ve sabitler büyük gösterimde dikkate alınmaz. Aslında, bir günlüğün tabanını big-o notasyonunda yazmak, bence bir sabittir, çünkü siz bir sabit yazıyorsunuzdur.
IVlad


Herhangi bir tabana dönüştürülebileceği ve önemli olmadığı çok doğru, ancak Big-O performansını elde etmeye çalışıyorsanız ve sürekli yarıya iniyorsanız, koda yansıyan günlük tabanını 10 görmeyeceğinizi anlamanıza yardımcı olur.
David Kanarek

Bir kenara: Düğümlerin 2'den fazla bir fan çıkışı olan (yani bir ikili ağaçtan "daha geniş") olduğu B-ağaçları gibi şeylerde, hala O (logn) büyümesini göreceksiniz, çünkü hala bölünüyor ve -conquer, ancak günlük tabanı fan-out ile ilgili olacaktır.
Roger Lipscombe

Günlük 2 kazma aslında oldukça yardımcı oldu.
Dan Rosenstark

15

Peki O tam olarak nedir (log n)? Örneğin, tam bir ikili ağacın yüksekliğinin O (log n) olduğunu söylemek ne anlama gelir?

Bunu 'tam bir ikili ağacın yüksekliği günlük n' olarak yeniden ifade ederim. Adım adım aşağı iniyor olsaydınız, tam bir ikili ağacın yüksekliğini bulmak O (log n) olurdu.

Bir fonksiyonun logaritmik zamanla nasıl tanımlanacağını anlayamıyorum.

Logaritma esasen üslemenin tersidir. Dolayısıyla, işlevinizin her bir 'adımı' orijinal öğe kümesinden bir öğe faktörünü ortadan kaldırıyorsa , bu logaritmik bir zaman algoritmasıdır.

Ağaç örneği için, bir düğüm noktasını düşürmenin, geçişe devam ederken üstel sayıda öğeyi azalttığını kolayca görebilirsiniz. İsme göre sıralanmış bir telefon defterine bakmanın popüler örneği, aslında bir ikili arama ağacının altından geçmeye eşdeğerdir (orta sayfa kök öğedir ve her adımda sola veya sağa gidip gitmeyeceğinizi çıkarabilirsiniz).


3
+1 "Logaritma esasen üslemenin tersidir" den bahsettiği için.
talonx

12

Bu 2 vaka O (log n) zaman alacak

case 1: f(int n) {
      int i;
      for (i = 1; i < n; i=i*2)
        printf("%d", i);
    }


 case 2  : f(int n) {
      int i;
      for (i = n; i>=1 ; i=i/2)
        printf("%d", i);
    }

Bir şey eksik olduğuma eminim, ama her zaman sıfır olmazdım ve döngüler sonsuza kadar her iki durumda da çalışır, çünkü 0 * 2 = 0 ve 0/2 = 0?
dj_segfault

2
@dj_segfault, bu benim hatamdı. Sanırım şimdi mantıklı .. :)
Ravi Bisla

@RaviBisla Diğer cevaplar 10 girişin 10 döngüden 1 kat daha fazla ve 100 girişin 1 giriş süresinin 3 katını alacağını belirtir, bu kesinlikle bu örneklerde geçerli değildir. stackoverflow.com/a/2307330/1667868
Sven van den Boogaart

12

O (log n) biraz yanıltıcıdır, daha doğrusu O (log 2 n), yani (baz 2 ile logaritma).

Dengeli bir ikili ağacın yüksekliği O'dur (log 2 n), çünkü her düğümün iki tane vardır (log 2 n'deki gibi "iki" ye dikkat edin ). Yani, n düğümlü bir ağacın kütük 2 n yüksekliği vardır .

Diğer bir örnek, çalışma zamanı O (log 2 n) olan ikili aramadır, çünkü her adımda arama alanını 2'ye böldünüz.


4
O (log n), O (ld n) veya O (LN n) ile aynı sıradadır. Orantılıdırlar. Öğrenme amaçları için ld kullanmanın daha kolay olduğunu anlıyorum.
helios

4
"daha kesin olarak O (ld n)" - Hayır, öyle değil: tüm günlükler aynı sıradadır (her biri diğerlerinden yalnızca yok sayılan / göz ardı edilebilir sabit bir ölçeklendirme faktörü ile farklılık gösterir).
ChrisW

1
haklısın chris, çok kötü ifadeler. helios gibi söylemeliydim. öğrenme / anlama için yardımcı olur ama sonunda tüm günlükler aynı sıradadır.
stmax

10

O(log n) "Logaritma" ile orantılı bir sürede çalışan bir fonksiyona (veya algoritmaya veya bir algoritma adımına) atıfta bulunur (genellikle çoğu durumda baz 2'dir, fakat her zaman değil ve her durumda bu büyük O notasyonu ile önemsizdir *) giriş boyutu.

Logaritmik fonksiyon üstel fonksiyonun tersidir. Başka bir deyişle, girdiniz katlanarak büyürse (normalde düşündüğünüz gibi doğrusal olarak değil), işleviniz doğrusal olarak büyür.

O(log n)çalışma süreleri her tür bölme ve fethetme uygulamasında çok yaygındır, çünkü (ideal olarak) işi her seferinde yarıya indirirsiniz. Bölme veya fethetme adımlarının her birinde, sabit zamanlı iş (veya sabit zamanlı olmayan, ancak zamandan daha yavaş büyüyen iş) yapıyorsanız O(log n), tüm işleviniz O(log n). Her adımın girişte doğrusal zaman gerektirmesi oldukça yaygındır; bu toplam zaman karmaşıklığıO(n log n) .

İkili aramanın çalışma süresi karmaşıklığı buna bir örnektir O(log n). Bunun nedeni, ikili aramada, diziyi ikiye bölerek ve her adımda yalnızca yarısına odaklanarak her sonraki adımda girişinizin yarısını her zaman yok saymanızdır. Her adım sabit zamanlıdır, çünkü ikili aramada, düşündüğünüz dizinin herhangi bir noktada ne kadar büyük olduğuna bakılmaksızın bir sonraki adımda ne yapacağınızı anlamak için yalnızca bir öğeyi anahtarınızla karşılaştırmanız gerekir. Böylece yaklaşık log (n) / log (2) adımlarını uygularsınız.

Birleştirme sıralamasının çalışma zamanı karmaşıklığı buna bir örnektir O(n log n). Bunun nedeni, diziyi her adımda ikiye böldüğünüzden, toplam yaklaşık log (n) / log (2) adımla sonuçlanmanızdır. Bununla birlikte, her adımda tüm öğeler üzerinde birleştirme işlemleri gerçekleştirmeniz gerekir (n / 2 öğesinin iki alt listesindeki bir birleştirme işlemi veya n / 4 öğenin dört alt listesindeki iki birleştirme işlemi olsun, bunu her adımda n öğe için yapın). Böylece, toplam karmaşıklık O(n log n).

* Büyük O gösteriminin tanım gereği sabitlerin önemli olmadığını unutmayın. Ayrıca logaritmalar için taban kuralının değiştirilmesi ile , farklı bazların logaritmaları arasındaki tek fark sabit bir faktördür.


Son * not, 2 veya 10'a dayanan logaritmalar hakkındaki karışıklığımı çözdü :) Çok teşekkürler.
yahya


9

Basitçe söylemek gerekirse: Algoritmanızın her adımında işi yarıya indirebilirsiniz. (Asimptotik olarak üçüncü, dördüncü, ...)


2
Bu cevap çok kesin değil. Her şeyden önce, işi sadece taban 2'deki logaritma durumunda yarıya indirmeyi düşünebilirsiniz. Bu cevabın (ve orijinal soruya verilen cevapların çoğunun) bu kadar çok oy alması gerçekten inanılmaz. "(Asimptotik olarak üçüncü, dördüncü, ...) ile eşdeğer mi?" Zamanınız yoksa neden bir soruya cevap veriyorsunuz?
nbro

8

Logaritmik bir işlevi grafik bir hesap makinesine veya benzer bir şeye çizerseniz, bunun gerçekten yavaş bir şekilde, doğrusal bir fonksiyondan bile daha yavaş yükseldiğini görürsünüz.

Bu nedenle logaritmik zaman karmaşıklığına sahip algoritmalar çok aranır: gerçekten büyük n için bile (örneğin n = 10 ^ 8 diyelim), kabul edilebilir olmaktan daha fazla performans gösterirler.


7

Ama O tam olarak nedir (log n)

Ne tam anlamı "olduğu gibi ndoğru gitmektedir infinity, timedoğru eğilimi a*log(n)nereye asabit ölçekleme faktörüdür".

Ya da aslında bu tam olarak demek değildir; daha büyük olasılıkla " timebölünme a*log(n)eğilimi " gibi bir şey ifade eder 1.

'Analiz' dan olağan matematiksel anlama sahiptir "doğru eğilimindedir": "Eğer seçerseniz, örneğin bu herhangi keyfi küçük sıfır olmayan sabit k, sonra karşılık gelen değeri bulabilirsiniz Xböyle ((time/(a*log(n))) - 1)az olduğu ktüm değerleri için nBüyüktür X."


Düzgün terimlerle, zaman denkleminin başka bileşenlere sahip olabileceği anlamına gelir: örneğin, sürekli bir başlatma süresine sahip olabilir; ancak bu diğer bileşenler büyük n değerleri için önemsizliğe dönüşür ve a * log (n) büyük n için baskın olan terimdir.

Denklemin, örneğin ...

süre (n) = a + b günlüğü (n) + c n + d n n

... o zaman bu O (n kare) olur, çünkü a, b, c ve sıfır olmayan d sabitlerinin değerleri ne olursa olsun, bu d*n*nterim her zaman diğerlerinin üzerinde n'nin yeterince büyük değeri için baskın olacaktır.

Bit O gösteriminin anlamı budur: "yeterince büyük n için baskın terimin sırası nedir" anlamına gelir.



7

Uzun zaman önce Kormen vb. Kitaplarda okuduğum ilginç bir şey ekleyebilirim. Şimdi, bir problem uzayında bir çözüm bulmamız gereken bir problem hayal edin. Bu problem alanı sonlu olmalıdır.

Şimdi, eğer algoritmanızın her yinelemesinde bu alanın bir kısmını kestiğinizi, yani bir sınırdan daha az olmadığını kanıtlarsanız, algoritmanızın O (logN) zamanında çalıştığı anlamına gelir.

Burada, mutlak olandan değil, göreceli bir kesir sınırından bahsettiğimizi belirtmeliyim. İkili arama klasik bir örnektir. Her adımda sorunlu alanın 1 / 2'sini atıyoruz. Ancak ikili arama böyle bir örnek değildir. Her nasılsa, her adımda en az 1/128 problem alanı attığınızı kanıtladınız. Bu, programınız ikili aramadan önemli ölçüde daha yavaş olmasına rağmen O (logN) zamanında çalışmaya devam ettiği anlamına gelir. Bu, özyinelemeli algoritmaların analizinde çok iyi bir ipucudur. Sıklıkla her adımda özyinelemenin çeşitli varyantlar kullanmayacağı kanıtlanabilir ve bu durum, sorunlu alandaki bazı kesirlerin kesilmesine yol açar.


6

Bir for döngüsü için bir örnek verebilirim ve belki bir kez kavram kavradı belki farklı bağlamlarda anlamak daha kolay olacaktır.

Bu, döngüde adımın katlanarak büyüdüğü anlamına gelir. Örneğin

for (i=1; i<=n; i=i*2) {;}

Bu programın O gösterimindeki karmaşıklık O (log (n)) dir. Elle dolaşmaya çalışalım (n 512 ve 1023 arasında (1024 hariç):

step: 1   2   3   4   5    6    7    8     9     10
   i: 1   2   4   8   16   32   64   128   256   512

N, 512 ile 1023 arasında bir yerde olmasına rağmen, yalnızca 10 yineleme gerçekleşir. Bunun nedeni, döngüdeki adımın katlanarak artması ve bu nedenle sonlandırmaya ulaşmak için sadece 10 iterasyon gerektirmesidir.

X'in (a tabanına) logaritması, ^ x'in ters fonksiyonudur.

Logaritmanın üstel olanın tersi olduğunu söylemek gibidir.

Şimdi bu şekilde görmeye çalışın, üstel çok hızlı büyürse logaritma (ters) çok yavaş büyür.

O (n) ve O (log (n)) arasındaki fark, O (n) ve O (a ^ n) (a sabittir) arasındaki farka benzer şekilde çok büyüktür.


6

Aslında, n öğelerinizin bir listesi varsa ve bu listeden bir ikili ağaç oluşturursanız (böl ve fethet algoritmasında olduğu gibi), boyut 1 listelerine (yapraklar) ulaşana kadar 2'ye bölünmeye devam edersiniz.

İlk adımda 2'ye bölün. Sonra 2 listeniz var (2 ^ 1), her birini 2'ye bölüyorsunuz, böylece 4 listeniz var (2 ^ 2), tekrar bölüyorsunuz, 8 listeniz var (2 ^ 3) ) vb. liste boyutunuz 1 olana kadar

Bu size denklemi verir:

n/(2^steps)=1 <=> n=2^steps <=> lg(n)=steps

(her bir tarafın lg'sini alırsınız, lg log tabanı 2'dir)


2
Bazı kötü amaçlı yazılımlar yaprak düğümlerinden önce iki düzeyde x uzunluğunda yeni bir liste eklemeye başlayana kadar. O zaman sonsuz bir döngü gibi görünecektir ...
Francis Cugler

1
Yorumunu almadım. Açıklamam yanlış mı?
Dinaiz

1
Sadece varsayımsal bir şaka yapıyordum. Gerçekten onunla hiçbir şey ifade etmiyordum.
Francis Cugler

6

Her algoritma veya kod yazdığımızda asimptotik karmaşıklığını analiz etmeye çalışırız. Zaman karmaşıklığından farklıdır .

Asimptotik karmaşıklık, bir algoritmanın yürütme süresinin davranışı iken, zaman karmaşıklığı gerçek yürütme süresidir. Ancak bazı insanlar bu terimleri birbirinin yerine kullanır.

Çünkü zaman karmaşıklığı çeşitli parametrelere bağlıdır.
1. Fiziksel Sistem
2. Programlama Dili
3. kodlama Stili
4. Ve daha fazlası ......

Gerçek yürütme süresi analiz için iyi bir ölçü değildir.


Bunun yerine, girdi boyutunu parametre olarak alırız, çünkü kod ne olursa olsun, girdi aynıdır. Böylece yürütme süresi girdi boyutunun bir fonksiyonudur.

Aşağıda Lineer Zaman Algoritması örneği verilmiştir


Doğrusal Arama
Dizideki bir öğeyi en fazla 'n' karşılaştırmasında aramak için, n girdi öğesi göz önüne alındığında . Başka bir deyişle, hangi programlama dilini kullanırsanız kullanın, hangi kodlama stilini tercih edersiniz, hangi sistemi çalıştırırsınız. En kötü senaryoda, yalnızca n karşılaştırma gerektirir. Yürütme süresi, giriş boyutuyla doğrusal olarak orantılıdır.

Ve bu sadece arama değil, iş ne olursa olsun (artan, karşılaştırma veya herhangi bir işlem) giriş boyutunun bir işlevidir.

Bu nedenle, herhangi bir algoritmanın O (log n) olduğunu söylediğinizde, yürütme süresi günlük giriş boyutunun n katıdır.

Girdi boyutu arttıkça yapılan iş (burada yürütme süresi) artar (dolayısıyla orantılılık).

      n      Work
      2     1 units of work
      4     2 units of work
      8     3 units of work

Giriş boyutu arttıkça yapılan işin arttığını ve herhangi bir makineden bağımsız olduğunu görün. Ve eğer iş birimlerinin değerini bulmaya çalışırsanız, aslında yukarıda belirtilen parametrelere bağlıdır. Sistemlere ve hepsine göre değişecektir.


5

ağaç

log x to base b = y tersi b^y = x

D derinliği ve n boyutu olan bir M-ary ağacınız varsa, o zaman:

  • ağacın tamamında gezinme ~ O (M ^ d) = O (n)

  • Ağaçta tek bir yolda yürümek ~ O (d) = O (M tabanına giriş n)


5

Bilgi teknolojisinde şu anlama gelir:

  f(n)=O(g(n)) If there is suitable constant C and N0 independent on N, 
  such that
  for all N>N0  "C*g(n) > f(n) > 0" is true.

Karınca gibi görünüyor ki bu notasyon çoğunlukla matematikten alınmıştır.

Bu yazıda bir alıntı var: DE Knuth, "BÜYÜK OMICRON VE BÜYÜK OMEGA VE BÜYÜK THETA", 1976 :

Burada tartışılan konulara dayanarak, SIGACT üyelerinin ve bilgisayar bilimi ve matematik dergilerinin editörlerinin, daha iyi bir alternatifin yakında bulunamayacağı sürece, yukarıda tanımlanan gösterimleri benimsemelerini öneriyorum .

Bugün 2016, ama bugün hala kullanıyoruz.


Matematiksel analizde şu anlama gelir:

  lim (f(n)/g(n))=Constant; where n goes to +infinity

Ancak matematiksel analizde bile bazen bu sembol "C * g (n)> f (n)> 0" anlamında kullanılmıştır.

Üniversiteden bildiğim gibi sembol Alman matematikçi Landau (1877-1938) tarafından taklit edildi.


3

Tam ikili örnek O (ln n) şeklindedir, çünkü arama şöyle görünür:

1 2 3 4 5 6 7 8 9 10 11 12

4'ü aramak 3 sonuç verir: 6, 3 sonra 4. Ve log2 12 = 3, bu da kaç yerde gerekli olduğu konusunda iyi bir orantıdır.


örnek için teşekkürler. Algoritmamızın bölme ve fethetme yönteminde logaritmik zamanı nasıl kullanabileceğini açıkça söylüyor.
Abc

Eğer n / 2 döngüsü her zaman log (n)?
Gil Beyruth

3

Eğer sezgiye dayalı bir cevap arıyorsanız, sizin için iki yorum koymak istiyorum.

  1. Çok geniş bir tabana sahip çok yüksek bir tepe düşünün. Tepenin tepesine ulaşmak için iki yol vardır: biri tepeye ulaşan tepenin etrafında spiral olarak giden özel bir yoldur, diğeri: bir merdiven sağlamak için kesilmiş oymalar gibi küçük teras. Şimdi birinci yol doğrusal zaman O (n) 'de ise, ikincisi O (log n) olur.

  2. nGirdi olarak bir tamsayıyı kabul eden ve zamanla no (n) veya teta (n) ile orantılı olarak tamamlanan bir algoritma düşünün, ancak zamanla orantılı olarak number of digits or the number of bits in the binary representation on numberçalışırsa, algoritma O (log n) veya teta'da çalışır (log n) zamanı.


lütfen düzenleyin. her iki senaryoda da "O (n) veya teta (n)" var mı? Ayrıca, bunu çok duydum, boyut # basamaklara karşı. N = 10000000 için === 128 ve n = 10000000 için === 8 rakamlarını mı söylüyoruz? Lütfen açıklayınız.
Cody

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.