J'ai 2 ensembles d'intervalles, comme:Étant donné un nombre, à quel intervalle appartient-il?
xCoords: (0, 60], (60, 120], (120, 180] ...
yCoords: (0, 60], (60, 120], (120, 180] ...
La taille de chaque intervalle est garanti d'être le même, mais la taille d'un intervalle xCoord
ne doit pas être la taille d'un intervalle yCoord
. (Je pouvais faire ce sacrifice en généralité, si nécessaire pour l'optimisation, mais il est possible à l'avenir je veux différentes yCoord
et xCoord
tailles.)
I paires ont aussi donné, telles que:
(x, y)
(0, 60)
(123, 52)
(34, 196)
échantillon réponses pour ce qui précède:
(lowerBoundX, lowerBoundY)
(0, 60)
(120, 0)
(0, 180)
Quelle est la manière la plus optimale de trouver à quel intervalle ils appartiennent? Voici ce que j'ai actuellement:
// we'll need to be able to access these outside of the loops
uint minWidth = 0;
uint minHeight = 0;
for (minWidth = 0; minWidth + cellWidth <= xToFind; minWidth += cellWidth) ;
for (minHeight = 0; minHeight + cellHeight <= yToFind; minHeight += cellHeight) ;
A la fin de cette boucle, minWidth
représente la limite inférieure de l'intervalle x
et minHeight
représente la limite inférieure de l'intervalle y
. Donc, puis-je trouver un moyen plus rapide de le faire? Un profileur identifie les boucles for
comme les parties les plus lentes de la fonction.
La raison pour laquelle cela fonctionne est parce que int/int = int, avec les décimales étant tronqués. Lorsque vous multipliez le diviseur, vous obtenez la limite inférieure. –
Division entière est idéal pour optimiser un grand nombre de ces types de routines. :) - Cependant, si les tailles de vos cellules changeaient à chaque pas et n'étaient pas constantes, vous auriez probablement besoin de revenir à un algorithme plus élaboré (bien qu'il y ait encore de bien meilleures options que de boucler ...) –