Durante una entrevista, me preguntaron lo siguiente: una aplicación de bienes raíces que enumera todas las casas que están actualmente en el mercado (es decir, en venta) dentro de una distancia determinada (por ejemplo, el usuario quiere encontrar todas las casas dentro de 20 millas), ¿Cómo diseñaría su aplicación (estructura de datos y alogiritmo) para construir este tipo de servicio?
¿Algunas ideas? ¿Cómo lo implementaría? Le dije que no sabía porque nunca había hecho nada relacionado con la geografía antes.
Probablemente, después de una respuesta, mencionan la indexación espacial , muy probablemente seleccionando una base de datos que proporciona indexación espacial de fábrica , pero también puede obtener algunos puntos al mencionar que se puede implementar en la aplicación si es necesario, por ejemplo, implementando una R -Tree (¿podría ser útil si la selección de la base de datos se arregla por otros motivos? Pero también demuestra que sabe cómo funcionan las bases de datos espaciales). La indexación espacial le permitirá obtener rápidamente un subconjunto de ubicaciones que caben dentro de un cuadro de búsqueda, puede refinarlo aún más calculando la distancia real (si es necesario, el rectángulo solo puede ser lo suficientemente bueno, por supuesto) para que cada uno realice una búsqueda verdadera círculo / elipse
Dado que es probable que las distancias sean de 20M o menos, probablemente esté BIEN asumiendo que una tierra plana calcule la distancia, aunque comenzará a ver errores notables hacia el extremo de 20M, si se necesitan rangos mucho más grandes con precisión, también necesitará comenzar a buscar modelos de mejor distancia para el mundo, por ejemplo, distancia de Haversine
también hay, por supuesto, una miríada de otros detalles que podrían discutirse, por ejemplo, diseño de interfaz de usuario, esquema de base de datos que podrían ser temas completos por derecho propio
A 20 millas, los errores debidos a un modelo de tierra plana serán insignificantes. De todos modos, cuando un usuario quiere ver una lista de casas dentro de las 20 millas de su oficina, no le importa si una casa que está a 20 millas y 10 yardas de distancia está incluida en los resultados.
Kevin Cline
1
de hecho, y si algunos falsos positivos no son importantes, entonces también puede omitir el cálculo de la distancia real y simplemente devolver el MBR
jk.
Una cosa que tengo curiosidad es: dada la gran cantidad de casas en venta, ¿las empresas (como Zillo tal vez?) Lo almacenan todo en una base de datos y simplemente siguen seleccionando? Me imagino que sería un gran éxito en el rendimiento y sería mucho más rápido almacenarlo todo en la memoria con una representación gráfica, tal vez una matriz o una lista de adyacencia y usar algoritmos de distancia para encontrar las casas más cercanas. ¿Qué piensas?
Paul Smith
@paulsmith No lo sé, pero sospecho que está en una base de datos espacial, una base de datos espacial probablemente usará una representación gráfica internamente de todos modos (lo más probable es un R-Tree como se discutió, pero hay otras opciones) la clave está siendo capaz de seleccionar solo los elementos en un rectángulo límite mínimo en primer lugar
jk.
8
Cuando se enfrenta a una pregunta como esta y simplemente no tiene experiencia en el dominio del problema, es bueno hacer un par de cosas.
Primero reconozca que no tiene experiencia específica en este dominio problemático.
En segundo lugar , explique cómo resolvería el problema.
Aunque no tengo experiencia específica cuando trabajo con búsquedas geográficas, estoy seguro de que existen algoritmos bien documentados y tecnologías existentes para resolver el problema. Los exploraría para obtener conocimiento de las soluciones comunes que están disponibles para mí y elegir la implementación en función de los requisitos del proyecto.
Tercero , siempre reduzca problemas como este a sus componentes básicos. Usted sabe que las ubicaciones en un mapa están distribuidas bidimensionalmente. Usted sabe que si recibe coordenadas arbitrarias x, y, la distancia a cada coordenada desde otra coordenada se calcula formando un triángulo y resolviendo la longitud desconocida. Es de esperar que también sepa que si se le pide que encuentre todas las coordenadas dentro de un cuadro delimitador, puede hacer esto simplemente calculando la extensión del cuadro que desea encontrar y utilizando una simple mayor que, menor que la lógica a lo largo de ambos ejes.
Por último , nunca he contratado a un desarrollador que parecía renunciar a las preguntas. Si hago una pregunta y la persona dice "No sé" y ni siquiera intenta pensarlo verbalmente, me da la impresión de que no contribuirán a las sesiones de lluvia de ideas, lo cual es crítico en las organizaciones que escriben software .
@Ben, definitivamente estoy de acuerdo con todas las cosas que mencionaste, sin embargo, porque el entrevistador dijo explícitamente antes de que comenzara la sesión que está bien decir que no sabes, simplemente seguí sus instrucciones y le dije por adelantado que no sabía: )
Paul Smith
4
Esto es probablemente obvio, pero para muchas aplicaciones la solución lenta del pobre puede estar bien.
Tenga una tabla en una base de datos relacional que almacene la latitud y la longitud. Consulte todas las ubicaciones que tengan una latitud dentro de las 20 millas y una longitud dentro de las 20 millas. Esto le proporciona un rectángulo delimitador del tamaño del rectángulo delimitador más pequeño que contiene el radio que realmente desea buscar (e ignora también la curvatura de la tierra).
Luego, toma el conjunto que se devuelve (mediante una consulta utilizando índices) y lo filtra hacia abajo utilizando un cálculo preciso de la distancia.
Por lo tanto, no es un rendimiento eficiente, pero es muy eficiente a tiempo para desarrollarse. Para muchas aplicaciones, esa podría ser una mejor opción.
Probablemente, la forma más fácil es usar un quadtree para almacenar las ubicaciones de sus casas, suponiendo que estén distribuidas en un paisaje 2D. La búsqueda debe ser bastante sencilla.
Si está utilizando un RDBMS con GIS habilitado para almacenar sus cosas, entonces realmente no necesita preocuparse por eso. Consulte esta pregunta para obtener información sobre el rendimiento de los jugadores principales.
Cuando se enfrenta a una pregunta como esta y simplemente no tiene experiencia en el dominio del problema, es bueno hacer un par de cosas.
Primero reconozca que no tiene experiencia específica en este dominio problemático.
En segundo lugar , explique cómo resolvería el problema.
Tercero , siempre reduzca problemas como este a sus componentes básicos. Usted sabe que las ubicaciones en un mapa están distribuidas bidimensionalmente. Usted sabe que si recibe coordenadas arbitrarias x, y, la distancia a cada coordenada desde otra coordenada se calcula formando un triángulo y resolviendo la longitud desconocida. Es de esperar que también sepa que si se le pide que encuentre todas las coordenadas dentro de un cuadro delimitador, puede hacer esto simplemente calculando la extensión del cuadro que desea encontrar y utilizando una simple mayor que, menor que la lógica a lo largo de ambos ejes.
Por último , nunca he contratado a un desarrollador que parecía renunciar a las preguntas. Si hago una pregunta y la persona dice "No sé" y ni siquiera intenta pensarlo verbalmente, me da la impresión de que no contribuirán a las sesiones de lluvia de ideas, lo cual es crítico en las organizaciones que escriben software .
fuente
Esto es probablemente obvio, pero para muchas aplicaciones la solución lenta del pobre puede estar bien.
Tenga una tabla en una base de datos relacional que almacene la latitud y la longitud. Consulte todas las ubicaciones que tengan una latitud dentro de las 20 millas y una longitud dentro de las 20 millas. Esto le proporciona un rectángulo delimitador del tamaño del rectángulo delimitador más pequeño que contiene el radio que realmente desea buscar (e ignora también la curvatura de la tierra).
Luego, toma el conjunto que se devuelve (mediante una consulta utilizando índices) y lo filtra hacia abajo utilizando un cálculo preciso de la distancia.
Por lo tanto, no es un rendimiento eficiente, pero es muy eficiente a tiempo para desarrollarse. Para muchas aplicaciones, esa podría ser una mejor opción.
fuente
Probablemente, la forma más fácil es usar un quadtree para almacenar las ubicaciones de sus casas, suponiendo que estén distribuidas en un paisaje 2D. La búsqueda debe ser bastante sencilla.
Si está utilizando un RDBMS con GIS habilitado para almacenar sus cosas, entonces realmente no necesita preocuparse por eso. Consulte esta pregunta para obtener información sobre el rendimiento de los jugadores principales.
fuente