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