2010-02-27 8 views
1

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.

Répondre

3

Si les tailles X sont constants, vous pouvez trouver ce beaucoup plus efficace:

public int GetPosition(int size, int coord) 
{ 
    int index = coord/size; 
    return index * size; 
} 

Ensuite, vous pouvez faire:

lowerBoundX = GetPosition(xSize, xCoord); 
lowerBoundY = GetPosition(ySize, yCoord); 
+1

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. –

+0

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 ...) –

Questions connexes