Zaman karmaşıklığı 2 ^ sqrt (n)


11

Bir algoritma sorusu çözüyorum ve benim analiz O (2 ^ sqrt (n)) üzerinde çalışacak olmasıdır. Ne kadar büyük? O (2 ^ n) 'ya eşit mi? Hala polinom olmayan bir zaman mı?


3
Lütfen soruyu aşağıya oylamak için yorum yapın. Teşekkürler!
Gaara

4
Dürüst olmak gerekirse, insanların son derece önemsiz bir soru için bunu yanlış yaptığından şüpheleniyorum, ancak her iki şekilde de nasıl kanıtlayacağım bana açık değil, bu yüzden bir cevap yazacağım ve bunun insanların fikirlerini değiştirip değiştirmediğini göreceğim.
Ixrec

3
Vikipedi makalesine göre alt üstel zaman, ikinci tanım (Feragat: Ben aşağı oy vermedim; ve bu konuda doğru olup olmadığını söylemek için yeterli bilmiyorum.)
rwong

1
Harika! Alt-üstel zaman: "bazı algoritmaların çalışma süresi herhangi bir polinomdan daha hızlı büyüyebilir, ancak yine de üstelden önemli ölçüde daha küçüktür". Bu kesinlikle soruma cevap veriyor ve Big O analizi hakkındaki bilgilerimi genişletiyor. Çok teşekkürler
Gaara

1
Özellikle büyük sayılar için O'dan (2 ^ n) çok daha azdır. 10000 elemandan oluşan bir koleksiyona sahip olun. 2 ^ 10000, yaklaşık 3000 basamaklı bir sayıdır, üzerinde O (2 ^ n) işlemi yapmak için kaç döngü gerekir. O (2 ^ sqrt (n)) ile 30 basamaklı bir sayıya inersiniz. Fark, büyük sayılar için sqrt çözümü lehine son derece büyüktür (1 milyon eleman için (300 000 basamaklı sayı) * cpu döngüsü ile (300 basamaklı sayı) * cpu döngüsü).
Andy

Yanıtlar:


16

Bu ilginç bir soru. Neyse ki, nasıl çözüleceğini öğrendikten sonra, özellikle zor değil.

Fonksiyonlar için f : NR + ve g : NR + , elimizdeki fO ( g ), ancak ve ancak lim destek N → ∞ f ( n ) / g ( n ) ∈ R .

Bir fonksiyon f : NR + sürekli var olan en polinom büyümeyi ancak ve ancak sahip kN , öyle ki önO ( n,n k ). Bunu keyfi ama sabit kN için halledelim .

lim sup n → ∞ 2 ( n 1/2 ) / n k =
lim n → ∞ 2 ( n 1/2 ) / n k =
lim n → ∞ e log (2) n 1/2 / e log ( n ) k =
lim n → ∞ e log (2) n 1/2 - log ( n ) k = ∞ ∉ R

İlk eşitlik doğrudur çünkü hem aday hem de payda monoton olarak büyüyen sabit işlevlerdir. İkinci eşitlik x y = e log ( x ) y kimliğini kullanır . Son ifadedeki üs yukarıda sınırlanmadığından, sınır sonlu değildir. Resmi bir kanıt vermeden, n 1/2 'nin log ( n )' ye asemptolojik olarak hükmedildiği varsayılabilir . Bu nedenle, söz konusu fonksiyon polinom büyümesini aşmaktadır.

Bununla birlikte, büyümesi kesinlikle üstelden daha azdır, burada üstel (benim için bu amaç için) c > 0 için O ( n ↦ 2 c n ) olarak tanımlanır .

lim sup n → ∞ 2 c n / 2 ( n 1/2 ) = lim n → ∞ 2 c n - n 1/2 = ∞ ∉ R

herhangi bir sabit, c > 0 nedenle, işlev karmaşıklığı polinom ve üstel arasında bir yerlerde esas yerdir.


6

Ne kadar büyük? O (2 ^ sqrt (n)) tam olarak ne kadar büyük :-(

Ne anlama geldiğine dair bir fikir edinmek için algoritmanızın yalnızca O (2 ^ sqrt (n)) olmadığını, aslında bilgisayarınızda tam olarak 2 ^ sqrt (n) nanosaniye sürdüğünü düşünün:

n = 100: 2 ^ 10 = 1024 nanosaniye. Hiç zaman yok. n = 1000: 2 ^ 31.xxx = 2 milyar nanosaniye. İki saniye, bu farkedilebilir. n = 10.000: 2 ^ 100 ≈ 10 ^ 30 nanosaniye = 10 ^ 21 saniye = 30 trilyon yıl.

Bu n ^ 100'ün 30 trilyon yıl alacağı 2 nano nanosaniyeden çok daha iyidir, ancak yine de çözebileceğiniz sorunların boyutu oldukça sınırlıdır. Bilgisayarınız bir hafta içinde çözebilirse "çözülebilir" bir sorun olduğunu düşünüyorsanız, bu yaklaşık 6 x 10 ^ 14 nanosaniye, n = 2.400 civarındadır. Öte yandan, n = 400'e kadar milisaniyede çözülebilir.

(Uygulamada, n = 10,000 için hem O (2 ^ sqrt (n)) hem de O (2 ^ n) tam olarak aynı zaman alır: Beklemek için çok uzun.)

Herhangi bir polinomu aşar. N ^ 1000 saniye süren başka bir algoritma kullanın. Bu, n = 2 için pratik olarak çözülemez. Bu algoritma, n yaklaşık 885 milyon olana kadar daha uzun sürer. Ama gerçekten kimin umrunda? Bu noktada, her iki algoritmanın da aldığı yıl sayısı 9.000 basamaklı bir sayıdır.

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.