cours algo 3
TRANSCRIPT
Version étudiants Unice
Cours d’algorithmique et structures de données
MI2 2005/2006
Fabrice Huet ([email protected])
Version étudiants Unice
Plan
• Algorithmes de recherche– Recherche Associative, Dictionnaire– Recherche séquentielle dans un tableau– Recherche dichotomique– Arbres, arbre équilibrés– Implémentation d’un dictionnaire avec une table de hachage
• Algorithmes de tri– Importance du problème de tri– Borne de complexité optimale – Tri peu efficaces: à bulle et par insertion– Tri optimal en moyenne: quicksort
• Exemples d’algorithmes classiques– Recherche d’une sous chaîne– Simplex– Sécurité et Cryptographie
Version étudiants Unice
Cours 7
Recherche séquentielleRecherche dichotomiqueArbres Binaires de Recherche
Version étudiants Unice
Ensembles dynamiques et dictionnaire
• Les ensembles manipulés par les algorithmes peuvent croître, diminuer ou subir d’autres modifications
• De tels ensembles sont dit dynamiques• Un dictionnaire est un ensemble dynamique qui
supporte– L’insertion– La suppression– La recherche
• D’autres ensembles supportent des opérations plus complexes, comme la recherche du plus petit élément.
Version étudiants Unice
Ensembles dynamiques et dictionnaire
• Pour implémenter un ED, on utilise des objets• Dans certains cas, l’objet possède un champs
clé– Il sert a discriminer entre les objets
• Il est aussi possible d’avoir des références vers d’autres objets de l’ED
Version étudiants Unice
Opérations sur les ED
• On suppose l’existence d’un ED S• Rechercher(clé k): retourne une ref. sur l’objet x tel
que x.clé=k, ou NIL si il n’y en a pas• Insérer(objet x): ajoute à S l’objet x• Supprimer(objet x): élimine l’objet x de l’ensemble S• Minimum(): retourne l’objet de S qui a la plus petite
clé• Maximum(): retourne l’objet de S qui a la plus
grande clé• Successeur(objet x): retourne le prochain élément
de S plus grand que x ou NIL si x est le plus grand• Prédécesseur(objet x): retourne le prochain élément
de S plus petit que x ou NIL si x est le plus petit
Version étudiants Unice
Recherche séquentielle dans un tableau
• Nous allons chercher un élément dans un ensemble fixe.
• Cet ensemble sera représenté par un tableau
truc tablo[1..N];
• Nous supposerons que le type truc ne contient pas de clef, i.e. il est la clef
Version étudiants Unice
Recherche séquentielle dans un tableau
• Comment chercher un élément a dans ce tableau?
• Problèmes: – truc n’a pas de propriété spéciale– Le tableau n’est pas ordonné
• Solution: parcourir le tableau pas à pas, c’est une recherche séquentielle.
• Deux conditions d’arrêt– On a trouvé l’élément
tablo[i] = a– On a parcouru tout le tableau sans trouver l’élément
Version étudiants Unice
Recherche séquentielle dans un tableau
• On a donc l’algorithme suivantentier i ←1;tant que ((i ≤ N) et (tablo[i] ≠ a)) {
i ← i+1;}
• Invariant de boucle:
• Sortie de boucle:
Version étudiants Unice
Recherche séquentielle dans un tableau
• On trouve l’élément avec le plus petit indice
• La répétition se termine, i est incrémenté, il atteindra donc N
• Chaque étape nécessite– Évaluation d’une expression booléenne– Incrémentation
• Peut-on accélérer la recherche?
Y réfléchir pour la semaine prochaine
Version étudiants Unice
Recherche dichotomique
• On ne peut pas optimiser sans plus d’informations sur les données
• On sait que chercher une informations est plus facile si l’ensemble est ordonné– Recherche d’un mot dans le dictionnaire– Recherche dans l’annuaire
• On suppose donc notre tableau ordonné∀k∈ [2,N] , tablo[k-1] ≤ tablo[k]
• Il faut aussi un ordre total∀x,y∈ [1,N] , tablo[x] ≤ tablo[y] ou tablo[y] ≤ tablo[x]
Version étudiants Unice
Recherche dichotomique exemple
1 3 5 6 10 11 14 25 26 40 41 78
Recherche de l’élément 78
1 3 5 6 10 11 14 25 26 40 41 78 11 ≤ 78
14 25 26 40 41 78 26 ≤ 78
78 = 7878
40 41 78 41 ≤ 78
4 opérations pour trouver le bon élément
Combien pour une recherche séquentielle?
Version étudiants Unice
Recherche dichotomique - Algorithme
• On recherche l’élément x• Si tableau vide, fin• Prendre un élément au hasard (ak)• Comparer cet élément à celui recherché
– x == ak : élément trouvé
– x ≤ ak : chercher l’élément avant– x ≥ ak : chercher l’élément après
Version étudiants Unice
Recherche dichotomique - Algorithme
entier g ←1;entier d ← N;entier indiceTest ←1;booléen trouve ← faux; tant que ((g ≤ d) et (~trouve)) {
indiceTest ← (d-g)/2;si (tablo[indiceTest] = x)
si (tablo[indiceTest] < x)
si (tablo[indiceTest] > x)
}
Version étudiants Unice
Recherche dichotomique - Algorithme
• Invariant de boucle(g ≤ d) etet
• Sortie de boucletrouve ou ((g > d) etet
• Ce qui implique
Version étudiants Unice
Recherche dichotomique - Complexité
• Soit un tableau de taille N• La première moitié du tableau aura pour taille
N/2• La prochaine recherche se fera sur un tableau
de taille ½ * N/2 = N/22
• Le nombre maximum de recherches est donc le plus grand entier p tel que 2p ≤ N– « Combien de fois peut-on couper N en 2 ?»
• On en conclut p≈• D’où une complexité dans le pire des cas en
Version étudiants Unice
Arbres binaires de recherche - 1
• Chaque nœud de notre arbre est représentépar un objet
• Chaque nœud possède – Un champs clé– Un pointeur vers son fils gauche: gauche
– Un pointeur vers son fils droit: droit– Un pointeur vers son parent: parent
• L’arbre T est référencé par sa racine– Si T.racine = NIL l’arbre est vide
Version étudiants Unice
Arbre binaire de recherche - 2
• Un ABR a la propriété suivante:Pour chaque nœud x, tous les éléments du sous arbregauche (resp. droit) ont des clés inférieures (resp.supérieurs) ou égales à celle de x.
• Rappels– La hauteur d’un arbre est la profondeur maximum de ses
nœuds– Un arbre complet de hauteur h a 2h+1-1 nœuds
• Successeur:Le successeur de x est le plus petit y tel que y > x
• On cherche dans un ABR en utilisant une méthode de dichotomie
Version étudiants Unice
Cherchez l’ABR
• Des arbres suivants, lesquels sont des ABR?
5
9
3
2
1 3 10
5
4
1 6
5
7
6 8
5
7
6
2
1 3 8
7
5
6
2
1 3 8
5
7
6
2
1 8
Version étudiants Unice
Parcours infixe
• Comment afficher les éléments du plus petit au plus grand?
parcoursInfix(noeud x) {si x ≠ NIL
parcoursInfix(x.gauche);afficher(x);parcoursInfix(x.droit);
}
• Complexité?• Autres parcours?
Version étudiants Unice
Recherche• La recherche se fait par dichotomie
rechercher(noeud x, clé k) {si x = NIL ou x.clé = k
alors retourne x;si k < x.clé
rechercher(x.gauche,k);sinon
rechercher(x.droit,k);}
5
7
6
2
1 3 8
Rechercher 3: 5 → 2 → 3
Rechercher 6: 5 → 7 → 6
Version étudiants Unice
Recherche - 2
• Proposition : la complexité de la recherche dans un arbre binaire pour le pire des cas est O(h) avec h hauteur de l’arbre
• Preuve :
Version étudiants Unice
Insertion - 1
• Permet d’ajouter un nouveau nœud à un arbre
• L’insertion modifie la structure de l’arbre et doit donc s’assurer de la conservation de sa propriété
5
7
6
2
1 3 8
5
7
6
2
1 3 8
Inserer(15)
9
Inserer(9)
15
Version étudiants Unice
Insertion - 2inserer(arbre T, nœud z) {y ← NILx ← T.racinetant que x ≠ NIL faire
y ← xsi z.clé < x.cléalors x ← x.gauche;sinon x ← x.droit;
si y = NIL alors T.racine ← z;sinon si z.clé < y.clé
alors y.gauche ← z;sinon y.droit ← z;
On cherche un nœud qui n’a pas de fils pour y ajouter z
L’arbre était en fait vide
On ajoute z a la « bonne »place
Version étudiants Unice
Suppression - 1
• La suppression enlève un nœud à l’arbre• Elle doit conserver la propriété de l’ABR
5
8
6
2
1 3 9
supprimer(15)
Supprimer(7)
5
7
6
2
1 3 8
15
9
• On distingue 3 cas pour la suppression
Version étudiants Unice
Suppression - 2
• Suppression d’un nœud sans fils (trivial)
5
7
6
2
1 3 8
supprimer(9)
5
7
6
2
1 3 8
15
9
15
Version étudiants Unice
Suppression - 3
• Suppression d’un nœud avec un unique fils (presque trivial)
5
8
6
2
1 3 9
supprimer(15)
5
7
6
2
1 3 8
15
9
Version étudiants Unice
Suppression - 4
• Suppression d’un nœud ayant 2 fils (non trivial)
6
82
1 3
Supprimer(5)
5
8
6
2
1 3 9
15
11
9
15
• On remplace le nœud à supprimer par son successeur et on supprime le successeur
Successeur de 5
7
7
11
Version étudiants Unice
Suppression - 5supprimer(arbre T, nœud z) {si z.gauche = NIL ou z.droit = NIL
alors y ← z sinon y ← successeur(z);
si y.gauche ≠ NILalors x ← y.gauche;sinon x ← y.droit;
si x ≠ NILalors x.parent ← y.parent
si y.parent = NILalors T.racine ← xsinon si y = y.parent.gauche
alors y.parent.gauche ← x;sinon y.parent.droit ← x;
Si y.clé ≠ z.cléalors copier(z,y);
Retourner y;
Détachement du noeud
Si le successeur a été détaché, on copie ses données
On cherche le nœud à détacher
Version étudiants Unice
Analyse de suppressionsupprimer(arbre T, nœud z) {si z.gauche = NIL ou z.droit = NILalors y ← z sinon y ← successeur(z);
si y.gauche ≠ NILalors x ← y.gauche;sinon x ← y.droit;
si x ≠ NILalors x.parent ← y.parent
si y.parent = NILalors T.racine ← xsinon si y = y.parent.gauche
alors y.parent.gauche ← x;sinon y.parent.droit ← x;
Si y.clé ≠ z.cléalors copier(z,y);
Retourner y;
y est fils gauche de son père
On relie le fils de y avec son père
x devient fils gauche du père de y
On n’a pas supprimé celui qui était spécifié mais son successeur
z a 0 ou 1 fils
Version étudiants Unice
5
8
6
2
1 3 9
15
11
7
Exemple de suppressionsupprimer(arbre T, nœud z) {si z.gauche = NIL ou z.droit = NIL
alors y ← z sinon y ← successeur(z);
si y.gauche ≠ NILalors x ← y.gauche;sinon x ← y.droit;
si x ≠ NILalors x.parent ← y.parent
si y.parent = NILalors T.racine ← xsinon si y = y.parent.gauche
alors y.parent.gauche ← x;sinon y.parent.droit ← x;
Si y.clé ≠ z.cléalors copier(z,y);
Retourner y;
z
y
x
Version étudiants Unice
5
8
6
2
1 3 9
15
11
7
Exemple de suppressionsupprimer(arbre T, nœud z) {si z.gauche = NIL ou z.droit = NIL
alors y ← z sinon y ← successeur(z);
si y.gauche ≠ NILalors x ← y.gauche;sinon x ← y.droit;
si x ≠ NILalors x.parent ← y.parent
si y.parent = NILalors T.racine ← xsinon si y = y.parent.gauche
alors y.parent.gauche ← x;sinon y.parent.droit ← x;
Si y.clé ≠ z.cléalors copier(z,y);
Retourner y;
z
y
x
Version étudiants Unice
5
8
6
2
1 3 9
15
11
7
Exemple de suppressionsupprimer(arbre T, nœud z) {si z.gauche = NIL ou z.droit = NIL
alors y ← z sinon y ← successeur(z);
si y.gauche ≠ NILalors x ← y.gauche;sinon x ← y.droit;
si x ≠ NILalors x.parent ← y.parent
si y.parent = NILalors T.racine ← xsinon si y = y.parent.gauche
alors y.parent.gauche ← x;sinon y.parent.droit ← x;
Si y.clé ≠ z.cléalors copier(z,y);
Retourner y;
z
y
x
Version étudiants Unice
6
8
5
2
1 3 9
15
11
7
Exemple de suppressionsupprimer(arbre T, nœud z) {si z.gauche = NIL ou z.droit = NIL
alors y ← z sinon y ← successeur(z);
si y.gauche ≠ NILalors x ← y.gauche;sinon x ← y.droit;
si x ≠ NILalors x.parent ← y.parent
si y.parent = NILalors T.racine ← xsinon si y = y.parent.gauche
alors y.parent.gauche ← x;sinon y.parent.droit ← x;
Si y.clé ≠ z.cléalors copier(z,y);
Retourner y;
z
y
x
Version étudiants Unice
Résumé
• Nous avons étudié 3 opérations– Recherche
– Ajout – Suppression
• Toutes ont une complexité en O(h) avec h hauteur de l’arbre
• Bonne nouvelle: un arbre complet de nnœuds à une hauteur de log2(n+1)-1…
• … et les arbres qu’on trouve dans la nature?
Version étudiants Unice
Problème de l’équilibrage
• Ces deux arbres contiennent les mêmes données
• Mais leur hauteur est très différente• Il vaut mieux avoir l’arbre gauche ( ) que celui de
droite ( )
ajouter(5);
ajouter(2);
ajouter(3);
ajouter(1);
ajouter(7);
ajouter(6);
ajouter(8);
ajouter(8);
ajouter(7);
ajouter(6);
ajouter(5);
ajouter(3);
ajouter(2);
ajouter(1);
Version étudiants Unice
Arbres équilibrés
• Un arbre est dit équilibré si pour chacun de ses nœuds, les sous arbres diffèrent d’au plus 1 en profondeur
Version étudiants Unice
Arbres équilibrés - 2
• Pourquoi avoir des arbres équilibrés?• Parce que dans le pire des cas, la recherche
est en O(log(n))!• Preuve?
– On a vu que la recherche dans un ABR est O(h) avec h hauteur de l’arbre dans le pire des cas
– Il nous faut donc montrer que la hauteur d’un arbre équilibréé est O(log(n))
Version étudiants Unice
Hauteur d’un arbre équilibré
• On va chercher le nombre minimum de nœuds (pas feuilles) nécessaire pour construire un arbre de hauteur h
• Soit Th un arbre équilibré minimal de hauteur h avec nh nœuds.
• On a
n0 = 0
T1 =
T0 =
n1 = 1
Version étudiants Unice
Hauteur d’un arbre équilibré - 2
• On considère Th, h≥2. Il doit donc avoir un sous arbre de profondeur h-1 et un autre de profondeur h-1 ou h-2
• Les 2 cas sont-ils possibles?
Th
Th-1 Th-1 Th-1 Th-2
Version étudiants Unice
Hauteur d’un arbre équilibré - 3
• On considère Th, h≥2. Il doit donc avoir un sous arbre de profondeur h-1 et un autre de profondeur h-1 ou h-2.
• Pour tout k, un arbre de hauteur k a un sous arbre de hauteur k-1. Donc pour certains nk > nk-1
• Supposons que les deux sous arbres de Th sont Th-1et Th-1
– alors on pourrait en remplacer un par Th-2 et garder la propriété d’équilibrage
– on aurait alors moins de nœuds car nh-1 > nh-2
– notre arbre ne serait donc pas minimal: CONTRADICTION!
Version étudiants Unice
Hauteur d’un arbre équilibré - 4
• Th a donc a un sous arbre Th-1 et un autre Th-2
Th = nh = nh-1 + nh-2 +1
Th-1 Th-2
• Ça ressemble étrangement à la suite de Fibonacci!
• On montre (pas ici) que
12
51
5
1
2
51
5
122
−
−−
+=++ hh
hn
Version étudiants Unice
Hauteur d’un arbre équilibré - 5
• Étant donné que le terme sera petit
• Donc
• Comme nh nombre minimal de nœuds pour un arbre équilibré de hauteur h, tout autre arbre équilibré de hauteur h aura n nœuds tel que
• Ce qui donne
Version étudiants Unice
Complexité des opérations
• Nous avons donc montré qu’un arbre équilibrécompose de n nœuds aura une hauteur majorée par 1.44log(n+1)
• On sait que les opérations d’ajout/recherche/suppression dans un arbre dans le pire des cas ont une complexité en O(h)
• Conclusion: Dans un arbre binaire équilibrécomposé de n noeuds, les opérations d’ajout, de recherche et de suppression ont une complexitédans le pire des cas en O(ln(n)).