In un albero n-ary ...
- Fornito un riferimento ad un nodo figlio
- E un riferimento a un genitore distante del nodo figlio referenziato
- Esiste un metodo che un nodo genitore può usare per capire quale dei suoi figli è più vicino al nodo figlio referenziato e ha un grande-oh che è minore di O (numero di spigoli tra genitore e figlio)
Immagine per illustrare la mia domanda:
A
|
|
B
/ \
/ \
C D <-- distant parent
/|\
/ | \
E F G <-- which child?
/| |\ \
/ | | \ \
H I J K L
/ /| /|\
/ / | / | \
M N O P Q R
^ |
| |
That child node S
Cose che ho provato:
-
Iterare l'albero (O (n)), da "quel nodo figlio" fino a quando viene trovato il genitore e restituire il nodo visitato in precedenza. Questo è il momento in cui ho notato che il mio programma impiegava troppo tempo per iterare l'albero e poteva usare qualche tipo di miglioramento.
-
Chiedi a ciascun nodo di salvare un riferimento a ogni singolo genitore presente in un array e l'indice utilizzato è il numero di spigoli tra il nodo nell'array e il nodo radice.
Esempio: "quel nodo figlio" avrà una matrice di dimensione 5, e il suo genitore immediato sarà nell'indice 4, e la radice, l'indice 0.
Vantaggio: questo consente di trovare il nodo da restituire molto rapidamente (O (1)) perché, il livello (numero di spigoli tra il nodo e il nodo radice) + 1 del nodo genitore , mi darà l'indice nella matrice in "quel nodo figlio" del nodo che voglio restituire.
Svantaggio: l'aggiunta di nodi all'albero diventa molto costosa in memoria e il tempo di calcolo, soprattutto se il nodo è molto lontano dal nodo radice. costoso in memoria, perché avrà un enorme array e tempo di computazione perché l'array deve essere popolato, deve essere popolato da tree traversal o copiare l'array dal suo genitore, può volerci un po 'di tempo ...
-
Come sopra, eccetto, invece di salvare riferimenti a ogni nodo, salva i riferimenti al nodo log2 (livello) ai nodi, in un modo simile a log2 ()
Esempio: un nodo a livello 1000000 avrebbe 20 riferimenti a nodi padre. questi riferimenti sarebbero rivolti a un genitore a ciascuno dei seguenti livelli: 500000, 750000, 875000, 937500, 968750 ... 999999.
Advanage: trova il nodo da restituire in O (log2 (n)) a O (n), non veloce quanto la soluzione sopra, ma abbastanza veloce. molto più efficiente della memoria rispetto alla soluzione precedente, ma ancora piuttosto male.
Svantaggio: è ancora piuttosto costoso aggiungere nuovi nodi all'albero in tempo di calcolo, ma non così male.
Posso pensare alle variazioni del suddetto 3 metodo per rendere le cose leggermente più efficienti in termini di memoria ed efficienti nel tempo, ma mi chiedo se c'è un metodo che impiega O (1) tempo per trovare la soluzione a questo problema Non vedo ... qualcosa come la proprietà dell'albero di ricerca binario, ma per un albero n-ario.
La proprietà dell'albero di ricerca binaria è desiderabile, poiché dato un nodo figlio, il genitore può fare un passo verso di esso, indipendentemente dal numero di fronti tra il nodo figlio dato e il genitore.
Non mi interessa inserire un indice o ID o dati aggiuntivi nel nodo figlio per rendere il metodo possibile.