Para un juego que estoy haciendo Tengo una situación en la que tengo una lista de números – dice [7, 4, 9, 1, 15, 2 ] (llamado A
para esto) – y otra lista de números – dice [11, 18, 14, 8, 3] (llamado B
) – me fue proporcionado. El objetivo es encontrar todas las combinaciones de números en A
que se suman a un número en B
. Por ejemplo:Buscar conjunto de números en una colección que se suma a un número en otra
- 1 + 2 = 3
- 1 + 7 = 8
- 2 + 9 = 11
- 4 + 7 = 11
- 1 + 2 + 4 + 7 = 14
- 1 + 2 + 15 = 18
- 2 + 7 + 9 = 18
... y así sucesivamente. (Para este propósito, 1 + 2
es lo mismo que 2 + 1
.)
Para listas pequeñas como esta, es trivial simplemente usar fuerza bruta en las combinaciones, pero estoy enfrentando la posibilidad de ver miles a decenas de miles de estos números y usará esta rutina repetidamente a lo largo de la vida útil de la aplicación. ¿Hay algún tipo de algoritmo elegante disponible para lograr esto en un tiempo razonable con una cobertura del 100%? En su defecto, ¿hay algún tipo de heurística decente que pueda encontrar que pueda darme un conjunto "lo suficientemente bueno" de combinaciones en un tiempo razonable?
Estoy buscando un algoritmo en pseudo-código o en cualquier lenguaje bastante popular y legible (tenga en cuenta el "y" allí ....;) o incluso una descripción en inglés de cómo se implementaría esto tipo de búsqueda.
Editado para añadir:
montón de buena información proporcionada hasta el momento. ¡Gracias amigo! Resumiendo por ahora:
- El problema es NP-Completo, por lo que no hay forma de obtener la fuerza bruta para obtener el 100% de precisión en un tiempo razonable.
- El problema se puede ver como una variante de los problemas subset sum o knapsack. Existen heurísticas bien conocidas para ambos que pueden ser adaptables a este problema.
¡Que sigan las ideas! ¡Y gracias de nuevo!
¿Hay un límite superior de elments o un tamaño de número? Si te mantienes bajo, es posible calcularlo sin esperar demasiado. – Thariama
Debería ser posible utilizar algo de heurística si existen ciertas restricciones que pueden aprovecharse. Por ejemplo, ¿el tamaño y/o los miembros de cualquiera de las matrices A y B son constantes? ¿O tal vez el rango del número que es probable que encuentre es limitado? – tathagata
@tathagata: los números nunca excederán 30 ni serán inferiores a 1. Esa sería una restricción. –