Supongamos que tengo un intervalo (a, b), y un número de subintervalos {(un i, b i)} i cuya unión es todo (a, b). ¿Existe una manera eficiente de elegir un subconjunto de cardinalidad mínima de estos subintervalos que todavía cubre (a, b)?Encontrar la cobertura mínima de un intervalo con subintervalos
Respuesta
Un algoritmo ambicioso que comienza en aob siempre da la solución óptima.
Prueba: considere el conjunto S a de todos los subintervalos que cubren a. Claramente, uno de ellos debe pertenecer a la solución óptima. Si reemplazamos con un subintervalo (un máximo, b máximo) de S un cuyo derecho de punto final b máximo es máxima en S un (alcanza más a la derecha), el intervalo descubierto restante (b max, b) será un subconjunto del intervalo restante de la solución óptima, por lo que puede cubrirse con no más subintervalos que el intervalo descubierto análogo de la solución óptima.Por lo tanto, una solución construida a partir de (a max, b max) y la solución óptima para el intervalo restante (b max, b) también será óptima.
Por lo tanto, simplemente comience en a y elija iterativamente el intervalo que se extiende más a la derecha (y cubriendo el final del intervalo anterior), repita hasta que pulse b. Creo que puede elegir el siguiente intervalo en log (n) si almacena los intervalos en un árbol de intervalos aumentados.
¿Podría explicarnos: "el intervalo restante no cubierto (bmax, b) será un subconjunto del intervalo restante de la solución óptima"? – jfs
Creo que esta solución funciona, y es mejor que la mía. – Artelius
@JFS: Supongamos que la solución óptima comienza con un intervalo (ai, bi) que cubre (a, bi) y deja (bi, b) sin cubrir. De la definición de (amax, bmax) tenemos que bmax> = bi, entonces (bmax, b) es un subconjunto (subintervalo) de (bi, b). –
Suena como la programación dinámica.
Aquí es una ilustración del algoritmo (asumen intervalos están en una lista ordenada por hora de finalización):
//works backwards from the end
int minCard(int current, int must_end_after)
{
if (current < 0)
if (must_end_after == 0)
return 0; //no more intervals needed
else
return infinity; //doesn't cover (a,b)
if (intervals[current].end < must_end_after)
return infinity; //doesn't cover (a,b)
return min(1 + minCard(current - 1, intervals[current].start),
minCard(current - 1, must_end_after));
//include current interval or not?
}
sino que también debe implicar el almacenamiento en caché (memoisation).
'minCard()' tiene como objetivo obtener una cardinalidad mínima, pero la pregunta requiere un subconjunto con cardinalidad mínima. – jfs
Simplemente sería una extensión de este algoritmo que también realiza un seguimiento de qué subconjunto se utilizó para formar ese valor óptimo. – Artelius
@Artelius ¿Cuál es la complejidad de su algoritmo? –
¿Quiere decir que los subintervalos todavía se superponen de tal manera que (a, b) permanece completamente cubierto en todos los puntos?
Tal vez dividiendo los subintervalos en bloques básicos asociados con su origen, por lo que puede enumerar las opciones para cada intervalo de bloque básico que representa otras regiones cubiertas por el subintervalo también. Luego puede usar una búsqueda basada en cada subintervalo secundario y al menos asegurarse de que no queden espacios vacíos.
Entonces tendría que buscar ... de manera eficiente ... eso sería más difícil.
Podría eliminar cualquier colección de intervalos que estén completamente cubiertos por otro conjunto de números más pequeños y resolver el problema después del preprocesamiento.
¿No sería el mínimo para el conjunto mínimo de al menos la mitad? No estoy seguro.
Encontrado un link en un diario pero no pudo leerlo. :(
Esto sería un problema hitting set y se NP_hard en general.
No se pudo leer this tampoco, pero parece que tipo opuesto del problema.
no podía leer, pero otra link que menciona a intervalos de separarse.
Here es una referencia disponible en aleatorios algoritmos para GeometricOptimization problemas.
Página 35 de este pdf tiene un algoritmo voraz.
Página 11 de Karp (1972) menciones golpear-set y se cita mucho.
Google result. Investigar fue divertido, pero tengo que irme ahora.
Hay dos casos a considerar: Caso 1: No hay intervalos de solapamiento después del tiempo de finalización de un intervalo. En este caso, elija el siguiente intervalo con el tiempo de inicio más pequeño y el tiempo de finalización más largo. (amin, bmax). Caso 2: hay 1 o más intervalos de solapamiento con el último intervalo que está mirando. En este caso, la hora de inicio no importa porque ya has cubierto eso. Así que optimiza para el tiempo de finalización. (a, bmax).
Caso 1 siempre elige el primer intervalo como el primer intervalo en el conjunto óptimo también (la prueba es la misma que la proporcionada por @RafalDowgrid).
- 1. Encontrar la distancia mínima en una mesa
- 2. altura mínima para div o el intervalo con el elemento vacío
- 3. Encontrar la diferencia mínima entre elementos en una matriz
- 4. Encontrar una esfera delimitadora mínima para un tronco
- 5. Encontrar el intervalo entre dos java.util.date
- 6. Rellenar un polígono con la cantidad mínima de rectángulos
- 7. fracaso Maven para encontrar experto-plugins: maven-Cobertura-plugin
- 8. seleccionar filas con diferencia mínima
- 9. Excluir métodos de cobertura de código con Cobertura
- 10. Datos principales: tratando de encontrar la fecha mínima para un atributo en una entidad
- 11. Algoritmo para encontrar una 'ruta de expansión mínima'?
- 12. Algoritmo de anagrama con complejidad mínima
- 13. Encontrar la diferencia mínima entre cada elemento de un vector y otro
- 14. Cobertura del código con PHPUnitSeleniumTestcase
- 15. ¿Es posible encontrar cobertura de código en ColdFusion?
- 16. Cómo inicializo un intervalo de tiempo con segundos
- 17. ¿Cobertura de código con nUnit?
- 18. Averiguar cobertura de la prueba
- 19. Excluir métodos específicos de cobertura de código de cobertura?
- 20. ¿Cómo ver el informe de cobertura HTML con el complemento Cobertura Maven?
- 21. Cobertura de código/cobertura recomendada valores
- 22. Intervalo real de Scala, Intervalo int
- 23. Uso de Unity con configuración mínima
- 24. django: ejecutar pruebas con cobertura
- 25. Comprobar si un intervalo de fechas está dentro de un intervalo de fechas
- 26. Mysql DATE_ADD INTERVALO con campos de la tabla de MySQL
- 27. Pruebas unitarias lentas con Cobertura
- 28. exponenciación mínima de la cadena de adición
- 29. ¿Encontrar la fecha mínima y máxima en la matriz usando LINQ?
- 30. Medición de la cobertura de documentación con Javadoc y Ant
¿Está buscando el menor número de subintervalos, o el conjunto de subintervalos que tiene menos elementos (y por lo tanto, el menor número de duplicados)? –