Logaritmik karmaşıklık için algoritmik sezgi


59

, ve gibi karmaşıklıkların makul bir kavrayışına sahip olduğuma inanıyorum .Θ ( n ) Θ ( n- 2 )O(1)Θ(n)Θ(n2)

Liste açısından, sürekli bir aramadır, bu yüzden listenin başına geçiyor. , tüm listeyi yürüdüğüm yer ve listedeki her öğe için listeyi bir kez yürüyor.Θ ( n ) Θ ( n- 2 )O(1)Θ(n)Θ(n2)

ı kavramanın benzer bir sezgisel yolu var mı? ve arasında bir yerde olduğunu bilmek dışında mı?O ( 1 ) Θ ( n )Θ(logn)O(1)Θ(n)


8
log n "arama" içindir: ikili arama düşün
Suresh

2
Bu soruyu sormak için kullanmak yanlıştır, çünkü yalnızca bir üst sınırı belirtir. Örneğin sabit süre . daha uygun olurdu. Meta soruya bakın: meta.cs.stackexchange.com/questions/182/…O ( log n ) θOO(logn)θ
Aryabhata


Küçük bir not: Klasik Turing Machine ayarlarında, tüm algoritmalar girişin her sembolünü en az bir kez okumak zorunda oldukları için . İkili arama de yapılabilir, çünkü örneğin listenin sıralanacağı sözümüz vardır. O ( log n )Ω(n)O(logn)
chazisop

1
Geç katkı: tanımı gereği, baz Sayının logaritma sen çarpın kez sadece sayıdır almak için kendisi tarafından . . Örneğin, . Eğer numaranız varsa ve ne olduğunu bulmak istiyorsanızsadece ulaşana kadar bölmeye devam edin ( basitlik için bir gücü olduğunu varsayarsak ). Bölüm sayısı eşittir . Bu bölünme davranışını gösteren algoritmalar, çalışma sürelerine sahiptir.n b n b l = nbnbn2 3 = 8bl=nl=logb(n), n l O g B ( n ) = ? b 1 , n B l O g B ( n ) O ( l O g ( n ) )23=8log2(8)=3nlogb(n)=?b1nblogb(n)O(log(n)).
saadtaame

Yanıtlar:


53

karmaşıklığı, alt bölümü ile bağlanmıştır. Örnekleri listeler olarak kullanırken, öğeleri sıralanan bir liste hayal edin. Bu listede zaman içinde arama yapabilirsiniz - listenin sıralanan yapısı nedeniyle aslında her bir öğeye bakmanıza gerek yoktur.O ( log n )Θ(logn)O(logn)

Listenin ortasındaki öğeye bakar ve onu aradığınız öğeyle karşılaştırırsanız, dizinin solunda mı yoksa sağında mı olduğunu hemen söyleyebilirsiniz. Ardından, sadece bir buçuk kısmı alabilir ve işlemi bulana kadar ya da önemsizce karşılaştıracağınız 1 öğeye sahip bir listeye erişene kadar tekrarlayabilirsiniz.

Listenin her adımı etkin biçimde yarıya indirdiğini görebilirsiniz. Bu, uzunluğunun bir listesini alırsanız , bir öğe listesine ulaşmak için gereken maksimum adımın . öğelerin bir listeniz varsa , yalnızca adım gerekir , listesi için yalnızca adım gerekir .5 128 = 2 7 7 1024 = 2 10 10325128=2771024=21010

Gördüğünüz gibi; üs içinde her zaman gerekli adımların sayısını gösterir. Logaritma, bu üs numarasının aynısını “çıkarmak” için kullanılır, örneğin . Ayrıca, iki uzunluğun güçleri olmayan uzunlukları listelemek için genelleştirir.2 n log 2 2 10 = 10n2nlog2210=10


4
Bunun sadece O(log n)listenin sürekli rasgele erişime sahip olması durumunda olduğu belirtilmelidir . Daha tipik liste uygulamalarında (bağlantılı listeler) buO(n log n)
as

1
İkili arama, işaretçi yokluğu için listelerde çalışmaz; genellikle dizilerde yapılır.
Raphael

İkili arama listelerde gayet iyi çalışıyor. Gerektiğinden / kullanışlı / pratik olandan çok daha karmaşık olması nedeniyle oldukça anlamsız.
Anton

@AndrewMyers Bağlantılı bir listeyi aramak daha doğrudurO(n)
phant0m

1
@ phant0m Evet, beni her seferinde en başından geçmek yerine şu anki konumdan hareket ettiğinizi varsaymam biraz zaman aldı.
asm

38

