He hecho una pregunta similar (pero no idéntica) en SO aquí https://stackoverflow.com/questions/5984102 pero las respuestas no son tan útiles porque necesito una indexación muy rápida (y quizás mi pregunta no fue lo suficientemente clara).
Precalculé un montón de valores que tardaron días en ser calculados (con la carga repartida en varios ordenadores). Ahora tengo una enorme tabla de búsqueda a la que tengo que acceder con frecuencia y ese acceso tiene que ser lo más rápido posible.
Básicamente, tengo un problema así: He precalculado los valores de C(38,6) ( es decir . 2 760 681 valores) que ahora se almacenan en una gran tabla de búsqueda. La memoria no es un problema. La precomputación no es un problema. El "orden" no es un problema y puedo reordenarlo como quiera.
Además, C(38,6) es sólo un ejemplo, podría estar necesitando también C(42,7), etc.
Cuando hice la precomputación, básicamente hice un bucle como este (el código real es más complicado para la carga necesaria para ser repartida entre varias máquinas y para el cálculo real no están aquí, pero aquí está la carne de ella):
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int k = j + 1; k < n; k++) {
for (int l = k + 1; l < n; l++) {
for (int m = l + 1; m < n; m++) {
for (int o = m + 1; o < n; o++) {
...
}
}
}
}
}
}
Lo único que importa es tener el tiempo de búsqueda más rápido posible.
Tengo i,j,k,l,m y n todo en [0..37] (o [1..38], no importa) y necesito acceder al elemento precalculado correspondiente en mi enorme matriz de búsqueda lo más rápido posible.
¿Existe una fórmula cerrada para esto que sea rápida de calcular?
Lo que tengo ahora es una búsqueda binaria: mi i será siempre inferior a j , j inferior a k etc. A continuación, he creado un índice arbitrario haciendo:
(i + 1) * (n exp 5) + (j + 1) * (n exp 4) + (k + 1) * (n exp 3) + (l + 1) * (n exp 2) + (m + 1) * n + o
Esto es probablemente exagerado, pero garantiza que no haya colisiones. A continuación, hago una búsqueda binaria en ese índice y encuentro donde se almacena el valor precalculado.
Esto es bastante rápido, pero me preguntaba si hay una forma más rápida de "alcanzar" mi índice precalculado.
Básicamente porque no conozco la combinatoria enumerativa lo suficientemente bien estoy precalculando mi propio índice y usando ese índice para hacer una búsqueda binaria. Esto es rápido pero estoy buscando algo más rápido, como una fórmula cerrada (dudo que algo haciendo "enumeraciones" y i++ o cosas así serían más rápidas que esas pocas multiplicaciones para calcular ese índice + la búsqueda binaria).
Creo que la complejidad de mi método es log(n) pero no estoy seguro.