Algoritmos | Análisis de Algoritmos (Recurrencias) | Pregunta 3

¿Cuál es la complejidad temporal en el peor de los casos de la siguiente implementación del problema de suma de subconjuntos?

// Returns true if there is a subset of set[] with sun equal to given sum
bool isSubsetSum(int set[], int n, int sum)
{
   // Base Cases
   if (sum == 0)
     return true;
   if (n == 0 && sum != 0)
     return false;
   
   // If last element is greater than sum, then ignore it
   if (set[n-1] > sum)
     return isSubsetSum(set, n-1, sum);
   
   /* else, check if sum can be obtained by any of the following
      (a) including the last element
      (b) excluding the last element   */
   return isSubsetSum(set, n-1, sum) || 
          isSubsetSum(set, n-1, sum-set[n-1]);
}

(A) O(n * 2^n)
(B) O(n^2)
(C) O(n^2 * 2^n)
(D) O(2^n)

Respuesta: (D)
Explicación: Siguiente es la recurrencia para la implementación dada del problema de suma de subconjuntos

T(n) = 2T(n-1) + C1
T(0) = C1

Donde C1 y C2 son algunas constantes específicas de la máquina.

La solución de recurrencia es O(2^n)

Podemos verlo con la ayuda del método del árbol de recurrencia.

           C1
       /       \
    T(n-1)     T(n-1) 


                    C1
                /       \
              C1           C1
           /     \        /    \
      T(n-2)  T(n-2)   T(n-2)  T(n-2)

                    C1
                /       \
              C1           C1
           /     \        /    \
          C1     C1      C1     C1
        /   \   /  \    /  \   /  \

       
If we sum the above tree level by level, we get the following series
T(n) = C1 + 2C1 + 4C1 + 8C1 + ...
The above series is Geometrical progression and there will be n terms in it.
So T(n) = O(2^n)    

Cuestionario de esta pregunta

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *