2 ^ n ve n * 2 ^ n aynı zamanda karmaşık mı?


178

Zaman karmaşıklığı konusunda bulduğum kaynaklar, zaman polikomikliği denkleminde, özellikle polinom olmayan örneklerle, terimleri görmezden gelmenin ne zaman uygun olmadığı konusunda net değil.

Bana göre n 2 + n + 1 şeklinde bir şey göz önüne alındığında , son iki terimin önemsiz olduğu açıktır .

Özellikle, 2 n ve n * (2 n ) olmak üzere iki kategorizasyon verildiğinde , ikincisi birinciyle aynı sırada mıdır? Buradaki ek n çarpımı önemli mi? Genellikle kaynaklar sadece x n'nin üstel olduğunu ve çok daha hızlı büyüdüğünü söylüyor ... sonra devam edin.

Neden 2 n'nin n'den çok daha fazla olacağından anlayamıyorum , ancak birlikte eklenmedikleri için, iki denklemi karşılaştırırken büyük önem taşıyor, aslında aralarındaki fark her zaman n faktörü olacak, en azını söylemek önemli gibi görünüyor.


8
Bence, NLogN'nin N'den kesinlikle daha yavaş olduğu düşünülürse de, çoğu insan gerçekten ne kadar umursamıyorsa, N2 ^ N'nin 2 ^ N'den daha yavaş olduğunu, ancak insanlar için "yeterince yavaş" olduğunu söylemek güvenlidir. bakım ..
Jack

@tobias_k, bu noktayı anlıyorum, ancak O (n!) örneğini ele alalım. Fazladan bir terim gerçekten farklı olur mu? O (n!) O (n * n!) 'Dir, çünkü O (n!) O ((n + 1)!)' Dir; aynı grafik basitçe kaydırılmıştır. Büyüme yine de aynı ... Bu durumda biri kesinlikle büyük olsa da büyüme farklı mı? karmaşıklığın önem verdiği bu değil mi?
matty-d

3
@JackWu ama çoğu insan n yerine nlogn ile yüz milyonlarca kaydı sıralamak zorunda kalana kadar gerçekten umursamıyor :)
CB

4
Aslında, n! = o((n+1)!)asimptotik olarak kesinlikle daha yavaş büyür.
chepner

16
Bunun karmaşıklık teorisi ile hiçbir ilgisi olmadığını, sadece aymptotiklerle ilgili olduğunu unutmayın. Ayrıca, bu tür sorular muhtemelen Bilgisayar Bilimi konusunda daha iyidir .
Raphael

Yanıtlar:


231

OBu soruyu cevaplamak için büyük O'nun ( ) resmi tanımına gitmeniz gerekecek .

Tanım, yalnızca ve eğer sınır varsa yani sonsuz değilse f(x)aittir . Kısacası bu, bir sabitin var olduğu anlamına gelir , öyle ki, değeri asla daha büyük olmaz .O(g(x))limsupx → ∞ (f(x)/g(x))Mf(x)/g(x)M

Sorunuz durumunda izin verin ve bırakın . Sonra ise hala sonsuz büyüyecek olan. Dolayısıyla ait değildir .f(n) = n ⋅ 2ng(n) = 2nf(n)/g(n)nf(n)O(g(n))


5
Tanımı biraz daha kolay okumak için buraya
Alden

3
Resmi olarak konuşursak, sınırını alamazsınız O(f(x)/g(x)); big-O bildirimi, değerini sınırlayabileceğiniz tek bir işlev için değil, bir dizi işlev için kısaltmadır. Ancak, eğer varsa bunu gösterebileceğiniz doğru olduğunu düşünüyorum . f(x) = O(g(x))lim(x->infinity) f(x)/g(x)
chepner

44
Sınırın olması gerekmez; oran sadece yeterince büyük x için bir sabitle sınırlanmalıdır. Örneğin, 2 + sin (x) O (l) 'dir, ancak (2 + sin (x)) / 1 bir sınıra x-> sonsuzluk olarak yaklaşmaz.
user2357112 Monica

2
Tanım lim supyerine ile doğru olur lim.
David Eisenstat

11
@IvayloStrandjev, kısa açıklamanızın yanlış olduğunu lütfen unutmayın. Bu x, tüm değerleri için değil, yeterince büyük bir değer için doğru olmalıdır x.
K.Steff

85

Bunun n⋅2ⁿdaha büyük olduğunu görmenin hızlı bir yolu , değişken değişikliği yapmaktır. Bırakın m = 2ⁿ. Sonra n⋅2ⁿ = ( log₂m )⋅m(her iki tarafında 2 tabanına göre logaritması alınarak m = 2ⁿverir n = log₂m) ve kolayca gösterebilirim m log₂mdaha hızlı büyür m.


3
Teşekkür ederim! Bence en iyi cevap bu. Resmi tanımlara dayanan kanıtlar doğrudur, ancak üstesinden gelmek için bir tür engeliniz varsa, çok rahat ve tanıdık bir benzetme işi en iyi ve en hızlı şekilde yapacaktır.
John P

