Algoritmanın O olup olmadığını belirleme (log n)


25

CS Teorimimi yeniliyor ve bir algoritma O (log n) karmaşıklığını nasıl tanımlayacağımı bilmek istiyorum. Özellikle, onu tanımlamanın kolay bir yolu var mı?

O (n) ile biliyorum, genelde tek bir döngü var; O (n ^ 2) bir çift döngüdür; O (n ^ 3) üçlü bir döngüdür, vb. Peki ya O (log n)?



Ah, bakmadığım tek yer orası :)
Atif

Yanıtlar:


32

O (n) ile biliyorum, genelde tek bir döngü var; O (n ^ 2) bir çift döngüdür; O (n ^ 3) üçlü bir döngüdür, vb. Peki ya O (log n)?

Burada gerçekten yanlış yoldan gidiyorsun. Hangi big-O ifadesinin belirli bir algoritmik yapıyla gittiğini ezberlemeye çalışıyorsunuz, ancak gerçekten sadece algoritmanın gerektirdiği işlemleri saymalı ve bunu girdi büyüklüğü ile karşılaştırmalısınız. Tüm girişi çevreleyen bir algoritma, O (n) performansına sahiptir çünkü tek bir döngüye sahip olmadığı için n döngüsünü çalıştırır. İşte O (log n) performansı ile tek bir döngü:

for (i = 0; i < log2(input.count); i++) {
    doSomething(...);
}

Bu nedenle, gerekli işlemlerin sayısı herhangi bir algoritma sırasına girdi büyüklüğü logaritması O (log n) 'dir. Big-O analizinin size söylediği önemli şey, bir algoritmanın yürütme süresinin girişin büyüklüğüne göre nasıl değiştiğidir: girişin boyutunu iki katına çıkarırsanız, algoritma 1 adım daha atar mı (O (log n)) , iki kat fazla adım (O (n)), dört kat fazla adım (O (n ^ 2)) vb.

Girişlerini tekrar tekrar bölümleyen algoritmaların tipik olarak performanslarının bir parçası olarak 'log n' ye sahip olduğunu deneyimlerden bilmek yardımcı oluyor mu? Emin. Ancak, bölümlemeyi aramayın ve algoritmanın performansının O (log n) olduğu sonucuna atlayın - bu oldukça farklı olan O (n log n) gibi bir şey olabilir.


3
“Boyutun logaritması sırasına göre” demenin daha büyük bir yolunun “boyuttaki hane sayısının sırasına” demek olduğunu unutmayın.

@Caleb, logaritmanın gerçek tabanı, ölçeklendirme konuşurken önemsizdir.

@Caleb mutlak konuşma mutlak büyük O ile anlam ifade etmiyor. Daha iyi bir ifade isteyebilirsiniz: basamak sayısı iki katına çıktığında basamak sayısı iki katına çıkar.

@Caleb mutlak konuşma mutlak büyük O ile anlam ifade etmiyor. Daha iyi bir ifade isteyebilirsiniz: basamak sayısı iki katına çıktığında basamak sayısı iki katına çıkar.

@ ThorbjørnRavnAndersen Evet, "büyüklüğün logaritması" ne anlama geliyor? İfade ile ilgili problemin ne olduğundan emin değilim, çünkü farklı söylemeyi seçtin. Temel olarak, sanırım aynı fikirdeyiz.
Caleb

25

Buradaki fikir, bir algoritmanın, O(log n)bir yapıyı 1'e 1 kaydırmak yerine, yapıyı tekrar tekrar ikiye bölmek ve her bölme için sabit sayıda işlem yapmak olmasıdır. Cevap uzayının bölünmeye devam ettiği arama algoritmaları O(log n). Bunun bir örneği , numarayı bulana kadar sıralı bir diziyi tekrar tekrar yarıya bölmeye devam ettiğiniz ikili aramadır.

Not: Mutlaka yarıya bölmeniz gerekmez.


1
Girdiyi ikiye bölüp sonra tekrar bölmeden önce kalanı 2 ^ (n / 2) kez tekrarlarsam ne olur? (Tabii ki ne olduğunu biliyorum, sadece bu basit yaklaşımın başarısız olduğu bir örnek göstermek istedim).
Tamás Szelei

@afish Bu biraz nadir. Ararken olağanüstü nadir görülür.
Donal Fellows

1
@DonalFellows Algoritma teorisi ampirik bir bilim değildir. Asıl soru, arama yapmakla ilgili değildi, sadece log ninsanlarda tetiklenen ikili arama reflekslerinden bahsetti .
Tamás Szelei

2
Bölümleme, algoritmayı O (log n) yapmaz, (genellikle) big-O limitine log n ekler. Yığın ve mergesort gibi özyinelemeli türler mükemmel örneklerdir: girdileri ayırırlar, ancak sonradan ortaya çıkan her iki bölümü de yinelemeli olarak bölümler. Sonuç, O (n log n) performansıdır.
Caleb

@ afish: İyi nokta. Bu cevaba göre amacım, sorunun niteliği göz önüne alındığında mümkün olduğu kadar basit tutmaktır. Bu yapıyı basitçe aşmaya çalışmak için "yapıyı ikiye bölüyorsun ..." satırını "yapıyı ikiye bölmek ... ve her bölünme için sabit sayıda işlem yapmak" olarak değiştirdim.
Casey Patton

2

Tipik örnekler, ikili arama ile ilgili olanlardır. Örneğin, bir ikili arama algoritması genellikle O(log n).

Eğer bir varsa ikili arama ağacı , arama, insert ve sil hepsi O(log n)karmaşıklık.

Mekanı sürekli olarak paylaştığınız herhangi bir durum, genellikle bir log nbileşen içerecektir . Bu yüzden birçok sıralama algoritmasının O(nlog n)karmaşıklığı vardır, çünkü çoğu zaman bir kümesi bölümlere ayırır ve gittikçe sıralanırlar.


1

"Tek döngü -> O (n), çift döngü -> O (n ^ 2)" kadar basit istiyorsanız, cevabınız muhtemelen "Ağaç -> O (log n)". Bir ağacı kökten bire (her şey değil!) Ya da tam tersi yönde geçirerek daha doğru bir şekilde geçirin. Ancak, bunların tümü basitleştirmelerdir.


Peki cevabımın nesi var? Yapıcı eleştiriye açığım.
Fularlı

0

Bir algoritmanın O (log N) olup olmadığını tanımlamanın kolay bir yolu olup olmadığını bilmek istersiniz.

Şey: sadece koş ve zamanla. 1.000, 10.000, 100.000 ve bir milyon girdiler için çalıştırın.

Eğer 3,4,5,6 saniyelik (veya bazı çoklu) çalışma sürelerini görüyorsanız, güvenli bir şekilde O (log N) olduğunu söyleyebilirsiniz. Daha çok ise: 1,10,100,1000 saniye, o zaman muhtemelen O (N). Ve eğer 3,40,500,6000 saniye gibi bir şey ise O (N log N).


Herkes bu cevabı her ikisi de açık nedenlerden dolayı bir o kadar oy vermeli :-)
gnasher729
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.