Log (n!) = Θ (n · log (n))?


218

Bu günlüğü ( n !) = Θ ( n · log ( n )) göstereceğim .

Bir ipucu bir üst ile bağlanmış göstermelidir verildi , n , n ile bağlanmış düşük gösterir ( n / 2) ( n / 2) . Bu bana öyle sezgisel gelmiyor. Neden böyle olsun? Kesinlikle n n'yi n · log ( n ) ' ye nasıl dönüştüreceğimizi görebiliyorum (yani bir denklemin her iki tarafını da kaydedebilirim), ama bu biraz geriye doğru çalışıyor.

Bu sorunu çözmek için doğru yaklaşım ne olabilir? Özyineleme ağacını çizmeli miyim? Bu konuda özyineli bir şey yok, bu yüzden olası bir yaklaşım gibi görünmüyor.


1
Gerçekten "as n -> ∞"
MartW

2
Eğlenceli egzersiz: harmonik serilerin 1/1 + 1/2 + 1/3 + 1/4 + ... sonsuzluğa saptığını göstermek için benzer numarayı kullanın.
Yoo

10
Bu cs.stackexchange.com'da olmamalı mı?
CodyBugstein

5
@CodyBugstein, cs.stackexchange.com, soru sorulduğunda geri dönmedi
MrMartin

Yanıtlar:


303

Bunu hatırla

log(n!) = log(1) + log(2) + ... + log(n-1) + log(n)

Üst sınırı alabilirsiniz

log(1) + log(2) + ... + log(n) <= log(n) + log(n) + ... + log(n)
                                = n*log(n)

Ve toplamın ilk yarısını attıktan sonra benzer bir şey yaparak alt sınırı elde edebilirsiniz:

log(1) + ... + log(n/2) + ... + log(n) >= log(n/2) + ... + log(n) 
                                       = log(n/2) + log(n/2+1) + ... + log(n-1) + log(n)
                                       >= log(n/2) + ... + log(n/2)
                                        = n/2 * log(n/2) 

5
Bu üst sınır için çok güzel bir kanıttır: log (n!) = Log (1) + ... + log (n) <= n log (n) => log (n!) = O (n log n ). Bununla birlikte, alt sınırı (ve sonuç olarak büyük tetha) kanıtlamak için muhtemelen Stirling Yaklaşımı'na ihtiyacınız olacaktır.
Mehrdad Afshari

33
Alt sınır için Sterling'in yaklaştırılmasına gerek yoktur. log (n!) = log (1) + ... + log (n)> = log (n / 2) + ... + log (n)> = n / 2 * log (n / 2) = Omega (n günlüğü n).
Keith Randall

2
@ Keith: Henüz anlamadım. Siz (ya da birisi) "log (n / 2) + ... + log (n)" nin "..." kısmında benim için birkaç terim daha genişletebilir misiniz? Teşekkürler!
j_random_hacker

6
@j_random_hacker: log(n/2) + log(n/2 + 1) + ... + log(n - 1) + log(n)(şartlarının daha büyük yarısı log(n!)). Aslında soruyu okudum ve ipucunun soruda belirtildiğini gördüm. Temel olarak, (n/2)^(n/2) <= n! <= n^n=> log((n/2)^(n/2))<=log(n!)<=log(n^n)=>Θ(n/2 * log(n/2))<=log(n!)<=Θ(n*log(n))
Mehrdad Afshari

4
bu açıklama kabul edilen cevaba benzer, ancak biraz daha detayı var: mcs.sdsmt.edu/ecorwin/cs372/handouts/theta_n_factorial.htm
gayavat

40

Bunun kabul edilmiş bir yanıtı olan çok eski bir soru olduğunun farkındayım, ancak bu cevapların hiçbiri aslında ipucunun önerdiği yaklaşımı kullanmıyor.

Bu oldukça basit bir argüman:

n! (= 1 * 2 * 3 * ... * n), n her biri eşit veya daha küçük bir sayı çarpımıdır n. Bu nedenle, nsayıların çarpımından daha azdır n; yani n^n.

Sayıların yarısı - yani n/2n!Üründeki - bu değerden büyük veya eşittir n/2. Bu nedenle onların ürünü, n/2hepsine eşit sayıların çarpımından daha büyüktür n/2; yani (n/2)^(n/2).