1
Aptalca soru, nedir lg? Baz 2'de logaritma?
Pierre Arlaud

3
Tembel bir kısaltma. Bilgisayar biliminde, temel 2 anlamına gelir çünkü çoğunlukla böl ve ele geçir stratejilerinden kaynaklanır. Büyük O gösterimlerinde, her şeyi temsil edebilir, çünkü bir sayının baz-x logaritması, x ve y'den bağımsız olarak yalnızca sabit bir faktörle taban-y logaritmasından farklıdır.
chepner

3
Retrospektte, lgasimptotik çalışma sürelerini tartışırken en yaygın olarak kullanılan baz agnostik kullanım yerine, bir baz-10 logaritması için ISO notasyonu olduğunu not etmeliyim . Bkz en.wikipedia.org/wiki/Logarithm#Particular_bases
chepner

Tamam, tabii, ama neden m log m'nin m'den daha hızlı büyüdüğünü anlamıyorum, n 2 ^ n 2 ^ n'den daha hızlı büyür.
djechlin

10

Bunun n⋅2ⁿiçinde olmadığına katılıyorum O(2ⁿ), ancak üstün kullanım sınırının her zaman sahip olmadığı için daha açık olması gerektiğini düşündüm.

: Büyük-O biçimsel tanımı gereği f(n)olduğunu O(g(n))sabitleri mevcut ise c > 0ve n₀ ≥ 0herkes için böyle n ≥ n₀Elimizdeki f(n) ≤ c⋅g(n). f(n) = n⋅2ⁿVe için böyle bir sabitin bulunmadığı kolayca gösterilebilir g(n) = 2ⁿ. Ancak, bu gösterilebilir g(n)içindedir O(f(n)).

Başka bir deyişle, n⋅2ⁿalt sınır tarafından sınırlanmıştır 2ⁿ. Bu sezgisel. Her ikisi de üstel olsa da ve bu nedenle çoğu pratik koşulda eşit derecede kullanılmasa da, aynı düzende olduklarını söyleyemeyiz, çünkü 2ⁿzorunlu olarak daha yavaş büyür n⋅2ⁿ.


f(n) = 2*2^nSanırım demek istedin n*2^n?
tobias_k

4

Bundan n⋅2ⁿdaha hızlı büyüdüğünü söyleyen diğer cevaplarla tartışmıyorum 2ⁿ. Ama n⋅2ⁿbüyümek hala sadece üsteldir.

Algoritmalar hakkında konuştuğumuzda, genellikle zaman karmaşıklığının büyüdüğünün üstel olduğunu söyleriz. Yani, biz olarak kabul 2ⁿ, 3ⁿ, eⁿ, 2.000001ⁿ, veya bizim n⋅2ⁿüstel büyür ile karmaşıklık aynı grup olması.

Biraz matematiksel bir anlam vermek için, f(x)böyle bir sabit varsa c > 1, katlanarak büyüyecek (daha hızlı değil) bir fonksiyon düşünürüz .f(x) = O(cx)

İçin n⋅2ⁿsabit cbüyük herhangi bir rakam olabilir 2diyelim alımı, 3. Sonra:

n⋅2ⁿ / 3ⁿ = n ⋅ (2/3)ⁿve bu daha az 1herhangi n.

Böylece 2ⁿdaha yavaş büyür n⋅2ⁿ, son olarak daha yavaş büyür 2.000001ⁿ. Fakat üçü de katlanarak büyüyor.


Son örnekte, n * 2 ^ n, 2.000001 ^ n'den n = 34.726.000'e kadardır. Bu noktada 2 ^ n, 10 milyondan fazla basamağı olan bir sayıdır, bu yüzden gerçekten önemli değil ...
gnasher729

1
@ gnasher729 Sadece f (n) olarak atlayabileceğimiz bir sabittir ve c * f (n) big-O açısından aynı karmaşıklığa sahiptir. örneğin 40'000'000 * 2.000001 ^ n hemen n * 2 ^ n'den büyük. Ama haklısın, gerçekten önemli değil, üstel büyümelere çarptığımızda gerçekten önemli olmadığını söyleyebilirim (sadece n'nin küçük değerlerini elde etmedikçe).
Andrey

2

"İkincisi birinciyle aynı sırada mı? Oradaki ek n çarpımı önemli mi?" Bunlar iki farklı sorusu olan iki farklı sorudur.

n 2 ^ n asimptotik olarak 2 ^ n'den daha hızlı büyür. Bu soru cevaplandı.

Ancak "A algoritması 2 ^ n nanosaniye alırsa ve B algoritması n 2 ^ n nanosaniye alırsa, ikinci / dakika / saat / gün / ay / yıl içinde bir çözüm bulabildiğim en büyük n nedir? cevaplar n = 29/35/41/46/51/54 ve 25/30/36/40/45/49. Uygulamada çok fazla fark yok.

Her iki durumda da T zamanında çözülebilen en büyük sorunun büyüklüğü O (ln T) 'dir.

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.