Estoy intentando construir un gráfico por lista de adyacencia, lo que significa que necesito una lista para todos los nodos, y dentro de cada clase de nodo, también necesito una estructura de datos para contener todos los nodos adyacentes. Me preguntaba cuál sería la mejor estructura para hacer esto (una búsqueda rápida para la clase de nodo de destino). ¿Funcionaría una matriz?Lista de adyacencia y gráfico
9
A
Respuesta
23
Aquí hay una forma de construir un gráfico dirigido en Ruby, donde cada nodo mantiene referencias a sus sucesores, pero los nodos se pueden referenciar por nombre. Primero necesitaremos una clase para los nodos:
class Node
attr_reader :name
def initialize(name)
@name = name
@successors = []
end
def add_edge(successor)
@successors << successor
end
def to_s
"#{@name} -> [#{@successors.map(&:name).join(' ')}]"
end
end
Cada nodo mantiene referencias a sus sucesores. Sin saber qué tipo de operaciones necesita, no he definido ninguna que realmente atraviese gráficos, pero cada nodo que tenga referencias a sus sucesores hace que recorrer el gráfico sea trivial.
Ahora vamos a crear una clase para representar a toda la gráfica:
class Graph
def initialize
@nodes = {}
end
def add_node(node)
@nodes[node.name] = node
end
def add_edge(predecessor_name, successor_name)
@nodes[predecessor_name].add_edge(@nodes[successor_name])
end
def [](name)
@nodes[name]
end
end
Esta clase mantiene un hash de sus nodos, cerrado por su nombre. Esto hace que la recuperación de un nodo específico sea fácil.
He aquí un ejemplo de un gráfico que contiene un ciclo:
graph = Graph.new
graph.add_node(Node.new(:a))
graph.add_node(Node.new(:b))
graph.add_node(Node.new(:c))
graph.add_edge(:a, :b)
graph.add_edge(:b, :c)
graph.add_edge(:c, :a)
puts graph[:a] #=> a -> [b]
puts graph[:b] #=> b -> [c]
puts graph[:c] #=> c -> [a]
Cuestiones relacionadas
- 1. estructura de lista de adyacencia en HBase
- 2. Comparando objeto gráfico representación a la lista de adyacencia y la matriz de representaciones
- 3. Creación de una lista de adyacencia de un data.frame
- 4. reduciendo los requisitos de memoria para la lista de adyacencia
- 5. representación de gráficos: lista de adyacencia frente a la matriz
- 6. Lista de adyacencia frente al modelo de conjunto anidado
- 7. Aplanar jerarquía de lista de adyacencia a una lista de todas las rutas
- 8. Diferencia entre gráfico, gráfico y gráfico
- 9. Optimizando el código vectorizado para la adyacencia de gráficos
- 10. Construir todo el árbol a partir de una relación de lista de adyacencia SQLAlchemy
- 11. Modelos de datos jerárquicos: Lista de adyacencia frente a conjuntos anidados
- 12. La forma más eficiente de crear un árbol desde la lista de adyacencia
- 13. consulta recursiva para la lista de adyacencia para preordenar el recorrido del árbol en SQL?
- 14. ¿Cómo encontrar un triángulo dentro de un gráfico?
- 15. gráfico de líneas de Rafael animar y actualizar el gráfico
- 16. Algoritmo de gráfico (gráfico)
- 17. ¿Cómo calculo la entropía de un gráfico?
- 18. Matriz de incidencia en lugar de matriz de adyacencia
- 19. Cómo implementar una matriz de adyacencia en Java produciendo ciclos de hamilton
- 20. ¿Qué modelo jerárquico debo usar? Adyacencia, anidado o enumerado?
- 21. Optimice Floyd-Warshall para la matriz de adyacencia simétrica
- 22. Trazado y guardado gráfico R
- 23. Gráfico de puntos y figuras con matplotlib
- 24. Gráfico de trazado y trazado en OpenCV
- 25. Gráfico - DrawLine - línea de drenaje y moverlo
- 26. Vector STL vs list: ¿Más eficiente para listas de adyacencia de gráficos?
- 27. Si topológicamente clasifico un DAG, ¿puedo soltar la mitad de la matriz de adyacencia?
- 28. Gráfico de SSRS 2008 R2: promedio del gráfico de pantalla y promedio del grupo
- 29. eliminando las líneas de la cuadrícula en C# Gráfico y haciendo líneas de gráfico más gruesas
- 30. R: gráfico 4D, x, y, z, colores
El lenguaje Ruby es conocido por un uso intensivo de los hashes y arrays para casi todos los casos, en lugar de las estructuras de datos especializadas. Ruby favorece la productividad del programador, por lo que los hash y los arreglos tienen una gran capacidad para que los desarrolladores los utilicen todo el tiempo. En tu caso, creo que la matriz estaría bien. – Valentin
En un lenguaje OOP como Ruby, considere representar cada nodo en el gráfico como un objeto que mantiene sus bordes como referencias a otros objetos del mismo tipo. –