Programmation avanc e - Chapitre 1 : Complexit et les ABR … · 2011-11-14 · Chapitre 1 :...
Transcript of Programmation avanc e - Chapitre 1 : Complexit et les ABR … · 2011-11-14 · Chapitre 1 :...
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Programmation avancéeChapitre 1 : Complexité et les ABR (arbres binaires de
recherche)
Mickaël Foursov1
1IFSICUniversité de Rennes-1
M2Crypto, octobre 2011
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Plan du cours
1 Introduction
2 Complexité en temps d’un algo
3 Diviser pour régner
4 Divers
5 Les ABR
6 Recherche
7 Ajout aux feuilles
8 Ajout à la racine
9 Suppression
10 Analyse
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Algorithmes
Définition
Algorithme : spécification bien définie d’un schéma decalcul sous forme d’une suite (finie) des opérationsélémentaires obéissant à un enchaînement déterminé
décrit par des spécifications
traduit par un programme dans un langage informatique
devant être exécuté sur une machine
(éventuellement) sur un jeu de données
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Objectifs : quantifier
le temps d’exécution
la place mémoire nécessaire
pour exécuter le programme.
On s’intéresse donc au temps d’exécution et à la placemémoire de stockage des instructions et des données duprogramme et de manipulation des données.
But : comparer des algorithmes.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Résumé sur une machine donnée :On souhaite pouvoir dire l’algo A, implémenté par leprogramme P, sur l’ordinateur O, exécute sur les données Dutilise k secondes de calcul et j bits de mémoire.
Temps : nombre de cycles machine lors de l’exécution duprogramme en comptant le nombre d’opérations effectuéeset le temps pour chaque opération.
Place mémoire : nombre de mots mémoire.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Résultats plus généraux, indépendants de la machine, dulangage de programmation, des compilateurs, . . ., liés à lamachine donnée.
∀ la machine, ∀ le langage, A1 est “meilleur” que A2 pourdes données de grande taille (à partir de telle taille).
ou bien
A1 est “optimal” (en nombre de opérations) pour résoudrece problème.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Choix des mesures :recherche des opérations fondamentales tq le tempsd’exécution soit toujours proportionnel au nombre de cesopérations. Donc donne une mesure simplifiée du tempsd’exécution.
Exemples d’opérations fondamentales :
recherche d’un élément dans une liste : nombre decomparaisons entre 2 éléments
recherche d’un élément sur un disque ; nombre d’accèsà la mémoire secondaire
tri interne d’une liste d’éléments : nombre decomparaisons entre 2 élts + nombre de déplacementd’élts
multiplication de matrices : nombre de * et de +
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Choix des mesures :recherche des opérations fondamentales tq le tempsd’exécution soit toujours proportionnel au nombre de cesopérations. Donc donne une mesure simplifiée du tempsd’exécution.
Exemples d’opérations fondamentales :
recherche d’un élément dans une liste : nombre decomparaisons entre 2 éléments
recherche d’un élément sur un disque ; nombre d’accèsà la mémoire secondaire
tri interne d’une liste d’éléments : nombre decomparaisons entre 2 élts + nombre de déplacementd’élts
multiplication de matrices : nombre de * et de +
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Soit un algo A pour résoudre un problème P. Peut-ontrouver un algo B meilleur que A ou A est-il “optimal” pource problème P ?
Parfois on ne connaît qu’un ordre de grandeur de lacomplexité optimale de la classe de problèmes résolvant P.
Il est établi que la résolution de problème de multiplicationde 2 matrices n × n demande au moins n? multiplications. ∃un algo de nlg 7 (Strassen) et en n2,376. Mieux ?
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
L’approche “Diviser pour régner”
Séparer le problème en plusieurs sous–problèmessimilaires au problème initial, mais de taille moindre,résoudre les sous–problèmes de façon récursive, puiscombiner ces solutions pour retrouver une solution auproblème initial.
Diviser le problème en un certain nombre desous–problèmes.
Régner sur les sous–problèmes en les résolvantrécursivement. Par ailleurs, si la taille d’unsous–problème est assez réduite, on peut le résoudredirectement.
Combiner les solutions aux sous–problèmes en unesolution complète pour le problème initial.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Tri fusion
Diviser : Diviser la séquence de n éléments à trier en 2sous–séquences de n/2 éléments.Régner : Trier les 2 sous–séquences récursivement àl’aide du tri fusion.Combiner : Fusionner les 2 sous–séquences triéespour produire la réponse triée.
void mergeSort(item[] a, int l, int r) {if (l < r){
int m = (l+r)/2;mergeSort(A,l,m);mergeSort(A,m+1,r);merge(A,l,m,r);
}}
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Analyse du tri fusion
Diviser : Se fait en temps constant.
Régner : 2 pb de taille n/2, donc 2T(n/2).
Combiner : merge prend un temps Θ(n).
Donc
T (n) =
{
Θ(1), si n = 1
2T (n/2) + Θ(n), si n > 1
Mais comment trouver la solution sous forme close ?
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Compromis temps–mémoire
L’algorithme de chiffrement DES a des clés de 56 bits.
La recheche exhaustive nécessite donc 2k−1
opérations de chiffrement en moyenne.
Considérons maintenant le chiffrement double : le textechiffré est chiffré une nouvelle fois avec une autre clé,indépendante de la première.
Naïvement, la recherche exhaustive nécessiterait 22k−1
opérations en moyenne.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Attaque par le milieu (meet–in–the–middle)
Une attaque dite par le milieu (meet-in-the-middle)réduit le temps à 2k opérations, au prix d’espacemémoire considérable 2k .
On effectue des chiffrements du texte clair par toutesles clés possibles et on les range dans une table.
Puis on effectue un déchiffrement du texte chiffré partoutes les clés possibles.
Enfin on compare ensuite les deux listes pour trouverdes textes identiques.
Une deuxième paire texte clair/texte chiffré permetd’éliminer les paires de clés incorrectes.
Donc, le chiffrement double n’est jamais utilisé.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Attaque d’anniversaires sur les fonctions dehachage
Une fonction de hachage cryptographique envoie desmots binaires de taille arbitraire sur des mots binairesde taille fixe n.
Cela sert par exemple dans la signature électronique.
Mais il faut que le signataire ne puissent pas prétendreà avoir signé un autre message.
Donc, il faut qu’il soit infaisable de trouver 2 messagesavec la même valeur de hachage.
Combien de tests faut-il effectuer (en prenant 2messages au hasard à chaque fois) pour trouver unecollision ?
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Définition d’un ABR
Définition
Un arbre binaire de recherche (ABR) est un arbre binairet.q. les n nœuds de l’arbre représentent les n éléments del’ensemble, et
pour tout nœud n
tous les nœuds du sous–arbre gauche, s’il en existe,ont une valeur inférieure ou égale à celle de n
tous les nœuds du sous-arbre droit, s’il en existe, ontune valeur(strictement)supérieure ou égale à celle de n
Une lecture symétrique donne les éléments dans l’ordrecroissant.Les sous–arbres gauche et droit sont aussi des ABR.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Définition d’un ABR
Définition
Un arbre binaire de recherche (ABR) est un arbre binairet.q. les n nœuds de l’arbre représentent les n éléments del’ensemble, et
pour tout nœud n
tous les nœuds du sous–arbre gauche, s’il en existe,ont une valeur inférieure ou égale à celle de n
tous les nœuds du sous-arbre droit, s’il en existe, ontune valeur(strictement)supérieure ou égale à celle de n
Une lecture symétrique donne les éléments dans l’ordrecroissant.Les sous–arbres gauche et droit sont aussi des ABR.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Définition d’un ABR
On considère l’ABR repéré par un pointeur sur sa racine. (Sile sous–arbre dans lequel on cherche es vide, alors échec.)
type abr = noeud*;
struct noeud{
item val;abr g,d;
}
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Recherche dans un ABR
Principe de la recherche dans un ABR : comparer l’élémentcherché x à la valeur de la racine de l’arbre.
si x = val(A), alors succès
si x > val(A), alors recherche dans le sous–arbredroite d(A)
si x < val(A), alors recherche dans le sous–arbregauche d(A)
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Adjonction aux feuilles
On compare l’élément à la racine pour savoir si l’ajout seradans le sous–arbre gauche ou droit et on rappelle laprocédure récursivement. Le dernier appel récursif se faitsur un arbre vide et on a alors à cette place le nœudcontenant l’élément à ajouter.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Adjonction à la racine
On peut ajouter un élément à n’importe quel niveau, enparticulier à la racine.
L’adjonction à la racine peut présenter un intérêt si on désireprivilégier l’accès au(x) dernier(s) élément(s).
2 étapes : on coupe l’arbre A en A1 et A2 t.q. A1 contienneles éléments inférieurs à x et A2 les éléments supérieurs, etpuis on construit l’arbre.
Remarque : on ne visite que les nœuds situés sur le cheminsuivi lors de la recherche de X à partir de la racine.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Adjonction à la racine
On peut ajouter un élément à n’importe quel niveau, enparticulier à la racine.
L’adjonction à la racine peut présenter un intérêt si on désireprivilégier l’accès au(x) dernier(s) élément(s).
2 étapes : on coupe l’arbre A en A1 et A2 t.q. A1 contienneles éléments inférieurs à x et A2 les éléments supérieurs, etpuis on construit l’arbre.
Remarque : on ne visite que les nœuds situés sur le cheminsuivi lors de la recherche de X à partir de la racine.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Adjonction à la racine
On peut ajouter un élément à n’importe quel niveau, enparticulier à la racine.
L’adjonction à la racine peut présenter un intérêt si on désireprivilégier l’accès au(x) dernier(s) élément(s).
2 étapes : on coupe l’arbre A en A1 et A2 t.q. A1 contienneles éléments inférieurs à x et A2 les éléments supérieurs, etpuis on construit l’arbre.
Remarque : on ne visite que les nœuds situés sur le cheminsuivi lors de la recherche de X à partir de la racine.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Adjonction à la racine
On peut ajouter un élément à n’importe quel niveau, enparticulier à la racine.
L’adjonction à la racine peut présenter un intérêt si on désireprivilégier l’accès au(x) dernier(s) élément(s).
2 étapes : on coupe l’arbre A en A1 et A2 t.q. A1 contienneles éléments inférieurs à x et A2 les éléments supérieurs, etpuis on construit l’arbre.
Remarque : on ne visite que les nœuds situés sur le cheminsuivi lors de la recherche de X à partir de la racine.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Adjonction à la racine
void coupure(item x, abr A, abr& G, abr& D){
abr X, Y;if (A == null) then {
G = null; D = null;}else if x >= val(A) then {
coupure(x, d(A), X, Y);d(A) = X; G = A; D = Y;
}else {
coupure(x, g(A), X, Y);g(A) = Y; G = X; D = A;
}}
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Adjonction à la racine
void coupure(item x, abr A, abr& G, abr& D){
if (A == null) then {G = null; D = null;
}else if (x >= val(A)) then {
G = A;coupure(x, d(A), d(G), D);
}else {
D = A;coupure(x, g(A), G, g(D));
}}
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Adjonction à la racine
void ajout_racine(item x, abr A){
abr R = new abr();val(R) = x;coupure(x, A, g(R), d(R));A = R;
}
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Suppression dans un ABR
suppression d’une feuille : cas simple
suppression d’un nœud n’ayant qu’un fils : remettre lefils à la place
suppression d’un nœud ayant 2 fils : il faut chercherl’élément immédiatement supérieur ou inférieur(SUPMIN ou SUPMAX), l’échanger avec le nœud àsupprimer, et supprimer le nœud SUPMIN ouSUPMAX.
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Analyse recherche/adjonction/suppression
RechercheDans le cas d’un succès = 2 * profondeur(x) + 1Dans le cas d’un échec = 2 * (profondeur(y) + 1)
Ajout aux feuilles : profondeur(y) + 1
Ajout à la racine : profondeur(y) + 1
Suppression : même que la recherche de x dans l’arbre+ complexité de supmax
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Profondeur d’un nœud dans un ABR
Profondeur des arbres : entre 0 et n-1 (arbresdégénérés). Donc θ(n), la même que pour les listes.
Profondeur des arbres bien équilibrés : θ(log n).
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Profondeur dans les ABR aléatoires
On considère que toutes les permutations des valeurs sontéquiprobables.
Exemple : n = 3.
On peut montrer que la profondeur moyenne dans un ABRest de l’ordre de log2(n).
Pour les nœuds internes PI(n) = 1(1 + 1n )Hn − 4.
Pour les nœuds externes PE(n) = 2Hn+1 − 2, oùHn =
∑ni=1
1n .
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Complexité dans les ABR
maxrech+(n) = maxsupp(n) = 2n − 1
maxrech−(n) = 2n
maxajout(n) = n
moyrech+(n) = moysupp(n) = θ(log n) = 2PIn + 1
moyrech−(n) = 2PEn
moyajout(n) = PEn
Conclusion :
en moyenne θ(log n)
en pire θ(n)
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Complexité dans les ABR
maxrech+(n) = maxsupp(n) = 2n − 1
maxrech−(n) = 2n
maxajout(n) = n
moyrech+(n) = moysupp(n) = θ(log n) = 2PIn + 1
moyrech−(n) = 2PEn
moyajout(n) = PEn
Conclusion :
en moyenne θ(log n)
en pire θ(n)
PROGCM1
MickaëlFoursov
Introduction
Complexité entemps d’unalgo
Diviser pourrégner
Divers
Les ABR
Recherche
Ajout auxfeuilles
Ajout à laracine
Suppression
Analyse
Complexité dans les ABR
maxrech+(n) = maxsupp(n) = 2n − 1
maxrech−(n) = 2n
maxajout(n) = n
moyrech+(n) = moysupp(n) = θ(log n) = 2PIn + 1
moyrech−(n) = 2PEn
moyajout(n) = PEn
Conclusion :
en moyenne θ(log n)
en pire θ(n)