Tengo un problema y una solución OK-ish. Espero que haya una mejor solución por ahí.¿Cuál es el mejor algoritmo para encontrar la suma de todos los elementos en una matriz secundaria arbitraria
El problema
que tienen una matriz con alrededor de 200.000 números enteros. Dado dos índices, i1 e i2, necesito calcular la suma de todos los elementos entre i1 e i2. Cada número entero en la matriz está entre 1 y 4 inclusive. Por ejemplo:
a = [1, 3, 2, 4, 3, 2, 4, 1];
subsection_sum(a, 0, 3); // returns 6: (1 + 3 + 2)
Esta operación se realizará alrededor de 200.000 veces, por lo que tiene que ser bastante rápido. Un contador simple en un ciclo for es O (n), y demasiado lento. La matriz nunca se modifica después de la construcción, por lo que está bien tener una etapa de procesamiento previo relativamente costosa.
Mi mejor solución hasta ahora
Este algoritmo trabaja en O (log n) tiempo:
primera almohadilla de la matriz original con ceros hasta su longitud es una potencia de dos. Luego, divida la matriz en dos partes iguales y almacene la suma de cada una. Luego divida la matriz en cuartos y almacene la suma de cada uno. Luego octavos. Continúa haciendo esto hasta que la matriz se divida en secciones de 2 elementos de largo. Para la matriz de 8 elementos anteriormente, esto da dos pasos:
halves = [(a[0] + a[1] + a[2] + a[3]), (a[4] + a[5] + a[6] + a[7])]
quarters = [(a[0] + a[1]), (a[2] + a[3]), (a[4] + a[5]), (a[6] + a[7])]
Entonces da dos índices, ahora es posible trabajar a cabo la subsection_sum en O (log n). Por ejemplo, subsection_sum (a, 2, 7) == trimestres [1] + mitades [1].
Perfecto, no puedo creer que haya pensado en una solución tan compleja y haya pasado por alto la simple. Gracias. –
La misma solución que la mía, ¡pero síguelo! +1 –