2010-02-27 2 views
1

I는 같은 간격의 2 개 세트를 가지고숫자가 주어지면 어느 간격에 맞습니까?

xCoords: (0, 60], (60, 120], (120, 180] ... 
yCoords: (0, 60], (60, 120], (120, 180] ... 
각 구간의 사이즈는 동일하게 보장되는, 그러나 xCoord 간격의 크기는 yCoord 간격의 크기 일 필요는 없다

. (최적화를 위해 필요한 경우 나 일반성에 그 희생을 만들 수 있지만 그것은 미래에 내가 다른 yCoordxCoord 크기를 할 수 있습니다 가능합니다.)

I 등도 준 쌍 :

(x, y) 
(0, 60) 
(123, 52) 
(34, 196) 

샘플 위의 답변 :

(lowerBoundX, lowerBoundY) 
(0, 60) 
(120, 0) 
(0, 180) 

그들이 속하는 간격을 찾는 가장 적합한 방법은 무엇입니까? 여기에 내가 현재 가지고있는 것입니다 :이 루프의 끝에서

 // 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) ; 

, minWidth는 낮은 x 간격의 경계 나타내며, minHeight는 낮은 y 간격의 결합이다.

이렇게 빠른 방법을 찾을 수 있습니까? 프로파일 러는 함수의 가장 느린 부분으로 for 루프를 식별합니다. X의 크기가 일정한 경우

답변

3

, 당신은 훨씬 더 효율적이를 찾을 수 있습니다

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

은 그럼 당신은 할 수 있습니다 :이 작품

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

이유 때문에 INT/INT = INT, 십진수는 잘립니다. 당신이 약수를 다시 곱하면, 당신은 하한선을 얻습니다. –

+0

정수 부분은 이러한 종류의 많은 루틴을 최적화하는 데 적합합니다. :) - 그러나 셀 크기가 각 단계를 변경하고 상수가 아니라면보다 정교한 알고리즘으로 되돌려 야합니다 (루핑보다 훨씬 좋은 옵션이있을 수 있지만 ...) –

관련 문제