2010-02-04 22 views
1

En supposant n = B-A + 1, je dois déduire la relation de récurrence de cet algorithme:Trouver la relation de récurrence de cet algorithme?

void recurringalgorithm(int *a, int A, int B){ 
    if (A == B){ 
    for (int j=0;j<B;j++){ 
     cout<<a[j]; 
    } 
    cout<<endl; 
    return; 
    } 
    for (int i=A;i<B;i++){ 
    dosomething(a[A],a[i]); 
    recurringalgorithm(a,A+1,B); 
    dosomething(a[A],a[i]); 
    } 
} 

aide?

+0

Cette question est de devoirs ou une entrevue? Et êtes-vous sûr que c'est (a, A + 1, B) 'sans impliquer' i'? – kennytm

+0

c'est un problème de devoirs, et oui, c'est A + 1, pas A + i. – zebraman

+0

On dirait que 'n' devrait être' B-A + 1' plutôt que 'A-B + 1' puisque, en regardant l'algorithme,' A' et 'B' sont respectivement utilisés comme début et fin. –

Répondre

4

Supposons que la complexité de votre algorithme récursif est h(A,B).

À partir de votre code, vous pouvez diviser h en 2 cas:

h(A,B) = { complexity-of-if-branch   if A = B 
     { complexity-of-rest-of-the-code otherwise 

La "complexité-de-si-branche" est trivial. Pour la "complexité du reste du code", puisqu'il implique recurringalgorithm, vous devrez à nouveau inclure h.

Par exemple, si la fonction est définie comme

function hh(A,B) { 
    for (var i = A+1; i < B; ++ i) 
     hh(i, B); 
} 

Ensuite, la complexité sera

hh(A,B) = hh(A+1, B) + hh(A+2, B) + ... + hh(B-1, B) 

Vous pouvez comparer avec votre code de généraliser.

(BTW, la complexité est h(A,B) = O(B * (B-A)!))

+0

merci, donc la complexité-de-si-branche est négligeable dans le calcul de la complexité globale big-o? – zebraman

+0

@zebraman: Non, la "complexité-de-si-branche" est responsable du facteur "B" dans 'O (B * (B-A)!)'. – kennytm

+0

Chaque fois que je vois un "!" dans une complexité, je pleure ... c'est chanceux ce ne sont que des devoirs! –