Come si fa a definire un diretto grafo aciclico (DAG) (di stringhe) (con una radice) migliore in Haskell?come definire un albero-come DAG in Haskell
ho particolarmente bisogno di applicare le seguenti due funzioni in questa struttura di dati il più velocemente possibile:
- Trova tutti gli antenati (diretti e indiretti) di un elemento (compresi i genitori dei genitori, ecc).
- Trova tutti i figli (diretti) di un elemento.
ho pensato di [(String,[String])]
dove ogni coppia è un elemento del grafico consistente del suo nome (String
) e una lista di stringhe ([String]
) contenente i nomi dei genitori (diretti) di questo elemento. Il problema con questa implementazione è che è difficile eseguire la seconda attività.
È anche possibile utilizzare [(String,[String])]
mentre l'elenco di stringhe ([String]
) contiene i nomi dei bambini (diretti). Ma anche qui, è difficile fare il primo compito.
Cosa posso fare? Quali alternative ci sono? Qual è il modo più efficace?
MODIFICA: Un'altra osservazione: mi piacerebbe anche che fosse definito facilmente. Devo definire l'istanza di questo tipo di dati "manualmente", quindi vorrei evitare ripetizioni inutili.
'data Famiglia = Ego {genitori, figli :: [Stringa]}; digita DAG = Map String Family'? Se si memorizzano genitori e figli, entrambe le operazioni di ricerca dovrebbero essere ragionevolmente veloci. –
Oppure hanno due mappe. Uno dai genitori ai bambini, il secondo dai bambini ai genitori. Scegli il modo in cui ti si addice meglio. – Adrian
Ho aggiunto un'osservazione aggiuntiva nella domanda originale che rende difficile la tua suggerimento. –