1 Introduction à l algorithmique David Cachera ENS Cachan Bretagne
2 Plan Introduction à l algorithmique Notion de complexité Recherche dichotomique Calculs de puissance
3 Un peu d histoire Etymologie algiros (pénible, malade) + arithmos (nombre) = algorisme Abu Mohammed ibn Mûsâ al-khowârizmî (IX e s) Al-jabr wa'l-muqabalah «remise en place et simplification» : règles de calcul sur la représentation décimale Moyen-âge : algoristes vs. abaquistes
Un peu d histoire : machines 4
5 Un peu d histoire XIX e -XX e siècles : du calcul à la procédure fin XIX e : axiomatisation des mathématiques (Cantor, Bolzano...) quels problèmes peut-on résoudre de façon mécanique? pas de machine concrète : dispositif abstrait programme de Hilbert : décrire et prouver les résultats mathématiques de façon finitaire et systématique impossible : Gödel
6 Procédure effective : différents modèles idée commune : décomposition en calculs élémentaires fonctions récursives circuits machine de Turing (1936) tous sont équivalents!
7 Définition (Universalis) : «spécification d'un schéma de calcul, sous forme d'une suite d'opérations élémentaires obéissant à un enchaînement déterminé.»... insuffisante : nombre fini de données nombre fini d étapes, chaque étape étant formée d un nombre fini d opérations effectives terminaison déterminisme programme : description d un algorithme dans un langage «compris» par une machine
8 Calculabilité et complexité Peu de problèmes ont une solution algorithmique problème de l arrêt : il n existe pas de programme qui, étant donné le texte d un programme, répond «oui» si celui-ci s arrête en temps fini, «non» sinon résultat indépendant de la modélisation de la notion de programme (ou algorithme) théorie de la calculabilité (décidabilité)
9 Calculabilité et complexité Pour ceux qui admettent une solution, les algorithmes sont-ils utilisables en pratique? pour un problème donné, il peut y avoir plusieurs algorithmes différents plus ou moins adaptés à un langage de programmation donné utilisant plus ou moins de ressources de calcul temps mémoire évaluation de la complexité
10 Complexité Évaluer le nombre d opérations élémentaires (ou la quantité de mémoire) nécessaires à l exécution de l algorithme. Notion robuste Indépendante d un ordinateur donné Indépendante du langage de programmation, du compilateur Exprimée en fonction de la taille de la donnée à traiter Modèle abstrait Pas un temps en microsecondes Pas un nombre exact : ordre de grandeur opération élémentaire Opération qui prend un temps considéré comme constant Réalisme du modèle? ex coût de transfert vs. coût de calcul Mais les méthodes de calcul restent les mêmes
11 Un premier exemple : recherche d un élément dans une collection
12 Recherche d un élément dans une collection? Modélisation du problème : un tableau T de n éléments chaque élément est indicé par un entier entre 1 et n on recherche l élément X en parcourant tout le tableau on s arrête dès qu on a trouvé X
13 Algorithme pour i = 0 à n-1 faire si T[i] = X alors sortir fin pour Remarques pseudo-code : pas un langage de programmation pas de déclaration préalable des objets comment sait-on que X a été trouvé? si i < n, i est l indice minimal d une case du tableau contenant X
14 Correction de l algorithme L algorithme termine toujours (boucle pour, sans modification de i) Si à la fin i<n, c est qu on est sorti de la boucle avant sa terminaison normale, donc T[i] = X Sinon? Notion d invariant de boucle à chaque retour au début de la boucle, on vérifie la propriété I : pour tout k tel que 0!k<i, T[k] " X conservation de l invariant on note i la valeur de i après l exécution du corps de la boucle : si T[i]=X alors i =i sinon i =i+1 si I est vrai pour i, alors I est vrai pour i si à la fin i=n, l invariant nous permet de conclure que X n est pas dans T l invariant nous fournit aussi la minimalité de i
15 Complexité maximale pour i = 0 à n-1 faire si T[i] = X alors sortir fin pour Questions fondamentales : que compter? En fonction de quoi? Paramètre : taille du tableau (n) Opération élémentaire comparaison T[i]=X hypothèse de complexité unitaire Complexité au pire : n comparaisons de X à T[i] Cmax(n) = n
16 Complexité en moyenne De façon générale, pour un algorithme A, Cmoy(n)=!d Dn p(d).c(a,d) Dn : ensemble des données de taille n p(d) : probabilité d avoir la donnée d en entrée de l algorithme C(A,d) : coût de l algorithme A sur la donnée d On a la relation Cmin(n) " Cmoy(n) " Cmax(n)
17 Complexité en moyenne pour i = 0 à n-1 faire si T[i] = X alors sortir fin pour Ici, on considère tous les éléments de T sont distincts q la probabilité que X soit dans T si X est dans T, toutes les positions sont équiprobables Pour i entre 0 et n-1, on note Di les données où X apparaît à la i e place, et D0 celles où X est absent. On a alors p(di)=q/n et p(d0)=1- q C(A,d) = i+1 si d Di, C(A,d)= n si d D0 donc Cmoy(n)=(1- q).n +! (i+1).(q/n)=(1- q).n + (n +1).q/2
18 Ordres de grandeur f O(g) «f=o(g)» il existe une constante positive c et un entier n0 tels que f(n)! c. g(n) pour tout n # n0 f est dominée asymptotiquement par g f $(g) il existe deux constantes positives c et C et un entier n0 tels que C. g(n)! f(n)! c. g(n) pour tout n # n0 f et g sont de même ordre de grandeur asymptotique temps constant linéaire O(c)!(n) quadratique!(n 2 ) polynomial O(n p ) (au plus) exponentiel O(2 np )
19 Ordres de grandeur n 10 50 100 300 n " log2(n) 33 282 665 2469 n 2 100 2500 10000 90000 n 3 1000 125 000 1 000 000 27. 10 6 n 5 100 000 312 500 000...(11 chiffres)...(13 chiffres) 2 n 1024...(16 chiffres)...(31 chiffres)...(91 chiffres) nombre de protons dans l univers : 79 chiffres nombres de secondes depuis le big bang : 24 chiffres
Recherche dichotomique 20
21 Recherche dichotomique Recherche d un élément dans un tableau linéaire au pire et en moyenne Peut-on faire mieux? tableau trié : recherche dichotomique Image: dan / FreeDigitalPhotos.net
22 Recherche dichotomique On recherche l élément X dans le tableau T, de taille n soit M l élément au milieu de T si X=M, fin de la recherche si X>M, X ne peut se trouver que dans la moitié droite de T si X<M, X ne peut se trouver que dans la moitié gauche de T g??? d 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
23 Recherche dichotomique g:=0 ; d:=n-1 tant que g d faire m:=(g+d) div 2 si X=T[m] alors res:=m ; sortir sinon si X<T[m] alors d:=m-1 sinon g:=m+1 fin tant que si g>d alors res:=0 Remarque : g et d peuvent «dépasser» des bornes de T, mais pas m
24 Correction Il faut montrer que l algorithme termine toujours s il existe un entier i entre 1 et n tel que T[i]=X alors l algorithme termine avec res entre 1 et n tel que T[res]=X réciproquement, si res est strictement positif à la fin, c est que X est dans le tableau Terminaison on considère la suite (gi,di) des bornes dans les itérations successives de la boucle g0=0 et d0=n-1 mi=(gi+di) div 2 à l itération k, si gk>dk ou si T[mk]=X alors on sort de la boucle si gk!dk et X<T[mk], il y a une nouvelle itération avec gk+1=gk et dk+1=mk-1<dk le cas X>T[mk] est symétrique la suite des écarts (dk - gk) est donc strictement décroissante
25 Correction Retour d un résultat toujours avec la suite (gi,di), on considère p l indice d arrêt : pour k<p on a gk!dk, et soit gp>dp, soit X=T[mp] on montre par récurrence sur k la propriété P suivante pour tout k entre 0 et p, il existe un entier ik tel que gk! ik!dk et T[ik]=X
26 Complexité de la recherche dichotomique On évalue le nombre de comparaisons entre X et T[m] À chaque itération, la taille de la portion de T dans laquelle se fait la recherche est divisée par 2 Relation de récurrence : C(n)! 2 + C(n div 2) On montre par récurrence forte sur n que C(n)! 2 log2(n) + 2 vrai pour n=1 si vrai pour k<n, alors C(n)! 2 + (2 log2(n div 2) + 2)! 2 + (2 log2(n/2) + 2)! 2 + 2 log2(n) Complexité au pire en O(log2(n)) (en fait, $(log2 (n)) ) Complexité en moyenne : aussi en $(log2 (n)) (plus difficile)
Calcul de puissance 27
28 Algorithme de multiplication Complexité? x Algorithme naïf : complexité en O(n 2 ), où n est la taille (nombre de chiffres) des opérandes Rem : il existe des solutions (logicielles et matérielles) plus astucieuses...
29 Calcul de A n A quoi ça sert? puissances de grands entiers : cryptographie (RSA) chemins dans des graphes : puissances de matrices Algo naïf : A A A A A A A... A : n-1 multiplications On va essayer d être plus efficace si n est une puissance de 2 : A, A 2, A 4,... A n si n est pair : A n = (A n/2 ) 2 si n est impair : A n = A A n-1 on va s appuyer sur le codage binaire de n n pair : l écriture binaire de n se termine par 0 n impair : l écriture binaire de n se termine par 1 ex. n = 23 : 10111
30 Algorithme «SX» [Inde - II e s av JC] 10111 =10110+1=1011*2+1: A 10111 =A carre(a 1011 ) A 23 =A carre(a carre(a carre(carre(a 1)))) puissances successives : 1 2 4 5 10 11 22 23 on transforme l écriture binaire de n 0 donne S (square) 1 donne SX (square and multiply) ex : 23 donne SXSSXSXSX algo : commencer à 1 lire le mot de S et X de gauche à droite S : élévation au carré X : multiplication par A
31 Algo «SX» + pas de stockage intermédiaire - on commence par les poids forts nombre de multiplications : longueur binaire de n + nombre de 1 optimisation : commencer par A au lieu de 1 permet d économiser 2 multiplications
32 Dans l autre sens... Démarrage par les poids faibles? (multiplication des égyptiens) n = ak 2 k + ak-1 2 k-1 +... + a1 2 + a0 A n =(A 2k ) a k (A 2 k-1 ) a k-1 (A 2 ) a 1 (A) a 0 stocker les A p pour les puissances successives de 2 multiplier lorsque le bit correspondant est à 1
33 Dans l autre sens... r:=1 ; y:=a pour i de 0 à k faire si a[i]=1 alors r := r * y y := y * y fin pour Nombre de multiplications : longueur binaire de n + nombre de 1 Optimalité des méthodes binaires? ex. n=15=1111 6 avec SX optimisé A 15 =A5 A5 A5
34 Conclusion Algorithmique trouver des solutions effectives à un problème modélisation du problème notion de structure de données (ici tableau) souci d efficacité Calculs de complexité : analyse des algorithmes au pire (maximale), en moyenne moyenne : souvent techniques difficiles, notions de probabilité
35 Correction Retour d un résultat toujours avec la suite (gi,di), on considère p l indice d arrêt : pour k<p on a gk!dk, et soit gp>dp, soit X=T[mp] on montre par récurrence sur k la propriété P suivante pour tout k entre 0 et p, il existe un entier ik tel que gk! ik!dk et T[ik]=X la propriété P est vraie pour k=0 supposons P vraie pour k<p par hypothèse de récurrence, gk!dk, et mk=(gk+dk) div 2 le cas X=T[mk] est impossible car k<p, il reste donc deux cas soit X<T[mk], et alors ik < mk puisque la liste est triée ; comme gk+1=gk et dk+1=mk -1, on a gk+1!ik!dk+1 et X=T[ik] : on pose ik+1=ik le deuxième cas est symétrique la récurrence est établie, on a donc gk! ik!dk, et X est bien découvert dans le tableau