Esta es una especie de pregunta de edición de distancia, y es muy fácil. Estoy completamente muerto de cerebro sobre este tema y no puedo entenderlo hasta ahora.
Dada una serie de números, por ejemplo
[3, 1, 1, 1]
¿Cómo podría uno convertir más eficientemente todos los números en el mismo número, con el número mínimo de "movimientos"? Por "mover" se entiende agregar o eliminar uno de un número.
En el ejemplo anterior, los movimientos más eficientes serían:
[1, 1, 1, 1]
Esto requeriría 2 movimientos, reduciendo el primer número dos veces.
No puedo encontrar la mejor manera de averiguarlo, dados conjuntos mucho más grandes de cientos de números.
Originalmente intenté calcular el número promedio redondeado (suma de todos divididos por la longitud), y luego reducirlos al promedio calculado, pero el ejemplo anterior rompió esto, requiriendo 4 movimientos en lugar de 2.
Supongo que podría imaginar:
- La media,
- El modo,
- La mediana
y obtenga la distancia de edición de cada uno de ellos, eligiendo la distancia mínima. Sin embargo, no estoy seguro de que esto sea correcto en cada caso. ¿Cómo puedo yo saber?
fuente
Respuestas:
La respuesta es tomar la mediana. Una de las propiedades de la mediana es que minimiza la distancia L1 a cada elemento. (Para dar sentido al artículo de Wikipedia, tome la distribución de probabilidad como la distribución uniforme sobre su serie original de números).
Este es el algoritmo que resuelve el problema (originalmente escrito por dc2 ):
fuente
Como menciona TCSGrad, dada una lista de enteros , está buscando el entero minimizando Es instructivo calcular : Cuando va de a , la cantidad va de a . Además, cambia los valores solo en los puntosx1,…,xn m
Supongamos además que todos son distintos y que es impar. Sea la mediana de . Entonces mientras , y entonces es el óptimo único. Si es par, un cálculo similar muestra que podemos elegir cualquier punto en el intervalo que conecta las medianas. Un razonamiento similar pero más elaborado muestra que cualquier mediana es óptima incluso cuando no son distintos. Por lo tanto, no hay necesidad de calcular en todo .xi n m xi δ(m+1)−δ(m)=1 δ(m)−δ(m−1)=−1 m n xi δ xi
fuente
El problema puede formularse como un problema de LP:
Dado un conjunto de números , resuelve el siguiente LP:n [a1,a2...an]
(Se eliminaron las restricciones en , que no eran necesarias como señaló Raphael)x
Una vez que se resuelve el LP, obtendrá un valor de correspondiente a la solución. Si es un entero, ya está listo; de lo contrario, redondee al entero más cercano.x x
EDITAR : Como se señaló en los comentarios, la función objetivo debe ser la suma de las diferencias absolutas. Para transformarlo nuevamente en un LP estándar, podemos reescribir el LP como:
sujeto a:
En la solución óptima, , y podemos obtener el valor de de la solución.a′i=|ai−x| ∀i x
fuente