Arbres binaires de recherche optimaux
Transcription
Arbres binaires de recherche optimaux
Arbres binaires de recherche optimaux Manon Runi Étape 1 Présentation du problème On a une séquence K = (k , . . . , k ) de n clefs triées. Pour chaque clef k , on a la probabilité p qu'une recherche concerne k . On se donne aussi n + 1 clefs factices d , . . . , d qui représentent les valeurs qui ne sont pas dans K (d représente les valeurs < k , d représente les valeurs > k , et ∀i ∈ [|1, n − 1|], d représente les valeurs strictement comprises entre k et k ). Pour chaque clef factice d , on a la probabilité q qu'une recherche concerne d . On veut construire un arbre binaire de recherche T pour les clefs de K . Chaque clef k sera un n÷ud interne et chaque clef factice d sera une feuille de l'arbre. Comme une recherche soit réussit, soit échoue, on a : 1 n i i 0 0 0 n n i i i i i n i+1 i i i n n X X pi + qi = 1 i=1 i=0 Pour l'arbre binaire de recherche T , on peut calculer le coût espéré d'une recherche : X X E[coût de recherche dans T ] = (Prof (k ) + 1) · p ) + (Prof (d ) + 1) · q 1 n n T i i i=1 T i i i=0 Prof (k ) · p + Prof (d ) · q Pour un ensemble donné de probabilités , on veut calculer l'arbre de recherche comme décrit précédemment pour lequel le coût moyen d'une recherche est optimal. On appellera un tel arbre : arbre de recherche optimal (ABRO). La vérication exhaustive de toutes les possibilités ne fournit pas un algorithme ecace (il y aurait un nombre exponentiel de possibilités). On va résoudre ce problème grâce à un algorithme de programmation dynamique. =1+ n X n X T i=1 i i T i i i=0 Étape 2 Structure d'un arbre de recherche optimal. On remarque qu'un sous-arbre d'un arbre binaire de recherche doit contenir des clefs appartenant à une plage contigüe k , . . . , k , avec 1 6 j 6 n. En outre, un sous-arbre qui contient les noeuds k , . . . , k doit aussi contenir les feuille d , . . . , d . De plus, si un ABRO T a un sous-arbre T , T est forcément optimal . Si T est un ABRO contenant les clefs k . . . k , et si k est sa racine, on remarque que son ls gauche contient les clefs k . . . k et son ls droit k . . . k . On remarque également que si r = i, le ls gauche (clefs k . . . k ) correspond à la feuille d et que si r = j, le ls droit (clefs k . . . k ) correspond à la feuille d . i i j j 2 i−1 0 i,j i i i r−1 i−1 j 3 0 j r r+1 j i−1 j+1 j j 1. La profondeur de la racine de l'arbre est 0, et une recherche de la clef racine se fait en temps 1. Une recherche d'une clef de profondeur 1 a un coût de 2, etc. 2. Induction : si un arbre contient une place contigüe, ses ls droit et gauche aussi (ABR) 3. Sinon on remplace T 0 par un ABRO qui contient les mêmes clefs ; ce qui contredit l'optimalité de T . 1 Étape 3 Du coup, on peut décrire les sous-problèmes et la relation de récurrence. Pour i > 1 et i − 1 6 j 6 n, soit e[i, j] le coût espéré de recherche dans un ABRO contenant les clefs k , . . . , k . Pour j = i − 1 : e[i, i − 1] = q Pour j 6 i : D'abord, on remarque que quand on considère notre sous-arbre comme sous-arbre d'un noeud, on augmente la profondeur de chaque noeud de 1, et donc le coût de recherche moyen de : i j i−1 j j X X w(i, j) = pl + ql l=i Ainsi, on obtient la relation suivante : l=i−1 e[i, j] = min {pr + (e[i, r − 1] + w(i, r − 1)) + (e[r + 1, j] + w(r + 1, j))} i6r6j Or, comme w(i, j) = w(i, r − 1) + pr + w(r + 1, j) on obtient : si j = i − 1 si i 6 j On doit également considérer la quantité e[n + 1, n], qui correspond au coût moyen d'une recherche dans le sous-arbre contenant uniquement la feuille d . Pour gérer la structure des sous-arbres de recherche optimaux, on dénit, pour 1 6 i 6 j 6 n, racine[i, j] qui correspond à l'indice r pour lequel k est la racine d'un ABRO contenant les clefs k ...k . Enn, on remarque que : w(i, i − 1) = q et ∀j > i, w(i, j) = w(i, j − 1) + p + q ( e[i, j] = qi−1 min {e[i, r − 1] + e[r + 1, j] + w(i, j)} i6r6j n r i j i−1 j Étape 4 Algorithme et complexité 2 j Algorithme 1 : ABRO Entrées : Les probabilités p1 . . . pn et q0 . . . qn , et la taille n Résultat : Les tableaux e et racine Soient e[1 . . . n + 1, . . . n], w[1 . . . n, 0 . . . n] et racine[1 . . . n, 1 . . . n] des tableaux; e[i, i − 1] ← q ; w[i, i − 1] ← q ; pour 1 6 i 6 n + 1 faire i−1 i−1 n pour 1 6 l 6 n; faire pour 1 6 i 6 n − l + 1 faire /* l = le nombre de clefs dans le sous-arbre */ ; j =i+l−1 e[i, j] ← ∞ w[i, j] ← w[i, j − 1] + pj + qj pour i 6 r 6 j faire t = e[i, r − 1] + e[r + 1, j] + w[i, j] si t < e[i, j] alors e[i, j] ← t racine[i, j] ← r ; ; ; ; n n n retourner e et racine Il y a trois boucles imbriquées. On a donc une complexité en O(n ). 3 Références [1] Thomas H. Cormen, . Dunod, 3è édition, 2010. Algorithmique 3