У меня есть 2 набора интервалов, как:Учитывая число, с каким интервалом оно вписывается?
xCoords: (0, 60], (60, 120], (120, 180] ...
yCoords: (0, 60], (60, 120], (120, 180] ...
Размер каждого интервала гарантированно будет то же самое, но размер в интервале xCoord
не должны быть размером с yCoord
интервала , (Я мог бы сделать эту жертву в общности, если это необходимо для оптимизации, но это возможно в будущем я могу хотеть различные yCoord
и xCoord
размеров.)
Я также данные пары, такие как:
(x, y)
(0, 60)
(123, 52)
(34, 196)
Sample ответы на вышесказанное:
(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
как самые медленные части функции.
Причина это работает, потому что INT/INT = INT, с усечением десятичных знаков. Когда вы снова умножаете делитель, вы получаете нижнюю границу. –
Целочисленное подразделение отлично подходит для оптимизации многих подобных подпрограмм. :) - Однако, если размеры вашей ячейки меняли каждый шаг и не были постоянными, вам, вероятно, пришлось бы вернуться к более сложному алгоритму (хотя все же были бы намного лучшие варианты, чем цикл ...) –