Supposons que soit un arbre à degrés constants dont nous ne connaissons pas la structure. Le problème est de sortir l'arbre en posant des requêtes de la forme: "Le nœud se trouve-t-il sur le chemin du nœud au nœud ?". Supposons que chaque requête puisse recevoir une réponse en temps constant par un oracle. Nous connaissons la valeur de , le nombre de nœuds dans l'arbre. L'objectif est de minimiser le temps nécessaire à la sortie de l'arbre en termes de .
Existe-t-il un algorithme pour le problème ci-dessus?
Supposons que le degré de n'importe quel nœud dans soit au plus 3.
Ce que je sais
Le boîtier de diamètre borné est facile . Si le diamètre de l'arbre est , alors nous pouvons obtenir un algorithme de division et de conquête:
Tout arbre binaire a un bon séparateur qui divise l'arbre en composants de taille non inférieure à 1 / 3n.
- Choisissez un sommet x. Si c'est un bon séparateur, étiquetez-le et recursez.
- Trouvez les 3 voisins de x.
- Déplacez-vous en direction du voisin qui a le plus grand nombre de nœuds. Répétez l'étape 2 avec le voisin.
Puisque la recherche du séparateur prend au plus étapes, nous obtenons un algorithme .O ( n D log n )
Un algorithme randomisé . (déplacé des commentaires ci-dessous)
Choisissez deux sommets x et y au hasard. Avec une probabilité de 1/9, ils se trouveront sur les côtés opposés d'un séparateur. Sélectionnez le nœud central du chemin de à . Voyez s'il s'agit d'un séparateur, sinon faites une recherche binaire.y
Il faut temps prévu pour trouver le séparateur. Nous obtenons donc un algorithme randomisé .O ( n
Contexte. J'ai appris ce problème grâce à un ami qui travaille sur des modèles graphiques probabilistes. Le problème ci-dessus correspond à peu près à l'apprentissage de la structure d'un arbre de jonction à l' aide d'un oracle qui, étant donné trois variables aléatoires X, Y et Z, peut indiquer la valeur des informations mutuelles entre X et Y étant donné la valeur de Z. Si la valeur est proche à zéro, nous pouvons supposer que Z se trouve sur le chemin de X à Y.
Réponses:
Non. La stratégie d'adversaire simple suivante implique que tout algorithme pour reconstruire un arbre à nœuds nécessite au moins ( n - 1n requêtes "entre-deux".(n−12)=n(n−1)/2
Nommez arbitrairement les nœuds . L'adversaire répond à toutes les requêtes comme si l'arbre était une étoile avec le sommet au centre; pensez à comme la racine et les autres nœuds comme ses enfants.0,1,2,…,n−1 00 0
Supposons maintenant que l'algorithme s'arrête après avoir exécuté moins de requêtes. Ensuite, il doit y avoir deux sommets et , ni égaux à zéro, de sorte que l'algorithme n'a interrogé aucune permutation du triple . Si l'algorithme prétend que l'arbre n'est pas une étoile de centre , l'adversaire révèle son entrée, ce qui prouve l'algorithme faux. L'adversaire révèle alors que est en fait le seul enfant de , ce qui prouve à nouveau l'algorithme.y z ( 0 , y , z ) 0 x yn(n−1)/2 y z (0,y,z) 0 x y
Mise à jour: Oups, je viens de remarquer la contrainte de degré.
Heureusement, ce n'est pas un obstacle majeur. Remplacez le nœud par votre arbre binaire préféré, avec les autres nœuds sous forme de feuilles dans un ordre inconnu, puis dévoilez ce sous-arbre à l'algorithme de reconstruction. La reconstruction de l' arbre binaire ( 2 n - 3 ) nœuds résultant nécessite toujours au moins n ( n - 1 ) / 2 requêtes. De manière équivalente, la reconstruction d'un arbre binaire à m nœuds nécessite au moins ( m + 3 ) ( mn - 10 n−1 (2n−3) n(n−1)/2 m requêtes. (Je suis sûr qu'une construction plus subtile améliorerait la constante.)(m+3)(m+2)/8 Comme le souligne Jagadish, cette généralisation ne fonctionne pas; les requêtes sur les nœuds internes de l'arbre imposent un ordre sur les feuilles, ce qui réduit le nombre de requêtes nécessaires.la source
la source