Complexité et les ABR

Transcription

Complexité et les ABR
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Programmation avancée
Chapitre 1 : Complexité et les ABR (arbres binaires de
recherche)
Mickaël Foursov1
1 IFSIC
Université de Rennes-1
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
M2Crypto, octobre 2011
Plan du cours
PROG
CM1
Mickaël
Foursov
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
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Algorithmes
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Définition
Algorithme : spécification bien définie d’un schéma de
calcul sous forme d’une suite (finie) des opérations
élémentaires obéissant à un enchaînement déterminé
Diviser pour
régner
décrit par des spécifications
Divers
traduit par un programme dans un langage informatique
Les ABR
devant être exécuté sur une machine
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
(éventuellement) sur un jeu de données
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
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 place
mémoire de stockage des instructions et des données du
programme et de manipulation des données.
But : comparer des algorithmes.
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Résumé sur une machine donnée :
On souhaite pouvoir dire l’algo A, implémenté par le
programme P, sur l’ordinateur O, exécute sur les données D
utilise k secondes de calcul et j bits de mémoire.
Temps : nombre de cycles machine lors de l’exécution du
programme en comptant le nombre d’opérations effectuées
et le temps pour chaque opération.
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Place mémoire : nombre de mots mémoire.
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Résultats plus généraux, indépendants de la machine, du
langage de programmation, des compilateurs, . . ., liés à la
machine donnée.
∀ la machine, ∀ le langage, A1 est “meilleur” que A2 pour
des données de grande taille (à partir de telle taille).
ou bien
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
A1 est “optimal” (en nombre de opérations) pour résoudre
ce problème.
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Choix des mesures :
recherche des opérations fondamentales tq le temps
d’exécution soit toujours proportionnel au nombre de ces
opérations. Donc donne une mesure simplifiée du temps
d’exécution.
Exemples d’opérations fondamentales :
recherche d’un élément dans une liste : nombre de
comparaisons 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 de
comparaisons entre 2 élts + nombre de déplacement
d’élts
multiplication de matrices : nombre de * et de +
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Choix des mesures :
recherche des opérations fondamentales tq le temps
d’exécution soit toujours proportionnel au nombre de ces
opérations. Donc donne une mesure simplifiée du temps
d’exécution.
Exemples d’opérations fondamentales :
recherche d’un élément dans une liste : nombre de
comparaisons 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 de
comparaisons entre 2 élts + nombre de déplacement
d’élts
multiplication de matrices : nombre de * et de +
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Soit un algo A pour résoudre un problème P. Peut-on
trouver un algo B meilleur que A ou A est-il “optimal” pour
ce problème P ?
Parfois on ne connaît qu’un ordre de grandeur de la
complexité optimale de la classe de problèmes résolvant P.
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Il est établi que la résolution de problème de multiplication
de 2 matrices n × n demande au moins n? multiplications. ∃
un algo de nlg 7 (Strassen) et en n2,376 . Mieux ?
L’approche “Diviser pour régner”
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Séparer le problème en plusieurs sous–problèmes
similaires au problème initial, mais de taille moindre,
résoudre les sous–problèmes de façon récursive, puis
combiner ces solutions pour retrouver une solution au
problème initial.
Diviser le problème en un certain nombre de
sous–problèmes.
Régner sur les sous–problèmes en les résolvant
récursivement. Par ailleurs, si la taille d’un
sous–problème est assez réduite, on peut le résoudre
directement.
Combiner les solutions aux sous–problèmes en une
solution complète pour le problème initial.
Tri fusion
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Diviser : Diviser la séquence de n éléments à trier en 2
sous–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ées
pour 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);
}
}
Analyse du tri fusion
PROG
CM1
Mickaël
Foursov
Diviser : Se fait en temps constant.
Introduction
Régner : 2 pb de taille n/2, donc 2T(n/2).
Complexité en
temps d’un
algo
Diviser pour
régner
Combiner : merge prend un temps Θ(n).
Donc
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
T (n) =
(
Θ(1),
si n = 1
2T (n/2) + Θ(n), si n > 1
Mais comment trouver la solution sous forme close ?
Compromis temps–mémoire
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
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 texte
chiffré 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.
Attaque par le milieu (meet–in–the–middle)
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Une attaque dite par le milieu (meet-in-the-middle)
réduit le temps à 2k opérations, au prix d’espace
mémoire considérable 2k .
On effectue des chiffrements du texte clair par toutes
les clés possibles et on les range dans une table.
Puis on effectue un déchiffrement du texte chiffré par
toutes les clés possibles.
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Enfin on compare ensuite les deux listes pour trouver
des textes identiques.
Une deuxième paire texte clair/texte chiffré permet
d’éliminer les paires de clés incorrectes.
Suppression
Analyse
Donc, le chiffrement double n’est jamais utilisé.
Attaque d’anniversaires sur les fonctions de
hachage
PROG
CM1
Mickaël
Foursov
Une fonction de hachage cryptographique envoie des
mots binaires de taille arbitraire sur des mots binaires
de taille fixe n.
Introduction
Cela sert par exemple dans la signature électronique.
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
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 messages
avec la même valeur de hachage.
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Combien de tests faut-il effectuer (en prenant 2
messages au hasard à chaque fois) pour trouver une
collision ?
Définition d’un ABR
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Définition
Un arbre binaire de recherche (ABR) est un arbre binaire
t.q. les n nœuds de l’arbre représentent les n éléments de
l’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, ont
une valeur(strictement)supérieure ou égale à celle de n
Une lecture symétrique donne les éléments dans l’ordre
croissant.
Les sous–arbres gauche et droit sont aussi des ABR.
Définition d’un ABR
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Définition
Un arbre binaire de recherche (ABR) est un arbre binaire
t.q. les n nœuds de l’arbre représentent les n éléments de
l’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, ont
une valeur(strictement)supérieure ou égale à celle de n
Une lecture symétrique donne les éléments dans l’ordre
croissant.
Les sous–arbres gauche et droit sont aussi des ABR.
Définition d’un ABR
PROG
CM1
Mickaël
Foursov
On considère l’ABR repéré par un pointeur sur sa racine. (Si
le sous–arbre dans lequel on cherche es vide, alors échec.)
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
type abr = noeud*;
struct noeud
{
item val;
abr g,d;
}
Recherche dans un ABR
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Principe de la recherche dans un ABR : comparer l’élément
cherché 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–arbre
droite d(A)
si x < val(A), alors recherche dans le sous–arbre
gauche d(A)
Adjonction aux feuilles
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
On compare l’élément à la racine pour savoir si l’ajout sera
dans le sous–arbre gauche ou droit et on rappelle la
procédure récursivement. Le dernier appel récursif se fait
sur un arbre vide et on a alors à cette place le nœud
contenant l’élément à ajouter.
Adjonction à la racine
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
On peut ajouter un élément à n’importe quel niveau, en
particulier à la racine.
L’adjonction à la racine peut présenter un intérêt si on désire
privilé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 contienne
les éléments inférieurs à x et A2 les éléments supérieurs, et
puis on construit l’arbre.
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Remarque : on ne visite que les nœuds situés sur le chemin
suivi lors de la recherche de X à partir de la racine.
Adjonction à la racine
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
On peut ajouter un élément à n’importe quel niveau, en
particulier à la racine.
L’adjonction à la racine peut présenter un intérêt si on désire
privilé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 contienne
les éléments inférieurs à x et A2 les éléments supérieurs, et
puis on construit l’arbre.
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Remarque : on ne visite que les nœuds situés sur le chemin
suivi lors de la recherche de X à partir de la racine.
Adjonction à la racine
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
On peut ajouter un élément à n’importe quel niveau, en
particulier à la racine.
L’adjonction à la racine peut présenter un intérêt si on désire
privilé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 contienne
les éléments inférieurs à x et A2 les éléments supérieurs, et
puis on construit l’arbre.
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Remarque : on ne visite que les nœuds situés sur le chemin
suivi lors de la recherche de X à partir de la racine.
Adjonction à la racine
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
On peut ajouter un élément à n’importe quel niveau, en
particulier à la racine.
L’adjonction à la racine peut présenter un intérêt si on désire
privilé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 contienne
les éléments inférieurs à x et A2 les éléments supérieurs, et
puis on construit l’arbre.
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Remarque : on ne visite que les nœuds situés sur le chemin
suivi lors de la recherche de X à partir de la racine.
Adjonction à la racine
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
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;
}
}
Adjonction à la racine
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
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));
}
}
Adjonction à la racine
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
void ajout_racine(item x, abr A)
{
abr R = new abr();
val(R) = x;
coupure(x, A, g(R), d(R));
A = R;
}
Suppression dans un ABR
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
suppression d’une feuille : cas simple
suppression d’un nœud n’ayant qu’un fils : remettre le
fils à la place
suppression d’un nœud ayant 2 fils : il faut chercher
l’é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 ou
SUPMAX.
Analyse recherche/adjonction/suppression
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
Recherche
Dans le cas d’un succès = 2 * profondeur(x) + 1
Dans le cas d’un échec = 2 * (profondeur(y) + 1)
Ajout aux feuilles : profondeur(y) + 1
Ajout à la racine : profondeur(y) + 1
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Suppression : même que la recherche de x dans l’arbre
+ complexité de supmax
Profondeur d’un nœud dans un ABR
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Profondeur des arbres : entre 0 et n-1 (arbres
dégénérés). Donc θ(n), la même que pour les listes.
Diviser pour
régner
Profondeur des arbres bien équilibrés : θ(log n).
Divers
Les ABR
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Profondeur dans les ABR aléatoires
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
On considère que toutes les permutations des valeurs sont
équiprobables.
Exemple : n = 3.
On peut montrer que la profondeur moyenne dans un ABR
est de l’ordre de log2 (n).
Divers
Les ABR
Pour les nœuds internes PI(n) = 1(1 + n1 )Hn − 4.
Recherche
Ajout aux
feuilles
Ajout à la
racine
Suppression
Analyse
Pour les
externes PE (n) = 2Hn+1 − 2, où
Pnnœuds
1
Hn = i=1 n .
Complexité dans les ABR
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
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
Divers
Les ABR
Recherche
Conclusion :
Ajout aux
feuilles
en moyenne θ(log n)
Ajout à la
racine
en pire θ(n)
Suppression
Analyse
Complexité dans les ABR
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
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
Divers
Les ABR
Recherche
Conclusion :
Ajout aux
feuilles
en moyenne θ(log n)
Ajout à la
racine
en pire θ(n)
Suppression
Analyse
Complexité dans les ABR
PROG
CM1
Mickaël
Foursov
Introduction
Complexité en
temps d’un
algo
Diviser pour
régner
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
Divers
Les ABR
Recherche
Conclusion :
Ajout aux
feuilles
en moyenne θ(log n)
Ajout à la
racine
en pire θ(n)
Suppression
Analyse

Documents pareils