Quale struttura dati posso usare per modellare una rete di nodi e spigoli?

7

La mia applicazione deve modellare ed eseguire operazioni su una rete con 40-50 nodi e in genere meno di 6 spigoli per nodo. Entrambi i nodi e i bordi sono oggetti con circa 1K di dati ciascuno. Durante l'esecuzione, la mappatura della rete viene spesso modificata: i nodi vengono aggiunti e cancellati, i bordi aggiunti e cancellati, oltre alle proprietà dei singoli nodi e bordi regolati. Gli oggetti nodo e gli oggetti bordo vengono allocati utilizzando 'nuovo' con i puntatori risultanti memorizzati in std::list per ogni tipo di oggetto.

Ho sperimentato due diversi approcci per la mappatura:

  1. Metti un contenitore in ogni nodo per contenere ID di spigoli e 2 variabili in ogni spigolo per memorizzare gli ID dei nodi finali.

  2. Aggiungi un nuovo contenitore di primo livello, separato dal contenitore degli spigoli e dal contenitore dei nodi, per memorizzare le informazioni di mappatura.

Le funzioni nel nodo e nelle classi membro saranno più facili da implementare, se le informazioni di mappatura sono memorizzate in quelle classi. Apportare modifiche alla mappatura di rete sarebbe molto più semplice se tutti i dati di mappatura fossero memorizzati separatamente. Ma se la mappatura non è memorizzata nei nodi e nei bordi, le funzioni dei membri nei nodi e nei bordi richiedono un modo per ottenere le informazioni di mappatura dall'oggetto padre.

Esiste una struttura dati o una tecnica concettuale che fornisce il meglio da entrambi gli approcci, senza duplicare i dati o interrompere l'incapsulamento? Le prestazioni non sono di grande interesse, dal momento che non sono previsti calcoli estremamente costosi. La preoccupazione più importante riguarda il codice sicuro, comprensibile e gestibile.

    
posta Mark Taylor 10.02.2012 - 00:02
fonte

2 risposte

5

I grafici possono essere implementati in molti modi, e quello che hai delineato non è certamente sbagliato.

Per C ++ penso che dovresti dare un'occhiata alle librerie Boost C ++ (BGL) che ha anche un library specificamente per l'implementazione di grafici . Se lo usi, puoi anche utilizzare algoritmi implementati in BGL (ricerche e attraversamenti) o anche utilizzare direttamente _edge e _vertex visitatori.

    
risposta data 10.02.2012 - 08:30
fonte
1

Ho implementato le operazioni di rete in Python. Ecco la mia soluzione.

  • una classe Node che possiede un elenco di Port s
  • ogni Port oggetto ha attributi destination , proper_direction e back_port
  • Node fornisce funzioni di collegamento e garantisce che per ogni oggetto Port nel suo elenco sia stato creato un altro oggetto back-port Port nel nodo di destinazione con proper_direction negativo e anche questo back-porto sia referenziato da back_port

In questo modo i nodi sono collegati da una coppia di porte in entrambe le direzioni con reverse_directions. Crea dei puntatori a C come appropriato: in Python non ci importa dei puntatori; -)

Per memorizzare i dati in ciascun nodo I ricaviamo una sottoclasse che aggiunge una mappatura. Se voglio anche memorizzare i dati in ciascun collegamento, emulo i collegamenti con Node oggetti e fondamentalmente collego gli oggetti e i collegamenti (entrambi i nodi) tramite le porte.

Questa struttura dati si è rivelata molto utile per la ricerca e le operazioni di rete.

    
risposta data 10.02.2012 - 09:24
fonte

Leggi altre domande sui tag