Sonucu oluşturmak için günlükleri alın.


9
Bu aslında kabul edilen cevaptaki günlük sürümü ile aynıdır, ancak daha önce değil logaritmayı alır. (daha açık bir şekilde ipucu kullanır)
hugomg

14

resim açıklamasını buraya girin

Maalesef, stackoverflow üzerinde LaTeX sözdizimini nasıl kullanacağımı bilmiyorum.


1
Bu harika bir açıklama! Bunu adım 7'ye kadar takip edebilirim, ancak daha sonra adım 7 ile adım 8 arasında gerçekleşen matematiğin kodunu çözemiyorum ... :-(
Z3d4s

3
@ Z3d4s 7. adımdaki argüman temel olarak, sağ taraftaki ilk terimin baskın terim olması ve bu nedenle log (n!) 'Nin n log (n) ile yakınlaştırılabilmesi veya n log (n) düzeni büyük O gösterimi O (n * log (n)) ile ifade edilir.
random9

1
@ Z3d4s 7-8 dönüşüm adımlarının n logn == log (n ^ n) dediği ve burada sınırın gösterilmesi için ilk terimin her zaman daha büyük değerleri kontrol edebileceğiniz ikinci terimden daha büyük olduğunu söyleyebilir ve big-O karmaşıklığını ifade etmek için daima hepsinin egemen maddesini ele alacağız. Böylece n logn büyük O zamanına katkıda bulunur.
Shiv Prakash


7

Alt sınır için,

lg(n!) = lg(n)+lg(n-1)+...+lg(n/2)+...+lg2+lg1
       >= lg(n/2)+lg(n/2)+...+lg(n/2)+ ((n-1)/2) lg 2 (leave last term lg1(=0); replace first n/2 terms as lg(n/2); replace last (n-1)/2 terms as lg2 which will make cancellation easier later)
       = n/2 lg(n/2) + (n/2) lg 2 - 1/2 lg 2
       = n/2 lg n - (n/2)(lg 2) + n/2 - 1/2
       = n/2 lg n - 1/2

lg (n!)> = (1/2) (n lg n - 1)

Her iki sınırı birleştirmek:

1/2 (n lg n - 1) <= lg (n!) <= N lg n

(1/2) 'den daha büyük alt sınır sabiti seçerek, parantez içindeki -1 değerini telafi edebiliriz.

Böylece lg (n!) = Teta (n lg n)


2
Bu genişletilmiş türetme gereklidir, çünkü "bir şey"> = n / 2 * lg (n / 2), önceki yorumlardan birinde belirtilen omega (n lg n) ile eşit değildir.
Vivek Anand Sampath

Bu, bir alt sınır bulmaya çalışırken "(1/2) 'den daha sabit bir SMALLER" okumalıdır. (1/2) 'den daha küçük herhangi bir sabit, c, sonunda yeterince büyük bir n için c n logn <= (1/2) n * logn- (1/2) n yapar.
Matthew

3

Size yardımcı olmak için Mick Sharpe sizi terk etti:

Türetilmesi oldukça basittir: bkz. Http://en.wikipedia.org/wiki/Logarithm -> Grup Teorisi

log (n!) = log (n * (n-1) * (n-2) * ... * 2 * 1) = log (n) + log (n-1) + ... + log (2 ) + günlük (1)

N'yi düşünün N'yi sonsuz büyük . Sonsuz eksi bir nedir? veya eksi iki? vb.

log (inf) + log (inf) + log (inf) + ... = inf * log (inf)

Ve sonra inf'yi n olarak düşünün .



1

Bu yardımcı olabilir:

e ln (x) = x

ve

(l m ) , n = l , m * n,

3
Aslında, bu yanlış: 1 ^ (m ^ n)! = 1 ^ (m n) olmalı (1 ^ m) ^ n = 1 ^ (m n)
Pindatjuh

Errr Yukarıdaki yorumda 1 yerine L demek istiyorum.
Ocak'ta Pindatjuh

1 ^ (m ^ n)
yazamadı

1
@CodyBugstein: Sorunu çözmek için bir düzenleme yapıldı, yıllar sonra hatanın tarihte gizlendiği zaman yorum yaptınız
Ben Voigt

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.