Mam listę BookingDateRange gdzie BookingDateRange jest:znaleźć wszystkie date pokrywających się zakresów z danej listy zakresy dat
public class BookingDateRange {
private Date fromDate;
private Date toDate;
//getters & setters of properties
}
Wymagania:
- Muszę znaleźć ewentualne data pokrywa się na liście BookingDate podaj dateRangeList
- Jeśli tak, znajdź wszystkie pary zakresów dat, które się pokrywają, powiedz Lista ciągów mówi, że zachodzą na siebieDataPairs
Przykład1:
input1:
dateRangeList [0] = 23 grudnia 2012- 27 grudnia 2012
dateRangeList [1] = 14 grudnia 2012 - 25 grudnia 2012
dateRangeList [2] = 1 stycznia 2012 r. - 23 stycznia 2012 r.
Wyjście 1:
isOverlappingDates = true
overlappingDatePairs = [0_1]
Przykład2:
input2:
dateRangeList [0] = 23 grudnia 2012- 27 grudnia 2012
dateRangeList [1] = 1 stycznia 2012 r. - 23 stycznia 2012 r.
OUTPUT2:
isOverlappingDates = fałszywe
overlappingDatePairs = []
Proponowane rozwiązanie:
/**
* 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;
}
złożoność tego rozwiązania jest to O (N^2). Czy możliwa jest lepsza złożoność? Nie można uzyskać algorytmu o większej złożoności.
Znalazłem kilka rozwiązań w SO. Ale żaden z nich nie był w stanie całkowicie zaspokoić tego wymogu.
Dzięki Shikha
Wygląda na to, że złożoność O (N^2) nie O (2^n) ** Pod **: D – gtgaxiola
@gtgaxiola Ups .. typo .. Tak .. O (N^2). Edytowane w pytaniach. –