Estoy buscando un algoritmo para segmentar una secuencia de números positivos en n subsecuencias, tales que la desviación estándar de la suma de los números en cada subconjunto se minimiza.Qué algoritmo usar para segmentar una secuencia de números en n subconjuntos, para minimizar la desviación estándar de la suma de los números en cada subconjunto
El orden de los números en cada subsecuencia tiene que ser el mismo que el orden en la secuencia original
Por ejemplo:
Supongamos que tengo una secuencia {1,1,1,1,1 , 1,10,1} que quería segmentar en 2 subsecuencias.
Creo que la solución óptima sería {1,1,1,1,1,1}, {10,1}.
La suma de la primera subsecuencia es 6, la suma de la segunda subsecuencia es 11
La desviación estándar de los dos números es ~ 3.5, que creo que es la más baja posible.
Supongamos que tengo una secuencia {4,1,1,1,1,6} que quiero segmentar en 3 subsecuencias.
creo que la solución óptima sería {4}, {1,1,1,1}, {6}
La suma de las subsecuencias es 4, 4, y 6.
La desviación estándar de los 3 números es ~ 1.15, que creo que es el más bajo posible.
El mejor algoritmo que pude encontrar fue encontrar la suma acumulativa de cada uno de los números en la secuencia, y segmentar la secuencia en cada intervalo de [totalSum/numSubsequences].
Por ejemplo, dada la secuencia {4,1,1,1,1,6}, las sumas acumulativas de los números de cada secuencia son {4,5,6,7,8,14}. El total de todos los números en la secuencia es 14, así que, dado que quiero 3 subsecuencias, debería segmentar la secuencia cuando el total alcance 14/3 = 4.66 y 2 * 14/3 = 9.333333.
Sin embargo, no hay un lugar real en la secuencia donde el total acumulado es igual a 4.66 - el primer total acumulado es 4, y el siguiente total acumulado es 5. ¿Debería redondear o debería redondear? En este caso, redondeando a 4 da la solución óptima, pero ese no es siempre el caso. Lo mejor que puedo pensar es probar cada combinación de redondeo hacia arriba y hacia abajo, pero eso da como resultado la complejidad O (2^numSubsecuencias).
Este parece ser el tipo de cosa que tendría un algoritmo preexistente para aplicar, sin embargo, mi Google me ha fallado. Conozco el Partition Problem, que es NP-completo, pero que trata de conjuntos desordenados y secuencias no ordenadas.
Cualquier ayuda sería apreciada.
¿Qué hay de {1,1,1,1,1,1,1,10,2}? ¿Podría dividirlo en {1,1,1,1,1,1,1,2} y {10} y obtener una desviación estándar más baja? No especificó el orden de las subsecuencias, o si es importante. – florin
Sí, los pedidos deben conservarse. Las subsecuencias deben ordenarse de modo que cuando se concatenan, sean iguales a la secuencia original. Entonces su ejemplo no funcionará, porque no puede concatenar las subsecuencias nuevamente para formar la secuencia original. Otra forma de pensarlo es encontrar n-1 'puntos de división' en la secuencia original. – kwyjibo
¿Cuánto dura la secuencia? – EvilTeach