Quel est le moyen le plus efficace de tester les deux entier plages de chevauchement?
Donné deux inclusive entier intervalle [x1:x2] et [y1:y2], où x1 ≤ x2 et y1 ≤ y2, ce qui est le moyen le plus efficace pour tester s'il existe un chevauchement des deux gammes?
Une simple mise en œuvre est comme suit:
bool testOverlap(int x1, int x2, int y1, int y2) {
return (x1 >= y1 && x1 <= y2) ||
(x2 >= y1 && x2 <= y2) ||
(y1 >= x1 && y1 <= x2) ||
(y2 >= x1 && y2 <= x2);
}
Mais je m'attends il y a des moyens plus efficaces pour le calcul de ce.
Quelle méthode serait la plus efficace en termes de minimum d'opérations.
- Peut-être il est intéressant de noter liés pour certains - stackoverflow.com/q/17138760/104380
Vous devez vous connecter pour publier un commentaire.
Ce qui signifie pour les plages à se chevauchent? Cela signifie qu'il existe un certain nombre de C qui est dans les deux gammes, c'est à dire
et
Maintenant, si l'on peut supposer que les plages sont bien formées (de sorte que x1 <= x2 et y1 <= y2), alors il est suffisant de le tester
x1 <= y2 && y1 >= x2
, non?C
?Donné deux plages [x1,x2], [y1,y2]
min(x2,y2) - max(x1,y1)
fournit la quantité de chevauchement dans le cas où vous avez besoin que.Cela peut facilement fausser un cerveau humain normal, j'ai donc trouvé une approche visuelle pour être plus facile à comprendre:
le Explication
Si deux gammes sont "trop gras" à insérer dans un slot, c'est exactement la somme de la largeur de deux, puis ils se chevauchent.
Pour des gammes
[a1, a2]
et[b1, b2]
ce serait:a2 - a1 + b2 - b1
risque de déborder. Pour le corriger, de changer la formule demax(a2, b2) - a2 - b2 < min(a1, b1) - a1 - b1
, ce qui simplifie àmax(a1, b1) < min(a2, b2)
, d'économie d'arithmétique et d'éviter tout débordements (c'est l'AXE des Laboratoires de réponse ci-dessous). Dans le cas spécial où vous savezb2-b1=a2-a1
, un autre utile réarrangement de FloatingRock la formule estmax(a2, b2) - min(a1, b1) - (b2 - b1) < a2-a1
, qui devientabs(b1-a1) < a2 - a1
.Grande réponse de Simon, mais pour moi, il était plus facile de penser à la situation inverse.
Quand dois-2 gammes se chevauchent pas? Ils ne se chevauchent pas quand l'un d'eux commence après les autres, on finit:
Maintenant, il est facile à exprimer quand ils ne se chevauchent:
Soustrayant le Minimum de l'extrémité de la chaîne à partir de la valeur Maximale du début semble faire l'affaire. Si le résultat est inférieur ou égal à zéro, nous avons un chevauchement. Cette visualise bien:
Je suppose que la question a été au sujet de la manière la plus rapide, pas le plus court de code. La version la plus rapide d'avoir à éviter les branches, nous pouvons donc écrire quelque chose comme ceci:
pour les cas simple:
ou, pour ce cas:
x1 <= y2 && y1 <= x2
n'ont pas de branches en elle soit, en supposant un raisonnablement compétente du compilateur et de l'architecture du PROCESSEUR (même en 2010). En fait, sur x86, le code généré est fondamentalement identique pour la simple expression et le code dans cette réponse.Si nous avions affaire à deux gammes de
[x1:x2]
et[y1:y2]
, naturel /anti-ordre naturel des plages, dans le même temps où:x1 <= x2 && y1 <= y2
oux1 >= x2 && y1 >= y2
alors vous pouvez l'utiliser pour vérifier:
elles sont recouvertes <=>
(y2 - x1) * (x2 - y1) >= 0
où seulement quatre opérations sont impliqués:
Vous avez le plus efficace de représentation déjà - c'est le strict minimum qui doit être vérifié, sauf si vous savez certainement que x1 < x2 etc, puis utiliser les solutions d'autres, ont apporté.
Vous devriez noter que certains compilateurs fait l'optimiser pour vous, en les retournant dès qu'un de ces 4 expressions de retourner la valeur true. Si l'on retourne true, le résultat final - alors que les autres vérifications peuvent être simplement ignoré.
Si quelqu'un est à la recherche d'un one-liner qui calcule le chevauchement:
Si vous voulez un couple moins d'opérations, mais un couple de plusieurs variables:
Pense que dans le chemin inverse: comment faire les 2 gammes se chevauchent pas? Compte tenu de
[x1, x2]
, puis[y1, y2]
devrait être à l'extérieur[x1, x2]
, c'est à dire,y1 < y2 < x1 or x2 < y1 < y2
qui est équivalent ày2 < x1 or x2 < y1
.Par conséquent, la condition de faire les 2 gammes de chevauchement:
not(y2 < x1 or x2 < y1)
, ce qui est équivalent ày2 >= x1 and x2 >= y1
(même avec la accepté de répondre par Simon).Mon cas est différent. je veux vérifier deux plages de temps de chevauchement. il ne devrait pas être une unité de temps se chevauchent. ici, c'est d'Aller de mise en œuvre.
Cas de Test
vous pouvez le voir il y a XOR le modèle dans les limites de la comparaison
Voici ma version:
Sauf si vous êtes l'exécution de certains de haute performance de la gamme checker sur des milliards de largement espacés entiers, nos versions devraient effectuer de la même façon. Mon point est, c'est la micro-optimisation.