Récursion Complexité algorithmique Calcul de complexité Annexes c EPFL 2002–2012 J. Sam Introduction à la Programmation Objet : Récursivité Algorithmique et complexité Laboratoire d’Intelligence Artificielle Faculté I&C IPO – Cours 12 :– Récursivité | Complexité– – 1 / 56 Récursion Complexité algorithmique Calcul de complexité Annexes c EPFL 2002–2012 J. Sam Objectifs ◮ Introduire la notion de récursion ◮ Introduire les bases de l’algorithmique ◮ Introduire la notion de complexité algorithmique ◮ Vous apprendre à comparer deux algorithmes IPO – Cours 12 :– Récursivité | Complexité– – 2 / 56 Récursion Complexité algorithmique Calcul de complexité Annexes c EPFL 2002–2012 J. Sam Récursion La plupart des problèmes (par exemple, le tri d’un tableau, le calcul d’une équation), peuvent être résolus de différentes façons : ☞ différents algorithmes Une catégorie particulière de solutions est constituée des méthodes de résolution récursives. Le principe de l’approche récursive est de ramener le problème à résoudre à un sous-problème, version simplifiée du problème d’origine. ☞ Exemple en mathématiques : le raisonnement par récurrence IPO – Cours 12 :– Récursivité | Complexité– – 3 / 56 Récursion Complexité algorithmique Calcul de complexité Annexes c EPFL 2002–2012 J. Sam Exemple : Les tours de Hanoï Jeu des tours de Hanoï : déplacer une colonne de disques d’un pilier à un autre ◮ en utilisant un seul pilier de transition (c’est-à-dire 3 piliers en tout) ◮ en ne posant un disque que sur le sol ou sur un disque plus grand. IPO – Cours 12 :– Récursivité | Complexité– – 4 / 56
14
Embed
Introduction la Programmation Objet : [5pt] R cursivit ...icsam/ipo/documents/cours12.pdf · Récursion Complexité algorithmique Calcul de complexité Annexes c EPFL 2002–2012
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
◮ Introduire la notion de récursion◮ Introduire les bases de l’algorithmique◮ Introduire la notion de complexité algorithmique◮ Vous apprendre à comparer deux algorithmes
La plupart des problèmes (par exemple, le tri d’un tableau, lecalcul d’une équation), peuvent être résolus de différentes façons :☞ différents algorithmesUne catégorie particulière de solutions est constituée desméthodes de résolution récursives .Le principe de l’approche récursive est de
ramener le problème à résoudre à un sous-problème,version simplifiée du problème d’origine.
☞ Exemple en mathématiques : le raisonnement par récurrence
Idée : si je sais le faire pour une pile de n disques,je sais le faire pour n+1 disques
Démonstration :◮ Déplacer les n disques du haut sur le pilier de transition
(en utilisant la méthode que je connais par hypothèse)◮ Mettre le dernier disque sur le pilier destination◮ Redéplacer la tour de n disques du pilier de transition au pilier
destination (en utilisant le pilier initial comme transition).
Concrètement, un algorithme récursif sera implémenté en Javapar une/plusieurs méthodes récursivesComme la définition d’une méthode (i.e., son corps) peut faireappel à toute méthode accessible depuis un programme, elle peutdonc, en particulier, faire appel à elle-même.Une méthode qui fait appel à elle-même dans sa définition estappelée méthode récursive .☞ Pour être effectivement utilisable, une méthode récursive doitégalement contenir une condition d’arrêt .
Notez qu’il est parfois beaucoup mieux d’écrire la méthode sousune autre forme que la forme récursive.Si l’on reprend l’exemple de la somme des n premiers entiers :
S(n+1) = (n+1)+S(n)
mais on a aussi (!) :
S(n) =n
∑i=1
i
On préfèrera alors programmer le calcul de S(n) comme uneboucle (solution itérative) :
for ( int i= 1, s= 0; i <= n ; i++) {s += i;
}
plutôt que sous forme récursive !..Exercice : Comparer la vitesse des deux méthodes.
◮ Pour fib(46) , la solution récursive prend 19 secondes, alorsque le même résultat est obtenu en moins d’une millisecondeavec l’implémentation itérative! (AMD Athlon64 3000+)
On veut trier une liste L = x1, x2,. . . , xn, |L|= n◮ On divise L en deux sous-listes:
◮ L1 = x1,. . . , xi et L2 = xi+1,. . . , xn◮ |Li |= i et |L2|= j = n− i où i ≃ j (idéallement i = j)
◮ On trie séparément L1 et L2 (récursion!)◮ On a donc deux sous-listes triées L1,tri ee et L2,tri ee◮ On obtient Ltri ee en interclassant L1,tri ee et L2,tri ee
◮ Si |Li | ≤ 1, on dit que Li est triée◮ C’est la condition de terminaison de la récursion
En clair :Comment comparer différents algorithmes (résolvant le mêmeproblème) ?
Deux points de vue :◮ rapidité : combien de temps ?◮ taille des ressources : combien de place mémoire ?
Mais peut-on comparer objectivement ?c’est-à-dire indépendamment de la réalisation de l’algorithme surune machine donnée dans un langage donné ? (nous voulonscomparer des algorithmes, pas des programmes)
La complexité d’un algorithme est une fonction qui mesure :
◮ le temps d’exécution (complexité temporelle , la plusutilisée),
◮ ou encore la quantité de mémoire (complexité spatiale ),
requis(e) pour la mise en œuvre de cet algorithme sur un certainjeu de données (variable).La complexité est donc fonction de la taille n du jeu de données.
On distigue de plus la complexité pire cas (la plus utilisée) de lacomplexité moyenne.
En pratique l’on mesure donc la complexité par le nombred’instructions élémentaires nécessaires à l’exécution del’algorithme.
Par instruction élémentaire, nous entendrons ici toute instructionpour laquelle il a été prouvé au moyen d’une machine de Turingqu’elle peut-être utilisé en un nombre d’opération borné par uneconstante connue a priori.
Exemples d’instructions élémentaires :◮ écrire un caractère à l’écran◮ lire un caractère dans un fichier◮ affecter une valeur atomique (un caractère, un entier, un réel,
...) à une variable(mais l’affectation d’une valeur composée peut ne pascorrespondre à un nombre constant de déplacements en casde dépendance par rapport au nombre d’éléments constituantla valeur composée)
◮ (parfois : réaliser une opération arithmétique sur des valeursatomiques)
Pour comparer des algorithmes, ce qui nous intéresse c’est desavoir comment leur complexité évolue en fonction de la taille desdonnées en entrée.
Pour cela on effectue des comparaisons sur les ordres degrandeur asymptotiques (quand la taille des données en entréetend vers l’infini)Ces ordres de grandeur sont généralement notés en utilisant lanotation de Landau O(...)
Pour deux fonctions f et g de R dans R, on écrit :
f = O(g)
si et seulement si
∃c > 0;∃x0|∀x > x0; |f (x)| ≤ c · |g(x)|
Dans ce cas, on dit que f est « en grand O » de g.IPO – Cours 12 :– Récursivité | Complexité– – 29 / 56
Taille des entrées : les entrées sont constituées d’un élément x etd’une liste E de m=taille(E) éléments du même type que x .La taille d’un codage binaire de la séquence d’entrée pourra êtrede la forme : K · (m+1) et l’on pourra donc prendre mcommemesure de référence.
Instructions élémentaires utilisées :
1. l’affectation d’une valeur à une variable entière ;
2. le calcul de la taille d’une liste d’entiers ;
3. la comparaison de deux valeurs entières (avec < et ==) ;
Remarques a propos des instructions élémentaires :◮ Pour des entiers codés sur un nombre fixe de bits, les
instructions (1), (3), (4) et (6) peuvent être réalisées en unnombre constant de déplacements d’une machine de Turing.☞ Ces instructions pourront donc être associées à un coûtunité lors du calcul de complexité.
Par contre, pour les instructions (2) et (5), la situation est pluscompliquée, car dépendante de la représentation qui est utiliséepour les listes :
◮ En effet, selon que cette représentation contient ou non defaçon explicite l’indication de la taille, le calcul de cettedernière pourra être réalisé :
◮ soit en un nombre constant d’étapes (mémorisation explicite dela taille)
◮ soit en un nombre d’étapes dépendant du nombre d’élémentsde la liste (parcours + sommation)
◮ De même, selon que la liste est représentée ou non par unestructure de données permettant un accès direct à seséléments (tableau, vecteur), l’accès au ième élément pourrase faire:
◮ soit en un nombre constant d’étapes (accès direct)◮ soit à nouveau en un nombre d’étapes dépendant du nombre
Dans le cas où la liste E est représentée par un structure dedonnées permettant le calcul de la taille de E et l’accès à soni-ème élément en un temps constant, l’analyse de la complexitéde appartient1(x,E) est la suivante :
(1) affectation de la valeur 0 à la variable i 1 instruction(2) calcul de la taille de E et vérification de la
condition (i<taille(E) )2 instructions
(3) accès au i-ème élément de E et comparaisonde cet élément avec x
2 instructions
(4) décrément (de 1) de i et retour en (2) 1 instruction
Par construction de l’algorithme, les étapes (2), (3) et (4) seront faites au plusautant de fois qu’il y a d’éléments dans E, donc m=taille(E) fois. Si C1(m) est lenombre d’instructions élémentaires nécessaires pour réaliser l’algorithmeappartient1(x,E) , on a donc :
Automate abstrait , constitué des éléments suivants :
◮ une bande infinie (i.e., de taille non bornée),
◮ cellules pouvant “stocker” des caractères (∈ ensemble fini Σ)
◮ une tête de lecture/écriture , pouvant :
◮ lire et modifier le caractère courant◮ se déplacer d’une cellule vers la gauche ou vers la droite
◮ un ensemble fini E d’états internes (fonctionnement de la machine)
◮ une table de transitions indiquant, pour chaque couple(état interne, caractère courant)
une nouvelle valeur pour ce couple, ainsi que le déplacement de la tête delecture/écriture.Dans la table de transitions, chaque couple est donc associé à un triplet :
(nouvel état interne, nouveau caractère, déplacement)Application :
1. la bande est initialisée avec la séquence de caractèrescorrespondant aux (à un codage des) données d’entrée,
2. la tête de lecture/écriture est positionnée sur la cellule initiale de labande (disons 0), et l’état interne est positionné à sa valeur initiale(qui fait partie de la définition de la machine),
3. tant que le couple courant (état interne, caractère courant) estprésent dans la table de transitions, le triplet(état interne[nouveau], caractère[nouveau], déplacement)est utilisé pour mettre à jour l’état interne, le caractère courant, puisle déplacement de la tête de lecture/écriture est effectué,
4. si le couple (état interne, caractère courant) n’est pas dans latable de transitions, la machine s’arrête.Le contenu de la bande à ce moment-là est considéré comme lerésultat du traitement.
On voit qu’une machine de Turing est caractérisée par1. sa logique générale de fonctionnement ;2. le codage de ses entrées et sorties (par exemple sous forme de
séquences binaires) ;3. la table de transitions décrivant son fonctionnement.
Si l’on impose de coder les entrées et les sorties sous forme binaire (etle caractère ε indique l’absence de caractère dans une cellule), on obtientune représentation uniforme des machines de Turing, appeléereprésentation canonique .
Remarque :
D’autres choix sont possibles pour la définition des machines de Turing (plusieurs
bandes, autres opérations élémentaires, autres alphabets de caractères, ...) mais
on peut montrer que les résultats théoriques obtenus avec de telles machines sont
équivalents à ceux obtenus à l’aide d’une machine de Turing canonique.
Le fonctionnement d’une machine de Turing est conditionné parsa table de transition.
=⇒ machine de Turing = abstraction d’automate decomportement modifiable a priori ...
...mais pas encore automate programmable, pour laquelle leprogramme doit faire partie des données d’entrée de lamachine(et non pas représenter un élément constitutif de la machinecomme la table de transitions)
Si l’on désire qu’une machine de Turing constitue une abstractionpour la notion d’automate programmable, il faut donc que sa tablede transition soit fixe , et que le conditionnement de sonfonctionnement soit entièrement imposé par ses donnéesd’entrées.
C’est-à-dire que bien qu’ayant une table de transition fixe ellepuisse effectuer des tâches différentes décrites uniquement parses données d’entrée (ces données d’entrés sont donc à la fois leprogramme et les données au sens usuel)
Une telle machine, s’appelle la machine de Turing universelle(dépasse le cadre de ce cours)