Quiero calcular previamente algunos valores para cada combinación en un conjunto de combinaciones. Por ejemplo, al elegir 3 números del 0 al 12, voy a computo algún valor para cada uno:Calcular rango de una combinación?
>>> for n in choose(range(13), 3):
print n, foo(n)
(0, 1, 2) 78
(0, 1, 3) 4
(0, 1, 4) 64
(0, 1, 5) 33
(0, 1, 6) 20
(0, 1, 7) 64
(0, 1, 8) 13
(0, 1, 9) 24
(0, 1, 10) 85
(0, 1, 11) 13
etc...
quiero para almacenar estos valores en una matriz de modo que, dada la combinación, puedo calcular y obtener su el valor. Por ejemplo:
>>> a = [78, 4, 64, 33]
>>> a[magic((0,1,2))]
78
¿Cuál sería magic
?
Inicialmente pensé simplemente almacenarlo como una matriz tridimensional de tamaño 13 x 13 x 13, por lo que puedo indizarlo fácilmente de esa manera. Si bien esto está bien para 13 elegir 3, esto tendría demasiada sobrecarga para algo como 13 elegir 7.
No quiero usar un dict porque eventualmente este código estará en C, y una matriz sería mucho más eficiente de todos modos.
ACTUALIZACIÓN: También tengo un problema similar, pero el uso de combinaciones con repeticiones, por lo que cualquier respuesta sobre cómo obtener el rango de los sería muy apreciada =).
ACTUALIZACIÓN: Para dejar en claro, estoy tratando de ahorrar espacio. Cada una de estas combinaciones en realidad se indexa en algo que ocupa mucho espacio, digamos 2 kilobytes. Si tuviera que usar una matriz de 13x13x13, sería 4 megabytes, de los cuales solo necesito 572 kilobytes usando (13 elijo 3) puntos.
En permutaciones, combinaciones y particiones, el término de la literatura es "rango" en lugar de "índice". Buscar "algoritmo de combinación de rango". :) Esta es una página realmente buena: http://home.hccnet.nl/david.dirkse/math/rank/ranking.html –
Cuando dice "No quiero usar un dict" ... ¿lo hace? ¿Quiere decir que no quiere usar una tabla hash? –
@belisarius: sí, disculpe la terminología de Python – Claudiu