Aquí hay un problema mucho más simple
El problema es este: dado un conjunto (o conjunto múltiple) de enteros, ¿hay un subconjunto no vacío cuya suma es cero? Por ejemplo, dado el conjunto {−7, −3, −2, 5, 8}, la respuesta es sí porque el subconjunto {−3, −2, 5} suma a cero. El problema es NP-completo.
Fuentes: problema de suma de subconjuntos
El algoritmo más conocido tiene una complejidad temporal de O (2 ^ N / 2), buena suerte con una solución eficiente para el problema anterior
- ¿Cuáles son los requisitos previos para comprender el algoritmo de transformación rápida de Fourier para la multiplicación?
- Sea n el número de factores de 2014, incluido 1 y en sí mismo. ¿Cuántos números de dos dígitos también tienen n factores?
- Quiero imprimir todos los números primos hasta un número primo dado máx. Tengo dos métodos: el tamiz de Eratóstenes y el método trivial. ¿Cómo comparo sus tiempos de ejecución? ¿Qué método es más rápido?
- ¿Cuál es el número de arreglos para la siguiente secuencia, dada la restricción?
- ¿Es el operador Sobel un filtro lineal?
Editar: Esto podría ayudarte a vencer a O (2 ^ N)
El algoritmo divide arbitrariamente los N elementos en dos conjuntos de N / 2 cada uno. Para cada uno de estos dos conjuntos, almacena una lista de las sumas de los 2 N / 2 subconjuntos posibles de sus elementos. Cada una de estas dos listas se ordena. El uso de un algoritmo de clasificación de comparación estándar para este paso llevaría tiempo O (2 N / 2 N ). Sin embargo, dada una lista ordenada de sumas para k elementos, la lista puede expandirse a dos listas ordenadas con la introducción de un elemento ( k + 1) st, y estas dos listas ordenadas pueden fusionarse en el tiempo O (2 k ). Por lo tanto, cada lista se puede generar en forma ordenada en el tiempo O (2 N / 2). Dadas las dos listas ordenadas, el algoritmo puede verificar si un elemento de la primera matriz y un elemento de la segunda matriz suman s en el tiempo O (2 N / 2). Para hacer eso, el algoritmo pasa a través de la primera matriz en orden decreciente (comenzando en el elemento más grande) y la segunda matriz en orden creciente (comenzando en el elemento más pequeño). Siempre que la suma del elemento actual en la primera matriz y el elemento actual en la segunda matriz sea mayor que s , el algoritmo se mueve al siguiente elemento en la primera matriz. Si es menor que s , el algoritmo se mueve al siguiente elemento en la segunda matriz. Si se encuentran dos elementos con suma s , se detiene.