Que ce soit le plus efficace ou plus rapide, je ne suis pas sûr, mais voici comment je le ferais. S'il s'est avéré être un goulot d'étranglement, alors et seulement alors je chercherais à optimiser davantage:
Vous vous assurez que la première plage commence plus tôt (ou en même temps) en permutant les plages si nécessaire. Ensuite, vous pouvez détecter un chevauchement si l'autre début de plage est inférieur ou égal à la première plage (si les plages sont incluses, contenant les heures de début et de fin) ou inférieur à (si les plages incluent le début et exclusif de fin).
En supposant compris aux deux extrémités, il n'y a que quatre possibilités dont l'un est un non-recouvrement:
|----------------------| range 1
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 no overlap
Le critère d'évaluation de la gamme 2 n'entre pas en elle. Ainsi, en pseudo-code:
def doesOverlap (r1,r2):
if r1.s > r2.s:
swap r1, r2
if r2.s > r1.e:
return false
return true
Si les plages sont inclus au début et exclusif à la fin, il vous suffit de remplacer >
avec >=
dans la deuxième déclaration if
:
|----------------------| range 1
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 no overlap
|---> range 2 no overlap
Vous Limitez considérablement le nombre de vérifications que vous devez effectuer car vous supprimez la moitié de l'espace problème en vous assurant que la plage 1 ne démarre jamais après la plage 2.
essayer - http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap –