Arbres binaires de recherche optimaux

publicité
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
Téléchargement