J'ai besoin d'une idée pour un algorithme d'index/recherche efficace, et/ou structure de données, pour déterminer si un intervalle de temps chevauche zéro ou plusieurs intervalles de temps dans une liste, en gardant à l'esprit qu'un chevauchement complet est un cas particulier chevauchement partiel. Jusqu'à présent, je n'ai pas trouvé quelque chose de rapide ou élégant ...Comment trouver 1 ou plusieurs intervalles de temps partiellement entrecroisés dans une liste de quelques millions?
Considérons une collection d'intervalles avec chaque intervalle ayant 2 dates - début et fin.
Les intervalles peuvent être grands ou petits, ils peuvent se chevaucher partiellement ou pas du tout. Dans la notation Java, quelque chose comme ceci:
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
L'objectif est de trouver efficacement tous les intervalles qui se coupent partiellement un intervalle d'entrée nouvellement arrivé. C comme ArrayList cela pourrait ressembler à ...
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;
}
En parcourant la liste complète nécessite linéairement un trop grand nombre se compare à atteindre mes objectifs de performance. Au lieu de ArrayList, quelque chose de mieux est nécessaire pour diriger la recherche et minimiser le nombre de comparaisons.
Ma meilleure solution consiste à maintenir deux listes triées en interne et à effectuer 4 recherches binaires et une itération de liste pour chaque requête. De meilleures idées?
Note de l'éditeur: intervalles de temps sont un cas particulier en utilisant des segments linéaires le long d'un axe unique, que ce soit X, ou dans ce cas, T (pour le temps).
C'était rapide et précis. Merci beaucoup! –