Asn ile nüks ilişkisini parametre olarak çözme


18

Tekrarlamayı düşünün

T(n)=nT(n)+cn

bazı pozitif sabit c ile için ve T ( 2 ) =n>2cT(2)=1 .

Yinelemeleri çözmek için Master teoremini biliyorum, ancak bu ilişkiyi kullanarak nasıl çözebileceğimizden emin değilim. Karekök parametresine nasıl yaklaşıyorsunuz?


5
Master teoremi burada uygulanamaz; n olarak yazılamaznb . Başka ne denedin?
Raphael

@Raphael: Sübstitüsyon yöntemini denedim, ancak hangi değeri yerine koymam gerektiğini seçtim.
arayıcı

1
Peki ya "nüksü birkaç kez ortaya çıkarın , bir patern gözlemleyin , çözümü tahmin edin ve kanıtlayın "?
Raphael

Bu türden bir ilk karşılaşma, belki burada bazı yardımlar doğanın gelecekteki problemlerini kolaylıkla çözmeme yardımcı olabilir.
arayıcı

Üstat Teoremden bahsettiğinizden, bu ilişkiyi asimtotik sınırlar için çözmeniz gerektiğini ve kapalı form ifadesine gerçekten ihtiyaç duymadığınızı varsayıyorum. Aşağıda verildiğinde, asimtotik karmaşıklığı veren kapalı form ifadesini bulmak için bazı iyi çözümler vardır. Bununla birlikte, sadece asimtotik karmaşıklığa ihtiyacınız varsa, analiz daha basittir. Sorun örneğiniz için hoş ve sezgisel bir çözümle, asimtotik karmaşıklıkları bulma konusunda iyi bir açıklama için buraya bir göz atın .
Paresh

Yanıtlar:


9

Raphael'in önerisini kullanacağız ve tekrarını ortaya çıkaracağız. Aşağıda, tüm logaritmalar temel 2'dir.

buradaβ(n),nile başlamak ve 2'ye ulaşmak için kaç kez karekök almak zorunda olduğunuzdur.β(n)=loglogn. Bunu nasıl görebiliyorsun? Şunu düşünün: n

T(n)=n1/2T(n1/2)+cn=n3/4T(n1/4)+n1/2cn1/2+cn=n7/8T(n1/8)+n3/4cn1/4+2cn=n15/16T(n1/16)+n7/8cn1/8+3cn=n2T(2)+cnβ(n).
β(n)β(n)=loglogn Yani 2'ye ulaşmak için kare kökünü kaç kez almanız gerektiği1
n=2lognn1/2=212lognn1/4=214logn
,loglogn'dir. Yani özyineleme çözümücnloggünlüğün+112tlogn1loglogn. Bunu kesinlikle titiz hale getirmek için, ikame yöntemini kullanmalı ve işlerin nasıl yuvarlandığına çok dikkat etmeliyiz. Zamanım olduğunda, bu hesaplamayı cevabıma eklemeye çalışacağım.cnloglogn+12n

"Kare kök kez almak zorunda " - acemi bir şey görmesi beklenebilir mi? Ayrıca, sonucunuz Yuval'ınkine uymuyor; sadece asimptotik olarak mı tasarlanmıştır? loglogn
Raphael

@Raphael: Yuval bir hata yaptı, şimdi düzeltildi. Cevabımdaki karekökü açıklayacağım.
Peter Shor

3
Başka bir fikir tekrarlama aldığını görmek şudur: karekökünü alarak n sen ikili gösterimi için gerekli basamak yarıya n . Yani girişinizin w = log n bitine ihtiyacı vardır ve özyinelemenin her seviyesi için kelime boyutunu 2'ye bölersiniz. Bu nedenle log w = log log'dan sonra durursunuzO(loglogn)nnw=logn adımlarından. logw=loglogn
A.Schulz

10

Yorumunuzda, oyuncu değişikliğini denediğinizi, ancak takıldığınızı belirttiniz. İşte işe yarayan bir türev. Motivasyon biz kurtulmak istiyorum olmasıdır sağ taraftaki çarpan, bizeU(n)=U(n. Bu durumda, işler çok iyi çalışıyor:U(n)=U(n)+something

Şimdi günlüklere geçerek işleri daha da basitleştirelim (

T(n)=n T(n)+nso, dividing by n we getT(n)n=T(n)n+1and letting n=2m we haveT(2m)2m=T(2m/2)2m/2+1
). İzin Vermek lgn=(1/2)lgn Aha! Bu,S(m)=Θ(lgmçözeltisi ile iyi bilinen bir tekrarlamadır.
S(m)=T(2m)2mso our original recurrence becomesS(m)=S(m/2)+1
geri dönersek , T (
S(m)=Θ(lgm)
, o zaman n = 2 m (ve böylece m = lg n ) ile TT()n=2mm=lgn Yani T ( n
T(n)n=Θ(lglgn)
T(n)=Θ(nlglgn) .

6

Eğer yazarsanız sahip T ( m ) = mm=logn T(m)=m2T(m2)+c2m  .

Artık özyineleme ağacının sırasına sahip olduğunu biliyorsunuz ve yine her seviyede O ( 2 m ) olduğunu görmek zor değil , bu yüzden toplam çalışma süresi: O ( ( log m ) 2 m ) , burada sonucuna O ( n, günlük günlük n ) için n .O(logm)O(2m) O((logm)2m) O(nloglogn) n

Tüm gördüğünüzde veyan an, logaritmayı kontrol etmek iyidir.nab,a<b 

Not: Tabii ki, onları atladığımdan daha fazla ayrıntı içermelidir.


2

Raphael'in önerisini takip edelim, : T ( n ) = T ( 2 2 k )n=22k

T(n)=T(22k)=22k1T(22k1)+c22k=22k1+2k2T(22k2)+c(22k+22k)==22k1+2k2++20T(220)+c(22k+22k++22k)=22k1+ck22k=(cloglogn+1/2)n.

Edit: Thanks Peter Shor for the correction!


How did you come up with 22k? Note for OP: "" is not a proof, you'll have to provide that still (usually by induction).
Raphael

@Raphael: It's nearly a proof. You just need to show that it's also correct for numbers not of the form 22k.
Peter Shor

Actually, the recurrence is only well-defined for numbers of the form 22k, since otherwise, at some point n wouldn't be an integer, and you'll never reach the base case T(2).
Yuval Filmus

1
If this recurrence actually came from an algorithm, it would probably really be something more like T(n)=nT(n)+cn.
Peter Shor

1

Unravel the recurrence once as follows:

T(n)=n T(n)+n=n1/2(n1/4 T(n1/4)+n1/2)+n=n11/4 T(n1/4)+2n.

Continuing the unraveling for k steps, we have that:

T(n)=n11/2kT(n1/2k)+kn.

These steps will continue until the base case of n1/2k=2. Solving for k we have:

n1/2k=2logn=2kk=loglogn.

Substituting k=loglogn into the unraveled recurrence, we have

T(n)=n2T(2)+nloglogn.

2
Could you rewrite your picture to MathJax? We discourage images with text as the answers.
Evil

1
@PKG it seems like your edit is slightly different and also you explain steps, maybe you could answer on your own.
Evil
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.