Sto cercando una buona struttura dati per creare classi di equivalenza sui nodi di un albero. In una struttura ideale, le seguenti operazioni dovrebbero essere veloce (O (1)/O (n) come appropriato) e veloce (nessun punti di codice mistero):Qual è una buona struttura dati per costruire classi di equivalenza sui nodi di un albero?
- (A) Walk l'albero dalla radice; in ogni nodo -> transizione bambino enumerare tutte le versioni equivalenti del nodo figlio
- (B) Unire due classi di equivalenza
- (C) Creazione di nuovi nodi da un elenco di nodi esistenti (i bambini) e altri dati
- (D) Trova tutti i nodi strutturalmente equivalenti al nodo (cioè hanno lo stesso numero di figli, i bambini corrispondenti appartengono alla stessa classe di equivalenza e i loro "altri dati" sono uguali) in modo che i nuovi nodi (o modificati) possano essere inserito nella giusta classe di equivalenza (tramite un'unione)
Finora ho considerato (alcuni di questi potrebbero essere utilizzati in combinazione):
- Un parfait, dove i bambini sono riferimenti a raccolte di nodi anziché a nodi. (A) è veloce, (B) richiede di camminare sull'albero e di aggiornare i nodi per puntare alla raccolta unita, (C) richiede di trovare la raccolta contenente ogni figlio del nuovo nodo, (D) richiede camminare sull'albero
- Manutenzione di un hash dei nodi per le loro caratteristiche. Questo rende (D) molto più veloce ma (B) più lento (poiché l'hash dovrebbe essere aggiornato quando le classi di equivalenza sono unite)
- String i nodi insieme in una lista concatenata circolare. (A) è veloce, (B) sarebbe veloce ma per il fatto che quella "fusione" di una lista circolare con se stessa divide effettivamente la lista (C) sarebbe veloce, (D) richiederebbe camminare sull'albero
- Come sopra, ma con un puntatore "su" aggiuntivo in ciascun nodo, che potrebbe essere utilizzato per trovare un membro canonico dell'elenco circolare.
mi manca un dolce alternativa?
Il tag deve essere un algoritmo, non algoritmi. – ashawley