Sto provando a creare un grafico per elenco di adiacenza, il che significa che ho bisogno di un elenco per tutti i nodi, e all'interno di ogni classe di nodi, ho anche bisogno di una struttura dati per contenere tutti i nodi adiacenti. Mi chiedo solo quale sarebbe la struttura migliore per farlo (una ricerca veloce per la classe nodo di destinazione). Un array funzionerebbe?Elenco e grafico di adiacenza
9
A
risposta
23
Ecco un modo per creare un grafico diretto in Ruby, dove ogni nodo mantiene i riferimenti ai suoi successori, ma i nodi possono essere referenziati per nome. Per prima cosa avremo bisogno di una classe per i nodi:
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
Ogni nodo mantiene i riferimenti ai suoi successori. Non sapendo che tipo di operazioni hai bisogno, non ho definito nessuno che faccia effettivamente attraversamento di grafici, ma ogni nodo che ha riferimenti ai suoi successori rende banale il percorso del grafico.
Ora creeremo una classe per rappresentare l'intero grafico:
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
Questa classe mantiene un hash dei suoi nodi, calettati per nome. Ciò rende facile il recupero di un nodo specifico.
Ecco un esempio di un grafico contenente 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]
Problemi correlati
- 1. : elenco di adiacenza vs set nidificati
- 2. Estrarre la matrice di adiacenza da un grafico BGL
- 3. IGRAPH Grafico da NumPy o panda di adiacenza matrice
- 4. Elenco di adiacenza rispetto al modello di serie nidificato
- 5. Elenco di adiacenza di Flask-SqlAlchemy Rapporto backfref error inaspettato
- 6. Ottimizzazione del codice vettoriale per la adiacenza del grafico
- 7. Oggetto e puntatore grafico rappresentazioni
- 8. Plot Grafico di reteX dalla matrice di adiacenza nel file CSV
- 9. Creazione di una lista di adiacenza di una data.frame
- 10. Confrontando rappresentazione grafica oggetto lista di adiacenza e la matrice Rappresentazioni
- 11. Come analizzare una matrice di adiacenza sparsa?
- 12. Differenza tra grafico, grafico e grafico
- 13. Come trovare un triangolo all'interno di un grafico?
- 14. Disegna un grafico da un elenco di nodi connessi
- 15. Come posso colorare nodi e bordi da una matrice di adiacenza in r?
- 16. Ordinamento di righe e colonne di matrice di adiacenza per rivelare le cricche
- 17. Creare matrice di adiacenza in python da CSV dataset
- 18. Creare una matrice di adiacenza quadrata da data.frame o data.table
- 19. Modo efficiente di convertire matrici di adiacenza di grandi dimensioni in liste di bordi in MATLAB?
- 20. Come creare una lista/matrice di adiacenza ponderata dall'elenco di spigoli?
- 21. Come rappresentare la matrice di adiacenza data come grafo pesato non orientato in matlab?
- 22. Elenco dei nomi dei tensori nel grafico in Tensorflow
- 23. Diagramma grafico di Google ore e minuti
- 24. Grafico di disegno e tracciatura in OpenCV
- 25. (OpenCV) Calcolo della matrice ad adiacenza rapida dal spartiacque
- 26. Modifica grafico grafico e variabile in base a selectInput
- 27. Creazione automatica di un grafico C per il grafico
- 28. ggplot2 grafico torta e ciambella sullo stesso grafico
- 29. Numero di componenti connessi in un grafico non orientato
- 30. Elenco di API Java per strutture di dati grafico/di rete
Il linguaggio Ruby è noto per un uso pesante di hash e array per quasi tutti i casi, invece di strutture di dati specializzate. Ruby favorisce la produttività dei programmatori, quindi gli hash e gli array hanno capacità ricche in modo che gli sviluppatori li usino sempre. Nel tuo caso penso che array andrebbe bene. – Valentin
In un linguaggio OOP come Ruby, si consideri la rappresentazione di ciascun nodo nel grafico come un oggetto che mantiene i suoi bordi come riferimenti ad altri oggetti dello stesso tipo. –