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ı?
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ı?
Yanıtlar:
Bu ilginç bir soru. Neyse ki, nasıl çözüleceğini öğrendikten sonra, özellikle zor değil.
Fonksiyonlar için f : N → R + ve g : N → R + , elimizdeki f ∈ O ( g ), ancak ve ancak lim destek N → ∞ f ( n ) / g ( n ) ∈ R .
Bir fonksiyon f : N → R + sürekli var olan en polinom büyümeyi ancak ve ancak sahip k ∈ N , öyle ki ön ∈ O ( n, ↦ n k ). Bunu keyfi ama sabit k ∈ N 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.
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.