(Dengeli) ağaçlara göre (örneğin, ikili ağaç, yani tüm temel 2'dir):log

  • Θ(1) ağacın kökünü alıyor
  • Θ(logn) kökten yaprağa bir yürüyüşdür
  • Θ(n) , ağacın tüm düğümlerini geçiyor
  • Θ(n2) , ağaçtaki iki düğümdeki tüm alt kümelerdeki eylemlerdir, örneğin, iki düğüm arasındaki farklı yolların sayısı.
  • k kΘ(nk) - herhangi bir düğümü alt kümesi için yukarıdakilerin genelleştirilmesi ( sabit bir )kk
  • k = 1 , 2 , , nΘ(2n) , olası tüm düğüm alt kümeleri üzerindeki eylemlerdir (mümkün olan tüm boyutlardaki altkümeler, yani, .). Örneğin , ağacın farklı alt ağaçlarının sayısı .k=1,2,,n

5
Buna eklemek için, iki şeyden gelir: 1.) ve 2 nolu tekrarı . Boyut olan bir şey, yani ağacın yüksekliğinde ikili bir arama. T ( n ) = T ( Θ(loglogn)T(n)=T((n))+1log(n)
mcorley

17

İçin mümkün olduğu, size göre keyfi bir miktarda orantılı sorunu boy kısmak için mümkün olması gerekmektedir , sabit bir zaman işlemi ile.O(logn)n

Örneğin, ikili arama durumunda, her karşılaştırma işleminde sorun boyutunu yarı yarıya azaltabilirsiniz.

Şimdi problem boyutunu yarı yarıya azaltmak zorundasınız, aslında hayır. Algoritma , problem arama alanını% 0.0001 azaltabilse bile, problem büyüklüğünü azaltmak için kullandığı yüzde ve işlem sabit kaldığı sürece, Algoritma, hızlı bir algoritma olmayacak, fakat hala sabit . ( Temel 2 günlük ile hakkında konuştuğumuzu varsayalım)O(logn)O(logn)O(logn)logn


1
'Aşağı kesim miktarı' sabit olmasaydı ne olurdu?
Svish

@Svish Sorunu pozitif bir oranda azaltabilirseniz, muhtemelen artık sıkı bir bağ olmayacak olmasına rağmen hala bir algoritması olabilir. Olumsuz oran söylemek zor. Bu durumda cevabı oldukça basit hale getirmek için varsayılmıştı, çünkü bu sorunun kendi yararı olduğu için, bunu kendi başına bir soru olarak sormaktan memnuniyet duyarsınız. O(logn)
Ken Li,

Evet, sorun arama alanının her zaman azaldığı, ancak sabit bir oranda olması gerektiği anlamına gelmiyordu. Sadece "sorun boyutunu azaltmak için kullandığı yüzde ve işlem sabit kaldığı sürece, o bir O (log n) algoritması" derken, sadece aklınıza geliyordu; eğer yüzde sabit değilse, farklı bir isme sahipse.
Svish

8

Ondalık sayıları ikiliye çeviren algoritma hakkında düşününn

while n != 0:
   print n%2, 
   n = n/2

Bu whiledöngü kez çalıştırılır.log(n)


1
Şüphesiz bu program kere log'lar, ancak genellikle karmaşıklığı hakkında konuştuğumuzda , , girişinizin büyüklüğüdür. Burada girişinizin büyüklüğü zaten , yani bu programın sadece lineer olduğunu söyleyebilirim ( )lognO(f(s))ss=lognO(s)
jmad

@jmad Sağ. Ancak bu örnek, log (n) içine sezgiyi verir.
Pratik Deoghare

@jmad Ben de rastgele sayılar üretmek için algoritma kullanabilirdim ama mümkün olduğunca basit istedim.
Pratik Deoghare

8

Evet, ile arasında , ancak yakın . Nedir ? Log fonksiyonu, üstellemenin ters fonksiyonudur. Üstellik ile başlayayım ve logaritmanın ne olduğu hakkında daha iyi bir fikir edinmelisin.log(n)1n1nlog(n)

İki ve sayıları dikkate alın . . , ile kez çarpılır . Bir miktar çabayla sayı sayabilirsin , ama sayabilir misin ? Bahse girerim yapamazsın. Neden? öyle büyük bir sayı ki evrendeki tüm atomların sayısından daha büyük. Bir an için bunu düşünün. Öyle büyük bir sayı ki, her bir atomun ismini (sayı) vermenizi sağlar. Parmağınızın çivisindeki atomların sayısı muhtemelen milyarlarca sırada. herkes için yeterli olmalı (pun gerekiyor :)).100210021002100100210021002100

Şimdi, iki sayı arasında, ve , , logaritmasıdır (temel ). karşılaştırmalı olarak den küçük bir sayıdır . Herkesin evinde farklı eşya olması gerekir . Ancak, evren için yeterince iyidir. ve düşünürken evreni vs evreni düşünün .10021001002100210021001002100log(n)n

