Hay dos partes a su pregunta:
- ¿Qué tipo de estructura de datos se utiliza para almacenar la información del mapa.
- Qué tipo de algoritmo se usa para "navegar" desde el origen hasta el destino.
Para esto, me gustaría añadir otra pregunta:
- Cómo es Google/Bing capaz de "corriente de" los datos. Entonces, por ejemplo, puede acercarse desde millas hasta el nivel del suelo sin problemas, todo mientras mantiene el sistema de coordenadas.
Intentaré resolver cada pregunta en orden. Tenga en cuenta que no trabajo para Google Maps o para el equipo de Bing, así que, obviamente, esta información puede no ser completamente precisa. Estoy basando esto en el conocimiento obtenido de un buen curso de CS sobre estructuras de datos y algoritmos.
Resp. 1) El mapa está almacenado en un gráfico dirigido ponderado por el borde. Las ubicaciones en el mapa son Vértices y la ruta de una ubicación a otra (de un vértice a otro) son los bordes.
Obviamente, dado que puede haber millones de vértices y un orden de magnitud más de bordes, lo realmente interesante sería la representación de este Digrafio con borde Edge.
Yo diría que esto estaría representado por algún tipo de Lista de adyacencia y la razón por la que digo es porque, si imaginas un mapa, es esencialmente un gráfico disperso. Solo hay algunas maneras de ir de un lugar a otro. ¡Piensa en tu casa! ¿Cuántas carreteras (bordes en nuestro caso) llevan a eso? Las listas de adyacencia son buenas para representar gráficos dispersos, y la matriz de adyacencia es buena para representar gráficos densos.
Por supuesto, a pesar de que podemos representar de manera eficiente los gráficos dispersos en la memoria, dada la gran cantidad de vértices y bordes, sería imposible almacenar todo en la memoria a la vez. Por lo tanto, me imagino algún tipo de biblioteca de transmisión por debajo.
Para crear una analogía para esto, si alguna vez ha jugado un juego de mundo abierto como World of Warcraft/Syrim/GTA, observará que, en gran parte, no hay pantalla de carga. Pero, obviamente, es imposible poner todo en la memoria a la vez.Por lo tanto, utilizando una combinación de cuatrimotos y algoritmos de eliminación de triturado de troncos, estos juegos son capaces de cargar dinámicamente recursos (terreno, sprites, mallas, etc.).
Me imagino algo similar, pero para Gráficos. No he pensado mucho en este aspecto en particular, pero para cocinar un sistema muy básico, uno puede imaginar una base de datos en memoria, que consulta y agrega/elimina vértices y bordes del gráfico en tiempo de ejecución según sea necesario. Esto nos lleva a otro punto interesante. Como los vértices y bordes deben eliminarse y agregarse en el tiempo de ejecución, la implementación clásica de la Lista de adyacencia no lo cortará.
En una implementación clásica, simplemente almacenamos una Lista (un Vector en Java) en cada elemento de una matriz: Adj []. Me imagino, una lista vinculada en lugar de la matriz Adj [] y un árbol de búsqueda binaria en lugar de List [Edge]. El árbol de búsqueda binario facilitaría la inserción O (log N) y la eliminación de nodos. Esto es extremadamente deseable ya que en la implementación de la Lista, mientras que la adición es O (1), la eliminación es O (N) y cuando se trata de millones de bordes, esto es prohibitivo.
Un último punto a tener en cuenta aquí es que hasta que realmente inicie la navegación, hay un "no" gráfico. Dado que puede haber un millón de usuarios, no tiene sentido mantener un gráfico gigante para todos (esto sería imposible debido solo al requisito de espacio de memoria). Me imagino que a medida que estableces el proceso de navegación, se crea un gráfico para ti. Obviamente, como usted comienza desde la ubicación A y va a la ubicación B (y posiblemente a otras ubicaciones después de eso), el gráfico creado para usted no debe ocupar una gran cantidad de memoria (siempre que la arquitectura de transmisión esté en su lugar).
Ans 2) Esta es una pregunta muy interesante. El algoritmo más básico para resolver este problema sería el algoritmo Dijkstra Path Finding. Existen variaciones más rápidas, como A *. Me imagino que Dijkstra será lo suficientemente rápido, si pudiera funcionar correctamente con la arquitectura de transmisión que mencioné anteriormente. Dijkstra usa un espacio proporcional a V y un tiempo proporcional a E lg V, que son figuras muy buenas, especialmente para gráficos dispersos. Tenga en cuenta que, si la arquitectura de transmisión no se ha definido, V y E explotarán y el espacio y los requisitos de tiempo de ejecución de Dijkstra lo harán prohibitivo.
Resp. 1) Transmitiendo la pregunta: No confunda esta pregunta con la arquitectura de transmisión que se discutió anteriormente. Esto es básicamente preguntar cómo se logra el zoom sin interrupciones.
Un buen algoritmo para lograr esto es el algoritmo Quad Tree (puede generalizar esto a n-tree). Almacena imágenes más gruesas en el árbol e imágenes de mayor resolución mientras recorre el árbol. Esto es realmente lo que KML (Keyhole) hizo con su algoritmo de mapeo. Keyhole fue una compañía que se asoció con NVIDIA muchos años atrás para producir uno de los primeros softwares "Google Earth".
La inspiración para el descarte de Quad Tree proviene de los modernos juegos 3D, donde se utiliza para eliminar rápidamente partes de la escena que no están en la vista triturada.
Para aclarar más esto, imagina que estás mirando el mapa de EE. UU. Desde muy arriba. En este nivel, básicamente divide el mapa en 4 secciones y convierte cada sección en un elemento secundario del Quad Tree.
Ahora, a medida que acercas, acercas una de las secciones (obviamente, puedes acercar el centro, para que tu zoom toque realmente las 4 secciones, pero por simplicidad, digamos que acercas el zoom en una de las secciones). Por lo tanto, cuando se acerca a una sección, recorre los 4 niños de esa sección. Estos 4 niños contienen datos de mayor resolución de su padre. Luego puede continuar reduciendo la imagen hasta que llegue a un conjunto de hojas, que contienen los datos de mayor resolución. Para hacer el salto de una resolución a la siguiente "perfecta", se puede utilizar una combinación de desenfoque y desvanecimiento.
Como seguimiento de esta publicación, intentaré agregar enlaces a muchos de los conceptos que incluí aquí.
Whoa. Ese artículo de Wikipedia tiene Problemas Múltiples. –