Cours Algo 3

44
Version étudiants Unice Cours d’algorithmique et structures de données MI2 2005/2006 Fabrice Huet ([email protected])

Transcript of Cours Algo 3

Page 1: Cours Algo 3

Version étudiants Unice

Cours d’algorithmique et structures de données

MI2 2005/2006

Fabrice Huet ([email protected])

Page 2: Cours Algo 3

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

Page 3: Cours Algo 3

Version étudiants Unice

Cours 7

Recherche séquentielleRecherche dichotomiqueArbres Binaires de Recherche

Page 4: Cours Algo 3

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.

Page 5: Cours Algo 3

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

Page 6: Cours Algo 3

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

Page 7: Cours Algo 3

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

Page 8: Cours Algo 3

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

Page 9: Cours Algo 3

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:

Page 10: Cours Algo 3

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

Page 11: Cours Algo 3

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]

Page 12: Cours Algo 3

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?

Page 13: Cours Algo 3

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

Page 14: Cours Algo 3

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)

}

Page 15: Cours Algo 3

Version étudiants Unice

Recherche dichotomique - Algorithme

• Invariant de boucle(g ≤ d) etet

• Sortie de boucletrouve ou ((g > d) etet

• Ce qui implique

Page 16: Cours Algo 3

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

Page 17: Cours Algo 3

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

Page 18: Cours Algo 3

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

Page 19: Cours Algo 3

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

Page 20: Cours Algo 3

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?

Page 21: Cours Algo 3

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

Page 22: Cours Algo 3

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 :

Page 23: Cours Algo 3

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

Page 24: Cours Algo 3

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

Page 25: Cours Algo 3

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

Page 26: Cours Algo 3

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

Page 27: Cours Algo 3

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

Page 28: Cours Algo 3

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

Page 29: Cours Algo 3

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

Page 30: Cours Algo 3

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

Page 31: Cours Algo 3

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

Page 32: Cours Algo 3

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

Page 33: Cours Algo 3

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

Page 34: Cours Algo 3

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

Page 35: Cours Algo 3

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?

Page 36: Cours Algo 3

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);

Page 37: Cours Algo 3

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

Page 38: Cours Algo 3

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))

Page 39: Cours Algo 3

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

Page 40: Cours Algo 3

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

Page 41: Cours Algo 3

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!

Page 42: Cours Algo 3

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

Page 43: Cours Algo 3

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

Page 44: Cours Algo 3

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)).