Tengo un mundo que consiste en una serie de rectángulos con diferentes anchuras y compensaciones, pero alturas idénticas. También he puntos, algunos de los cuales son capaces de fronteras cruz del rectángulo y otros no se están moviendo. Teniendo en cuenta este hecho, estoy almacenando sus posiciones como coordenadas globales y no en relación con el rectángulo (ver puntos rojos).
Necesito una manera rápida para buscar el rectángulo de un punto determinado está dentro de su coordenada X. Para la imagen de arriba, los dos puntos rojos volverán los rectángulos negros y amarillos, respectivamente. La solución que tenía hebillas originales en virtud de un número muy grande de rectángulos:
Rect getRectFor(float x) {
float totalSum = 0.0f;
// For each rect (in order)
for (Rect rect : rects) {
// Add the rect's width
totalSum += rect.getWidth();
// If the end of the rect is beyond us, return
if (totalSum >= x) {
return rect;
}
}
// We are beyond the end of all rects
return null;
}
¿Existe algún método o estructuras de datos que se desempeñan mejor en este escenario y permitirían que se deben realizar miles de búsquedas por segundo?
La manera más rápida de lo que puedo pensar es crear una matriz:
E[0] = 0
E[i] = x-coordinate indicating where the i-th ends.
En su ejemplo, sería E = {0, 100, 150, 225, 350, 375, ...}
.
Para encontrar la posición de cualquier punto, sólo puede realizar una búsqueda binaria en esta matriz, dando O (lg (n)) vez que por consulta.
Sólo para ayuda, añadió una pequeña pieza de código:
int bs(int[] m, int l, int r, int dot){
int i = (l + r) / 2;
if(m[i - 1] < dot && dot < m[i]) return i;
if(m[i - 1] == dot) return max(1, i - 1);
if(m[i] == dot) return i;
if(dot < m[i]) return bs(m, l, i, dot);
else return bs(m, i + 1, r, dot);
}
Los argumentos de bs
son:
m
: La matriz.l
: Siempre se debe usar 1.r
: Se debe utilizar siempren - 1
, donden
es la longitud dem
.dot
: La coordenada x del punto.
Ejemplo: si usted quiere encontrar la posición de su segundo punto (en la posición x = 230), debe llamar
bs(E, 1, E.length - 1, 230)
y volvería 4.
Si intenta ejecutar este método con una coordenada x que es OutSite los límites de la matriz (por ejemplo, corresponde a los últimos extremos del rectángulo en posición x = 100 y se busca un punto en x = 101), cosas extrañas pueden suceder.