2011-08-19 16 views
12

Spero di scrivere un algoritmo per sincronizzare due strutture gerarchiche. Queste strutture potrebbero essere grafici di oggetti, dati memorizzati in tabelle di database relazionali, ecc. (Anche due strutture diverse, purché abbiano chiavi comparabili). La sincronizzazione sarà a senso unico, vale a dire, una struttura sarà il prototipo e l'altra sarà modificata per corrispondere.Sincronizzazione unidirezionale di due gerarchie

Diciamo che abbiamo una funzione sync. Sarebbe necessario accettare il seguente:

  1. objA - il prototipo
  2. objB - l'oggetto da modificare
  3. keyA - funzione generatrice chiave per objA
  4. keyB - funzione generatrice chiave per objB
  5. addB - funzione per creare un objB (rendimenti id della nuova objB)
  6. setB - funzione per aggiornare objB
  7. remB - funzione per eliminare un objB
  8. parB - id del genitore objB s' - questo è passato a addB per il contesto

Quindi dobbiamo this:

let sync (objA:'a) (objB:'b) (keyA:'a -> 'k) (keyB:'b -> 'k) 
     (addB:'p * 'a -> 'p) (setB:'a * 'b -> unit) (remB:'b -> unit) 
     (parB:'p) = ... 

Ora qui è dove ho problemi. 'a e 'b sono gerarchici, quindi la funzione deve sapere quali proprietà di 'a e di 'b devono attraversare (una volta confrontate le proprie chiavi e decide che corrispondono finora e devono essere ulteriormente attraversate). Per queste proprietà "figlio", ha bisogno di tutti gli stessi argomenti passati alla sincronizzazione, ma per i loro rispettivi tipi.

Questo è quando è diventato evidente questo è un problema di struttura dei dati. Come posso concatenare queste informazioni in modo tale che l'oggetto radice possa essere passato a sync e possa attraversare i grafici verso il basso? Il mio pensiero iniziale era quello di incorporare tutti gli argomenti in una classe, che avrebbe una proprietà figli (uno ResizeArray dello stesso tipo). Ma con varie proprietà che hanno tipi diversi, non sono riuscito a capire come farlo funzionare, a meno di lanciare tipi dalla finestra e fare la maggior parte o tutti gli argomenti di tipo obj.

Così qui sono le mie domande:

  1. C'è un metodo consolidato per fare questo già (non sono stato in grado di trovare qualsiasi cosa)
  2. struttura Quali dati potrebbe utilizzare per incapsulare il dati necessari per farlo funzionare?

Ho fatto del mio meglio per spiegarlo a fondo, ma se qualcosa rimane poco chiaro, si prega di chiedere, e proverò a fornire informazioni migliori.

+0

Suppongo che avrai bisogno di una struttura dati intermedia su cui questo algoritmo funzionerà, anche per vari tipi di dati, avresti bisogno di trasformare questi dati nella struttura di dati intermedia, eseguire l'algo e quindi trasformarlo di nuovo in dati originali modulo – Ankur

risposta

1

Sono sicuro che questo lo semplifica eccessivamente ma ecco la mia idea.

Se si tratta di un DAG, è possibile eseguire un attraversamento di larghezza di objA.Quando accodate un nodo da objA includete objB e ogni altra informazione di cui avete bisogno (tupla). Quindi, quando si abbandona, si riparano objB.

È possibile utilizzare un'unione discriminata per gestire diversi tipi di figlio nell'accodamento.

+0

Idea interessante. Potrebbe essere un giorno o due prima che io possa provarlo. Tornerò da te. Grazie per il suggerimento! – Daniel

+0

Ciò mantiene il problema originale che è i diversi tipi di nodi figlio. – Daniel

0

Genera diffgrams dalle due strutture dati e associa le trasformazioni al problema trasformato.

Problemi correlati