Diferencia entre revisiones de «Problema de la suma de subconjuntos»

Contenido eliminado Contenido añadido
ArthurBot (discusión · contribs.)
m robot Añadido: simple:Subset sum problem
→‎Algoritmo de tiempo exponencial: naive aquí no es inocente sino simplista
Línea 24:
==Algoritmo de tiempo exponencial==
 
Hay varias maneras de resolver la suma de subconjuntos en tiempo exponencial sobre N. El algoritmo más inocentesimplista verificaría todos los posibles subconjuntos de N y, para cada uno de ellos, compararía la suma al total buscado. El tiempo de ejecución es de orden ''O(2<sup>N</sup>N)'', dado que hay ''2<sup>N</sup>'' subconjuntos y, para verificar cada subconjunto, tenemos que sumar ''N'' elementos.
 
Se conoce un mejor algoritmo de tiempo exponencial, que corre en tiempo de orden ''O(2<sup>N/2</sup>N)''. El algoritmo parte los N elementos en dos conjuntos de N/2 elementos cada uno. Para cada conjunto, calcula la suma de todos los ''2<sup>N/2</sup>'' posibles subconjuntos y las almacena en un vector de longitud ''2<sup>N/2</sup>''. Entonces ordena estos dos vectores, lo que se puede hacer en tiempo ''O(2<sup>N/2</sup>N)''. Una vez que los vectores están ordenados, el algoritmo puede verificar si un elemento del primer vector más un elemento del segundo dan el total ''s'' buscado en tiempo ''O(2<sup>N/2</sup>)''. Para hacer esto, el algoritmo pasa por el primer vector en orden decreciente (empezando en el elemento más grande) y por el segundo en orden creciente (empezando por el más pequeño). Cuando la suma del elemento en turno de los dos vectores es mayor que ''s'', el algoritmo se mueve al siguiente elemento en el primer vector, cuando es menor que ''s'' se mueve al siguiente elemento en el segundo vector. Si se encuentra ''s'' el algoritmo termina.