Para buscar todos los rangos de fechas superpuestas de una lista dada de Rangos de fechas

Tengo una lista de BookingDateRange donde BookingDateRange es:

    public class BookingDateRange {
        private Date fromDate;
        private Date toDate;

        //getters & setters of properties
   }

Requisito:

Necesito encontrar si alguna fecha se superpone en la Lista de ReservasDate say dateRangeListEn caso afirmativo, busque todos los pares de rangos de fechas que se superponen, por ejemplo, Lista de cadenas, se superpongan, Parejas

Ejemplo 1:

Entrada1:

dateRangeList [0] = 23 dic 2012- 27 dec 2012

dateRangeList [1] = 14 dic 2012 - 25 dic 2012

dateRangeList [2] = 1 jan 2012 - 23 jan 2012

Salida1:

isOverlappingDates = true

overlappingDatePairs = [0_1]

Ejemplo 2:

Entrada2:

dateRangeList [0] = 23 dic 2012- 27 dec 2012

dateRangeList [1] = 1 jan 2012 - 23 jan 2012

Salida2:

isOverlappingDates = false

overlappingDatePairs = []

Mi solución :

/**
 * Checks if any of the dates overlap.
 *
 * @param dateRangeList the date range list
 * @param overlappingDatePairs the overlapping date pairs where overlappingDatePair is stored in the format dateRange1_dateRange2
 * @return true, if any of the dates overlap.
 */

public static boolean isOverlappingDates(
            List<BookingDateRange> dateRangeList,
            List<String> overlappingDatePairs) {

    boolean isOverlap = false;

    for (int index1 = 0; index1 < dateRangeList.size(); index1++) {
        for (int index2 = index1 + 1; index2 < dateRangeList.size(); index2++) {

            // Overlap exists if (StartA <= EndB) and (EndA >= StartB)

            Date startA = dateRangeList.get(index1).getFromDate();
            Date endA = dateRangeList.get(index1).getToDate();
            Date startB = dateRangeList.get(index2).getFromDate();
            Date endB = dateRangeList.get(index2).getToDate();

            boolean isStartABeforeEndB = (startA.compareTo(endB)) < 0;
            boolean isEndAAfterStartB = (endA.compareTo(startB)) > 0;

            boolean isCurrentPairOverlap = false;

            isCurrentPairOverlap = isStartABeforeEndB && isEndAAfterStartB;

            if (isCurrentPairOverlap) {
                overlappingDatePairs.add(index1 + "_" + index2);
                isOverlap = true;
            }
        }

    }
    return isOverlap;

    }

La complejidad de este enfoque es O (n ^ 2). ¿Es posible una mayor complejidad? No se pudo llegar a un algoritmo con una mayor complejidad.

Encontré algunas soluciones en SO. Pero ninguno de ellos pudo satisfacer completamente el requisito.

Gracias shikha

Respuestas a la pregunta(3)

Su respuesta a la pregunta