Encontrar nodos vecinos en el algoritmo de conexión de gráficos

Estoy trabajando en un problema de búsqueda de rutas. Tengo una cuadrícula 2D de nodos espaciados uniformemente. Necesito un algoritmo para encontrar los 8 vecinos (si existen) para cada nodo para poder encontrar todas las conexiones vecinas.

La única forma en que sé cómo hacerlo sería algo como esto:

for each node
 for every other node
     check position to find if it is neighboring if so add it to the nodes connection list

Mi preocupación es que esto sería bastante ineficiente. O(n^2) e imagino que hay una mejor forma de solucionarlo.

Cualquier ayuda sería genial!

preguntado el 01 de febrero de 12 a las 03:02

Es solo una matriz de los nodos, cada uno de los cuales tiene una x y una y. Si un buen método requiere una forma diferente de almacenar los nodos, también estaría bien. -

@templatetypedef ¿Esta publicación realmente necesitaba una etiqueta 2D? -

Mis disculpas, tenía la impresión de que 2D era la etiqueta para objetos bidimensionales generales, no gráficos bidimensionales. En consecuencia, eliminé la etiqueta. ¡Lo siento por eso! -

@templatetypedef No hay problema, pensé que era gracioso que te esforzaras en editar eso, después de verlo, aunque vi que agregaste estructuras de datos, lo cual es útil -

1 Respuestas

Una opción simple sería almacenar los nodos en sí mismos en una matriz bidimensional indexada por las coordenadas xey de los nodos. De esa manera, tendría acceso aleatorio O (1) al nodo almacenado en la posición (x, y) simplemente indexando en la matriz y mirando lo que hay allí.

Alternativamente, si sus nodos son escasos, podría considerar almacenar los nodos en una tabla hash codificada por la ubicación (x, y). Esto también le da acceso aleatorio a O (1) a los nodos en posiciones dadas, y con un simple bucle for doble podría enumerar los ocho vecinos.

¡Espero que esto ayude!

Respondido 01 Feb 12, 08:02

La xey se almacenan como flotadores, ¿es posible que los flotadores de mi bucle y la posición del nodo puedan codificarse de manera diferente a veces? (si es así, simplemente lanza a un int para estar seguro) - Justin Meiners

Si los está almacenando como flotadores, es posible que deba hacer esto de manera completamente diferente. ¿Por qué se almacenan como flotadores? ¿Y qué cuenta como "vecino"? - templatetypedef

Puedo evitar flotadores si simplifica la solución - Justin Meiners

@ JustinMeiners- Si todo tiene posiciones enteras, sugiero encarecidamente usar números enteros. Si está trabajando con nodos más generales que se pueden colocar en ubicaciones de valor real, puedo sugerir una estructura de datos más poderosa que sea capaz de manejar eso. - templatetypedef

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.