Üstellik ve logaritmalar nereden geliyor? Bilgisayar bilimine neden bu kadar ilgi duyuyorlar? Fark etmeyebilirsiniz, ancak üstel her yerde. Kredi kartına faiz mi ödedin? Sadece eviniz için bir evren ödediniz (Çok kötü değil, ama eğri uyuyor). Üstelliğin ürün kurallarından geldiğini düşünmekten hoşlanıyorum, ancak diğerleri daha fazla örnek vermekten memnuniyet duyacaktır. Ürün kuralı nedir, sorabilirsiniz; Ve cevaplayacağım.

İki şehir ve ve aralarında gitmenin iki yolu olduğunu söyleyin. Aralarındaki yol sayısı nedir? İki. Bu önemsiz. Şimdi orada başka bir şehir, demek ve aralarından gidebilir için üç şekilde. Şimdi ve arasında kaç yol var ? Altı, değil mi? Bunu nasıl aldın? Onları saydın mı? Yoksa onları çarptın mı? Her iki durumda da, her iki yolun da benzer bir sonuç verdiğini görmek kolaydır. Şimdi , ulaşılabilecek dört şehri yoluna eklerseniz , ve arasında kaç yol vardır?ABCBCACDCAD? Bana güvenmiyorsan say, ama olan eşittir . Şimdi, eğer on şehir varsa ve bir şehirden diğerine iki yol varsa ve onlar düz bir çizgi üzerinde düzenlenmişlerdir. Baştan sona kaç yol var? Bana güvenmiyorsanız onları çarpın, ancak size olan olduğunu söyleyeceğim . Bu Bkz üstel sonucu ve logaritmasıdır . , karşılaştırıldığında küçük bir sayıdır .2342421010242101010210101024

Logaritma fonksiyonu için neyi etmektir (unutmayın logaritma en temel teşkil eder). Eğer multipy Eğer kendisiyle kere (dikkat: logaritma en temel teşkil eder) Alacağınız . ile karşılaştırıldığında çok küçük, çok küçük olan sizin ev büyüklüğünde olduğunu, evrenin boyutudur.log2(n)nn2n2logb(n)bbnlog(n)nn

Pratik bir notta, fonksiyonları sabit fonksiyonlara çok benzer performans gösterir. ile büyürler , ama çok yavaş büyürler. Bir programı, bir gün önce olan logaritmik bir sürede çalışacak şekilde optimize ettiyseniz, muhtemelen dakikalar halinde çalıştıracaksınız. Project Euler ile ilgili kendiniz sorun.log(n)n


3
Güzel yazılmış olsa da, bu cevap " gerçekten çok küçük" dışında pek fazla bilgi içermiyor . log(n)
Raphael

3
Ne kadar küçük olduğu konusunda bir sezgiyi vermeye çalışıyordum.
Ravi

5

Temanıza devam etmek için, , listede nerede olduğunu ve “daha ​​yüksek” veya “daha ​​düşük” olarak söylendiğini (indeks cinsinden) tekrar tekrar tahmin etmek gibidir .xO(logn)x

Hala listenin boyutuna dayanıyor, ancak öğelerin sadece bir kısmını ziyaret etmeniz gerekiyor.


4

Eğer bir bölme ve fethetme algoritmamız varsa ve bir alt problem için sadece bir özyinelemeli çağrı yaparız ve bu, Master teoreminde ikinci durumdur , yani özyinelemeyen bölümün zaman karmaşıklığı , o zaman algoritmanın karmaşıklığı .Θ ( lg k + 1 , n )Θ(lgkn)Θ(lgk+1n)

Başka bir deyişle, mevcut problemin sabit bir faktöre sahip bir problem üzerine kendine bir özyinelemeli çağrı yapan bir bölme ve fethetme algoritmasına sahip olduğumuzda ve özyinelemeli olmayan kısımdaki zaman (sabit), o zaman algoritmanın çalışma süresi .lg , nΘ(1)lgn

İkili arama algoritması klasik bir örnektir.


1

Sezgi, bir sayıyı yarıya indirebilmenizdir, yani n, 1'e düşürülmeden önce O (lg n) 'dir.

Görselleştirmek için, onu ikili bir ağaç olarak çizmeyi deneyin ve bu geometrik ilerlemeyi çözerek seviye sayısını sayın.

2^0+2^1+...+2^h = n

Siteye Hoşgeldiniz! Söylediğiniz şey elbette doğrudur, ancak varolan cevaplara ne kattığını göremiyorum. Yanıtların birçoğu zaten logaritmanın 1'e çarpmadan önce ikiye bölebileceğiniz sayı olduğunu söylüyor ve Ran'ın cevabı, yaprakları olan bir ikili ağacın yüksekliği olduğunu söylüyor . nlognn
David Richerby
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.