Teniendo en cuenta una serie de diferentes anchos y un punto, encontrar el ancho que contiene el punto

Yorek B:

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

disposición mundo

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?

Daniel:

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 bsson:

  • m: La matriz.
  • l: Siempre se debe usar 1.
  • r: Se debe utilizar siempre n - 1, donde nes la longitud de m.
  • 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=373153&siteId=1
Recomendado
Clasificación