¿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)
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