Supponiamo che sia un albero a grado costante di cui non conosciamo la struttura. Il problema è di generare l'albero chiedendo domande del modulo: "Il nodo giace sul percorso dal nodo al nodo ?". Supponiamo che un oracolo possa rispondere a ogni query in tempo costante. Conosciamo il valore di , il numero di nodi nella struttura. L'obiettivo è ridurre al minimo il tempo impiegato per produrre l'albero in termini di .T x a b n n
Esiste un algoritmo per il problema precedente?
Supponiamo che il grado di qualsiasi nodo in sia al massimo 3.
Quello che so
La cassa del diametro limitato è facile . Se il diametro dell'albero è , allora possiamo ottenere un algoritmo di divisione e conquista:
Ogni albero binario ha un buon separatore che divide l'albero in componenti di dimensioni non inferiori a 1/3 n.
- Scegli qualsiasi vertice x. Se si tratta di un buon separatore, etichettarlo e ricorrere.
- Trova tutti e 3 i vicini di x.
- Spostati nella direzione del vicino che ha il maggior numero di nodi. Ripetere il passaggio 2 con il vicino.
Poiché la ricerca del separatore richiede quasi tutti i passaggi , otteniamo un algoritmo .O ( n D log n )
Un algoritmo randomizzato . (spostato dai commenti qui sotto)
Seleziona due vertici xey in modo casuale. Con 1/9 di probabilità si troveranno sui lati opposti di un separatore. Scegli il nodo centrale del percorso da a . Verifica se si tratta di un separatore, in caso contrario esegui una ricerca binaria.y
Ci vuole tempo previsto per trovare il separatore. Quindi otteniamo un algoritmo randomizzato .O ( n
Sfondo. Ho imparato questo problema da un amico che lavora su modelli grafici probabilistici. Il problema sopra riportato corrisponde approssimativamente all'apprendimento della struttura di un albero di giunzione usando un oracolo che, dati tre variabili casuali X, Y e Z, può dire il valore delle informazioni reciproche tra X e Y dato il valore di Z. Se il valore è vicino a zero, possiamo supporre che Z si trovi sul percorso da X a Y.