Necesito una idea para un algoritmo de búsqueda/índice eficiente y/o estructura de datos para determinar si un intervalo de tiempo se superpone a cero o más intervalos de tiempo en una lista, teniendo en cuenta que una superposición completa es un caso especial de superposición parcial. Hasta ahora no he encontrado nada rápido ni elegante ...¿Cómo encontrar 1 o más intervalos de tiempo parcialmente interseccionados en una lista de pocos millones?
Considere una colección de intervalos con cada intervalo que tiene 2 fechas: inicio y fin.
Los intervalos pueden ser grandes o pequeños, pueden superponerse entre sí parcialmente o no se pueden abrir. En la notación de Java, algo como esto:
interface Period
{
long getStart(); // millis since the epoch
long getEnd();
boolean intersects(Period p); // trivial intersection check with another period
}
Collection<Period> c = new ArrayList<Period>(); // assume a lot of elements
El objetivo es encontrar de manera eficiente todos los intervalos que se cortan parcialmente un intervalo de entrada recién llegado. Para c como un ArrayList esto podría parecerse a ...
Collection<Period> getIntersectingPeriods(Period p)
{
// how to implement this without full iteration?
Collection<Period> result = new ArrayList<Period>();
for (Period element : c)
if (element.intersects(p))
result.add(element);
return result;
}
Iterar a través de la lista entera requiere linealmente demasiados compara a cumplir mis objetivos de rendimiento. En lugar de ArrayList, se necesita algo mejor para dirigir la búsqueda y minimizar el número de comparaciones.
Mi mejor solución hasta el momento implica mantener dos listas ordenadas internamente y realizar 4 búsquedas binarias y alguna iteración de lista para cada solicitud. Alguna mejor idea?
Nota del editor: intervalos de tiempo son un caso específico que emplea segmentos lineales a lo largo de un solo eje, son los que la X, o en este caso, T (por tiempo).
Eso fue rápido y al grano. ¡Muchas gracias! –