2015-09-19 27 views
5

Sorunun boyutunu, (O (log (n)) ile uğraştığınız belirli bir kesime ayarladığınızda bölünmüş olduğunu biliyorum. Bununla birlikte, bunu yaptıktan sonra 1 tekrarlı arama olduğunda onlar kafam karıştı. Örneğin buradaki fonksiyonda, bir üsün değerini hesaplayacağız.Özyineleme işlevi için Big O

public static long pow(long x, int n) 
    { 
     if(n==1) 
     return x; 
     if(isEven(n)) 
     return pow(x,n/2) * pow(x,n/2); 
     else 
     return pow(x*x, n/2) * x 
     } 

Analiz yaptıktan sonra, çalışma zamanına O (N) eşittir. Doğrumuyum? Zamanınız için teşekkürler.

+1

not. 'A = pow (x, n/2); a * a; ' – karakfa

+0

geri dön Evet, biliyorum ama kitap, bu algoritmanın verimliliğini sorarak kavramı anlayıp anlamadığımızı görmek için test ediyordu. O (N) 'yi düzeltebilir miyim? –

cevap

4

Evet, en az en kötü durum analizi'un altında haklısınız.

Bazı doğal k için, n = 2^k için, stop deyimine erişme dışında durumun her zaman doğru olduğunu ve yineleme işlevinin iki kez çalıştırılacağını unutmayın. olduğunun tespit edilmesi

, analiz için yeterlidir:

X bazı sabittir
T(n) = T(n/2) + T(n/2) + X 

, (diğer tekrarlanan aramalara görmezden eğer her tekrarlayan çağrı, işin sürekli miktarda alır). ile master theorem case 1 itibaren

:

f(n) = X 
a = 2, b = 2, c = 0 (since X is in O(n^0)=O(1)) 

Ve c=0 < 1 = log_2(2) beri durumda 1 için koşullar geçerlidir ve biz T(n) olan işlevi sonucuna varabiliriz Theta(n^log_2(2)) = Theta(n)

Ortalama vaka analizi:

Ortalama durumda, eşit dağıtılmış bir sayı n ile, ikilideki bitlerin yarısı temsil eder. Bu sayının oranı artar (1) ve yarı 'aşağı' olur (0). 2'ye bölünüp yana

temelde aritmetik kaydırma doğru olduğunu ve en az önemli bit 0 olması durumunda ve bu ortalama karmaşıklığı fonksiyonudur anlamına geliyorsa koşul isEven(n) doğrudur: Yani

T(n) = 0.5 T(n/2) + 0.5 * 2 T(n/2) + X = 0.5 * 3 * T(n/2) + X 
    = 1.5 * T(n/2) + X 

a = 3/2, b = 2, c = 0

:
T(n) = 3/2 T(n/2) + X 

Örnek 1 halen (sabit X varsayılarak) uygular

Bu gerçekten tüm aritmetiği O(1) varsayar:

ve Theta(n^log_1.5(2))~=Theta(n^0.58)

Hızlı Not ortalama vaka karmaşıklığını olsun. Eğer durum bu değilse (çok büyük sayılar), T(n) tanımındaki sabitlik yerine karmaşıklıklarını koymanız ve yeniden analiz etmeniz gerekir. Her böyle bir işlemin, alt-lineer olduğu (sayıyı temsil eden bitlerin değil) olduğu varsayılırsa, ana teorinin 1. hali hala geçerli olduğundan, sonuç Theta(n) olarak kalır. (Ortalama durum için, 'dan daha iyi olan herhangi bir işlev için

+0

Yanıtın nesi var? Lütfen beni aydınlat. – amit

+0

Cevabınızı reddetmedim, ancak ikinci durumda, özellikle de p'nin doğal bir sayı olduğu n = 2^p - 1 ile ilgili bazı bilgiler eklerseniz bunu geliştirebileceğinizi düşünüyorum. Eğer dikkatle bakarsanız, bu tür bir durum anında 2^(p-1) - 1'e düşürülür. –

+0

@ LajosArpad Bu, nadiren de olsa "en iyi durum analizi" olacaktır. Bu cevap Kötü vaka analizini ve algoritmanın ortalama durum analizini gösterir. Her ikisi de doğrusaldır. – amit

2

Varun olarak gösterilen sonuç değişmeyecektir, kısmen haklısınız.iki vaka görelim:

  1. pow(x, n/2) iki defa hesaplanır beri n bile, o zaman sadece, önemli ölçüde optimize etmeden ikiye görevi bölünüyor ise.

  2. n bir tek ise, özel bir ayrıştırma durumunuz vardır. x x 0 xx ile değiştirilir, bu da x 0xx yeni tabanı oluşturur, böylece x * x yeniden hesaplanır.

    (3 * 3 * 3 * 3) * (3 *: her şeyi yapıyor daha küçük yapımları tekrarlamak daha kolaydır çünkü İlk durumda

biz, hafif bir optimizasyon var 3 * 3 * 3) (3 * 3 * 3 * 3 * 3 * 3 * 3) 'e göre hesaplanması daha kolaydır, bu yüzden ilk durum, üretimin birleştirici bir işlem olduğu gerçeğini kullanarak hesaplamayı biraz geliştirir. İlk durumda yürütülen üretim sayısı azaltılmaz, ancak hesaplama yapılma şekli daha iyidir.

İkinci durumda, önemli optimizasyonlarınız var. Bunu n = (2^p) - 1 olarak düşünelim. Bu durumda, sorunu n = ((2^p - 1) - 1)/2 = ((2^p) - 2)/2 = (2^(p-1)) - 1 adresindeki bir soruna indirgiyoruz. Yani, p doğal bir sayı ve n = (2^p) - 1 ise, o zaman onu yarıya indiriyorsunuz. Yani, algoritma en iyi senaryoda n = (2^p) - 1 logaritmiktir ve n = 2^p en kötü durum senaryosunda doğrusaldır.

1

Genellikle, en kötü durum zaman karmaşıklığını analiz ederiz, isEven (n) öğesi true olduğunda gerçekleşir. Bu durumda, T (n) pow zaman karmaşıklığı (x, n) anlamına gelir

T(n) = 2T(n/2) + O(1) 

sahiptir.

T (n) Big-O gösterim formunu almak için Master theorem, Case 1'u uygulayın. Yani: Eğer ilk sonucu yeniden kullanarak ikinci özyinelemeli çağrı azaltabilir

T(n) = O(n) 

+0

Bu benim cevabım, ancak kanıt ve daha az ayrıntı olmadan. – amit

+0

@amit Cevabınızın ayrıntılarına henüz bakmadım.Algoritma Analizi dersinde öğrendiklerimi yazdım. –