Logaritmik ve çift logaritmik zaman karmaşıklığı


9

Gerçek dünya uygulamalarında, O(log(log(n)) onun yerine O(log(n)) algoritmalar?

Bu, daha geleneksel ikili arama ağacı uygulamaları yerine örneğin van Emde Boas ağaçlarının kullanıldığı bir durumdur. Ama örneğin, eğern<106 en iyi durumda çift logaritmik algoritma logaritmik algoritmadan (yaklaşık olarak) 5. Ve ayrıca genel olarak uygulama daha zor ve karmaşıktır.

Kişisel olarak BST'yi VEB ağaçlarına tercih ettiğim göz önüne alındığında, ne düşünüyorsunuz?

Bunu kolayca gösterebiliriz:

n<106. lognlog(log(n))<5.26146


temelde daha küçük değer / girdi boyutu için algoritmaya dahil olan sabitlere bakmalısınız. İdeal olarak küçük olmalarını isteriz.
singhsumit

3
Arama / ekleme / silme karmaşıklığı ile RAM üzerindeki veri yapılarında bulunan VEB ağaçlarından beri bir takım iyileştirmeler olduğunu unutmayın. O(log log n) randomizasyon olmadan (deterministik) ve O(log log n)randomizasyon ile. Bkz. Deterministik SıralamaO(n log log n)Zaman ve Doğrusal Uzay. Han tarafından veO(log log n)Beklenen Zaman ve Doğrusal Uzay. Han ve Thorup tarafından.
AT

Gerçek dünyada, 5 faktörü oldukça önemlidir ve öğe sayısı genellikle 10 ^ 9 veya hatta 10 ^ 12 olabilir.
RBarryYoung

Yanıtlar:


10

Bunu unutma logn hala katlanarak büyüyor ( log(n)) daha hızlı log(logn)!

Gerçekten, eğer bölümüne bakarsanız log(n) ve log(log(n)), görülecek çok etkileyici bir şey yok:

log (n) / günlük (log (n)),
[ kaynak ]

Ama yine de, boyutlar için beş ila altı arasında bir faktör elde edersiniz 100000. Daha büyük boyutların pratikte nadir olmadığını ve bu faktörün hızlandırmasının harika olduğunu unutmayın ! Öğle yemeğinden sonra ya da sadece yarın sonuç almak arasında fark yaratabilir. Hızlandırmanın bir kısmının ağaç uygulamasının daha yüksek sabitleri tarafından yenilebileceğini unutmayın; komplo kurmanız (veya analiz etmeniz) gerekirclog(n) ve dlog(log(n)) ile c,d gerçek çalışma resmi sabitleri.

Buna ek olarak, Dave'in bahsettiği şey önemlidir: eğer işlem hızlandırılırsa, diyelim ki doğrusal olarak sık sık sabit hızlanmalar doğrusal hızlanma olur, yani tüm algoritmanızın öncü sabitini azaltabilirsiniz! Yukarıda söylediğim gibi, bu harika. İşlemi çalıştırırsanız ne olduğuna bakınn zamanlar:

n * log (n) / (n * log (log (n)))
[ kaynak ]

Eğer bu belaya değmezse, ne olduğunu bilmiyorum.


6

Karmaşıklıktaki farkın gerçekten çok önemli olmadığını ve gerçek çalışma süresinin daha önemli olduğunu hayal edebiliyoruz. Ancak algoritma başka bir algoritmanın merkezinde bulunuyorsa, bu fark önemli olabilir.

Tamamen teorik bir amaçtan, özellikle algoritma bir başkasının parçasıysa, elbette fark önemlidir. Daha büyük algoritmayı farklı bir karmaşıklık sınıfına yerleştirebilir.


6

Aslında bir kez kendim Emde-Boas ağacını karşılaştırdım. Bir AA Ağacı, bir hashmap ve biraz dizi ile karşılaştırdım.

Testler sizearalıkta rastgele sayılarla kesici uçlar gerçekleştirir [0, bound], sonra sizearar, sizesiler ve sonra tekrar sizearar. Silme işlemleri rasgele sayılar üzerinde de yapılır, bu yüzden öncelikle yapıda olup olmadıklarını anlamanız gerekir.

Saniyeler içinde sonuçlar ( size= 2000000, bound= 10000000):

AATreeLookup - O(n log n)
Inserting... 3.3652452
Searching... 5.2280724
Deleting...  7.3457427
Searching... 9.1462039
HashLookup - O(n) expected
Inserting... 0.3369505
Searching... 0.6223035
Deleting...  0.9062163
Searching... 1.1718223
VanEmdeBoasTree - O(n log log n)
Inserting... 0.7007531
Searching... 1.1775800
Deleting...  1.7257065
Searching... 2.2147703
ArrayLookup - O(n)
Inserting... 0.0681897
Searching... 0.1720300
Deleting...  0.2387776
Searching... 0.3413800

Gördüğünüz gibi van Emde-Boas ağaçları, karma haritaların yaklaşık iki katı, bit dizilerinin on katı ve ikili arama ağaçlarının 5 katıdır.

Elbette yukarıdakilerin bir feragatnameye ihtiyacı vardır: testler yapaydır, kodu daha hızlı bir şekilde geliştirebilir veya çıktısı daha hızlı olan bir derleyici ile farklı bir dil kullanabilirsiniz, vb.

Bu feragat, algoritma tasarımında asimptotik analizi kullanma nedenimizin kalbinde yer almaktadır: sabitlerin ne olduğu hakkında hiçbir fikriniz olmadığı ve sabitlerin çevresel faktörlere bağlı olarak değişebileceği için yapabileceğimiz en iyi şey asimptotik bir analizdir.

Şimdi, logn karşı loglogn: Yukarıdaki örnekte, minibüs Emde-Boas ağacım şunları içerebilir: 232 elementler. log232=32, ve log32=5Bu, pratikte biraz olan bir faktör 6 iyileştirmedir. Buna ek olarak, van Emde-Boas ağaçlarının kendilerini dengelemeleri gerekmediği için iyi sabit faktörleri vardır (hepsi bu küçük farklılıklar için sabit faktörlerle ilgilidir).


Belki R (veya eşdeğeri) içine atlamak ve bazı güzel grafikler (@Raphael yaptığı gibi) üretir.
Dave Clarke

1
Bu algoritmaları kavramlarla ilişkilendirirseniz cevabınızı geliştirirsiniz logn ve loglogn
Dave Clarke

@DaveClarke: öneriler için teşekkürler. Ne yazık ki, güzel resimler üretme konusunda oldukça kötüyüm - sanırım düzenlemem sonuçlarımın okunabilirliğini geliştirdi.
Alex ten Brink

Muhtemelen uygun bir resim için yeterli veri yoktur. Olursa olsun .... ama iyi resimler yapmayı öğrenmek kullanışlı bir beceridir.
Dave Clarke
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.