Partie Informatique Algorithmique Introduction A. LOTFI

Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

L’électronique numérique
Tris.
Architecture de machines Codage des informations
Portée des variables VBA & Excel
Fonctions & procédures
Les formats Stage – Semaine 4.
Introduction à l’Algorithmique
Calculs de complexité d'algorithmes
Algorithmique Résume.
GEF 243B Programmation informatique appliquée Expressions de type mixte et blocs §
Exercices Algorithmiques
A abstraction b assembleur c nombre binaire d bit e cache f UC g puce h compilateur i famille dordinateurs j contrôle k chemin de données l défaut m dé
Le codage de l ’information
et évaluation des compétences
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
Présentation Unité de codage
Initiation à la programmation et algorithmique cours 3
Le binaire L’historique.
Le codage des nombres en informatique
Les bases de l’Algorithmique
Cours algorithme 2 S. Tabbone.
Initiation à la programmation et algorithmique
Représentation numérique de l’information
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
Récursivité.
Introduction à l’algorithmique
Les éléments de base de l’algorithmique
1.2 COMPOSANTES DES VECTEURS
Nature, numération, code
Et l'énergie dans tout çà ….
B.Shishedjiev - Informatique
Le codage des nombres en informatique
Introduction à l’algorithmique
1. 2 PLAN DE LA PRÉSENTATION - SECTION 1 : Code HTML - SECTION 2.1. : CSS (Méthode 1) - SECTION 2.2. : CSS (Méthode 2) - SECTION 3 : JavaScript - SECTION.
1.1 LES VECTEURS GÉOMÉTRIQUES
Les Algorithmes de Tri Introduction Tri par Sélection
Annexe A: Numérotation binaire
Résoudre une équation du 1er degré à une inconnue
Algorithmique et structure de données
Programmation linéaire en nombres entiers : les méthodes de troncature
Mise en forme en Mathématiques
Structures des données
1 Notations Asymptotiques Et Complexité Notations asymptotiques : 0 et  Complexité des algorithmes Exemples de calcul de complexité.
Informatique, Ordinateur & Programme ...
Codage de l’information
Représentation des informations
LES PILES ET FILES.
Cours de langage d'assemblage
Codage des nombres réels avec la norme IEEE-754
Numération cycle 3 : du nombre entier aux nombres décimaux
Chapitre 3 :Algèbre de Boole
Cohen Julien Neville gabriel
TD0 - Rappels. Acquis du programme 1 ère année Analyser et modéliser : un problème, une situation ; Imaginer et concevoir : une solution algorithmique.
Cohen Julien Neville gabriel
Le codage des nombres en informatique
Codage des nombres en informatique : le système binaire.
REPRESENTATION DE L’INFORMATION
Le codage des nombres en informatique
Cours LCS N°4 Présenté par Mr: LALLALI
Introduction aux systèmes numériques
Introduction à la programmation (420-PK2-SL) cours 1
Codage de l’information
Chapitre 4 La représentation des nombres.
Chapitre 4b La représentation des nombres.
Introduction au langage C
Le codage des nombres en informatique
Département Informatique Codage de l’information Laurent JEANPIERRE IUT de CAEN – Campus 3.
ALGORITHME ET PROGRAMMATION RÉVISION Informatique et Sciences du Numérique.
Transcription de la présentation:

Partie Informatique Algorithmique Introduction A. LOTFI Powerpoint Templates

Objectifs Algorithmique Complexité algorithmique Les types de données Les structures de données La récursivité Les Arbres Les algorithmes de Tri

Algorithmique Introduction Un algorithme est une suite d’instructions, qui une fois exécutée correctement, conduit à un résultat donné. L’algorithmique exprime les instructions à effectuer pour résoudre un problème donné indépendamment des particularités de tel ou tel langage. Pour fonctionner, un algorithme doit donc contenir uniquement des instructions compréhensibles par celui qui devra l’exécuter. La vérification méthodique, pas à pas, de chacun de vos algorithmes représente plus de la moitié du travail à accomplir... et la garantie de vos progrès.

Algorithmique Introduction Donc : Un Algorithme : enchaînement des actions (instructions) nécessaires pour résoudre un problème On trouve différentes appellations langage algorithmique pseudo-langage de programmation pseudo-code …

Algorithmique Introduction Qu’est ce qu’un ordinateur ? Une machine totalement dénuée d'intelligence Capable d’effectuer un grand nombre de tâches Exécute très rapidement et sans erreurs les ordres qu'on lui donne Qu’est-ce qu’un programme ? Assemblage et enchaînement d’instructions élémentaires Écrit dans un langage de programmation Exécuté par un ordinateur afin de traiter les données d’un problème Et renvoyer un ou plusieurs résultats Un programme est réalisé dans le but d’effectuer un ensemble de traitements particuliers sur un ensemble de données Définir sous quelle forme les données initiales seront fournies à l’application Définir sous quelle forme les résultats seront communiqués Expliciter les différentes actions à effectuer pour réaliser cette tâche

Algorithmique Données et Mémoire 33 1 2 3 4 56 5 6 7 8 9 10 11 12 4 La mémoire : c'est l'espace où les données sont rangées pour fin d'utilisation par l'algorithme La mémoire est comme un ensemble de casiers postaux Une case contient une donnée Pour accéder à une donnée, on indique le numéro du casier (ou adresse mémoire) Pour stocker une donnée, on indique le numéro du casier et la valeur à stocker 33 1 2 3 4 56 5 6 7 8 9 10 11 12 4

Algorithmique Codage des Nombres Plusieurs bases de codage possibles Base 10 (décimale) : base de calcul usuelle Base 24 : heures Base 60 : minutes, secondes, degrés Base 12 : douzaine Bases les plus utilisées Pour les êtres humains : base décimale Pour un ordinateur : Base binaire (2) et dérivées : base hexadécimale (16) ou octale (8) Origine de l'utilisation du binaire : absence ou présence de courant électrique (0 ou 1) comme base de codage

Algorithmique Codage des Nombres Historique Antiquité Codage des nombres : dans un but de calcul Apparition du calcul Dès la préhistoire on comptait avec des cailloux et avec ses doigts Calcul vient du latin calculi signifiant caillou Antiquité Chaque civilisation (Musulmans, Grecs, Romains, Chinois, Mayas ...) avait développé des : Systèmes et bases de numérotation Méthodes pour compter et calculer

Algorithmique Origine des systèmes de numérotation Codage des Nombres Base 10 : nombre des doigts des 2 mains Chiffres romains : V = 5 et X = 10 Base 20 : mains et pieds Moins pratique, a disparu ... Base 12 : 3 phalanges et 4 doigts (le pouce sert à positionner le chiffre) Base 60 : les doigts de la deuxième main comptent le deuxième chiffre (60 = 5 x 12)

Algorithmique Codage des Nombres Pour une base B, il y a B symboles différents (les chiffres de cette base) Base 10 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Base 2 : 0, 1 un chiffre = un bit (binary digit) Base 4 : ▲♦■● Base 8 : 0, 1, 2, 3, 4, 5, 6, 7 Base 16 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

« anan-1 ... a1a0 » codé dans une base B Algorithmique Conversion des bases Valeur en décimal (base 10) d'un nombre « anan-1 ... a1a0 » codé dans une base B anBn + an-1Bn-1 + ... a1B + a0 En prenant la valeur décimale de chaque chiffre ax Exemples (1234)10 = 1 x 103 + 2 x 102 + 3 x 10 + 4 (11001)2 = 1 x 24 + 1 x 23 + 0 x 22 + 0 x 2 + 1 = 16 + 8 + 1 = 25 (1C04)16 = 1 x 163 + 12 x 162 + 0 x 16 + 4 = 4096 + 12 x 256 + 0 + 4 = 7172 avec A = 10, B = 11, C = 12, D = 13, E = 14, F = 15

Algorithmique Schéma de Horner Conversion des bases Pour calculer la valeur décimale N de : « anan-1...a1a0 » codé en base B Pn = anB + an-1 Pn-1 = PnB + an-2 Pn-2 = Pn-1B + an-3 ... P1 = P2B + a0 = N Exemple : pour (1234)10, B=10, n=3 p3 = a3 x B + a2 = 1 x 10 + 2 = 12 p2 = p3 x B + a1 = 12 x 10 + 3 = 123 p1 = p2 x B + a0 = 123 x 10 + 4 = 1234

Algorithmique Schéma de Horner Conversion des bases Exemples : (11001)2, B=2, n=4 p4 = 1 x 2 + 1 = 3 p3 = 3 x 2 + 0 = 6 p2 = 6 x 2 + 0 = 12 p1 = 12 x 2 + 1 = 25 (1C04)16, B=16, n=3 p3 = 1 x 16 + 12 = 28 p2 = 28 x 16 + 0 = 448 p1 = 448 x 16 + 4 = 7172

Algorithmique Décimal  base B Conversion des bases Exemple : (1234)10 en décimal 1234 / 10 = 123 reste 4 123 / 10 = 12 reste 3 12 / 10 = 1 reste 2 1 < 10 donc on arrête Résultat : 1234

Algorithmique Décimal  base B Conversion des bases Exemple : (25)10 en binaire 25 / 2 = 12 reste 1 12 / 2 = 6 reste 0 6 / 3 = 2 reste 0 3 / 2 = 1 reste 1 1 < 2 donc on arrête Résultat : (11001)2

Conversion du binaire à l'octal/hexadécimal ou inverse Algorithmique Conversion des bases Décimal  base B Cas Particuliers Conversion du binaire à l'octal/hexadécimal ou inverse 1 chiffre octal = un groupe de 3 chiffres binaires 1 chiffre hexadécimal = un groupe de 4 chiffres binaires (000)2 = 0, (001)2 = 1.... (110)2 = 6, (111)2 = 7 Avec 3 bits, on code les 8 chiffres de la base octale (0000)2 = 0, (0001)2 = 1 .... (1110)2 = 14 = (E)16, (1111)2 = 15 = (F)16 Avec 4 bits, on code les 16 chiffres de la base hexadécimale

Conversion du binaire à l'octal/hexadécimal ou inverse Algorithmique Conversion des bases Décimal  base B Cas Particuliers Conversion du binaire à l'octal/hexadécimal ou inverse Exemple : (10110001101)2 en octal On regroupe par groupes de 3 bits : 010 110 001 101 On rajoute des zéros au début au besoin (010)2 = 2, (110)2 = 6, (001)2 = 1, (101)2= 5 (10110001101)2 = (2615)8

Conversion du binaire à l'octal/hexadécimal ou inverse Algorithmique Conversion des bases Décimal  base B Cas Particuliers Conversion du binaire à l'octal/hexadécimal ou inverse Exemple : (10110001101)2 en hexadécimal On regroupe par groupes de 4 bits : 0011 1000 1101 (0011)2 = 5 , (1000)2 = 8, (1101)2 = 13 (10110001101)2 = (58D)16

Algorithmique Codage des Nombres On a vu le codage des nombres entiers positifs dans différentes bases. Mais on doit aussi pouvoir manipuler des : Nombres réels Nombres négatifs Le signe … Représentation en virgule fixe: (N)B = an an-1 ... a1 a0 , b1 b2 ... bm-1 bm = anBn + an-1Bn-1 + ... a1B + a0 + b1B-1 + b2B-2 + ... bm-1B-m+1 + bmB-m

Représentation en virgule flottante Algorithmique Codage des Nombres Représentation en virgule flottante Principe et intérêts Avoir une virgule flottante et une précision limitée Ne coder que des chiffres significatifs N = +/- M x BE N = nombre codé M = mantisse : nombre de X chiffres de la base B E = exposant : nombre de Y chiffres de la base B +/- = codage du signe : positif ou négatif Le nombre est présenté sous forme normalisée pour déterminer la mantisse et exp. Pas de chiffre avant la virgule : 0,XXXXX x BE

Représentation en virgule flottante Algorithmique Codage des Nombres Représentation en virgule flottante Exemples 1234,5 en base 10 On normalise pour n'avoir que des chiffres après la virgule : 0,12345 x 104 Mantisse codée = 12345, exposant = 4, signe = + Standard IEEE 754 : codage binaire de réels en virgule flottante Précision simple : 32 bits 1 bit de signe, 8 bits exposant, 23 bits mantisse Précision double : 64 bits 1 bit de signe, 11 bits exposant, 52 bits mantisse

Algorithmique Codage des Nombres Les Entiers Principe : considérer que le bit de poids fort code le signe 0 = entier positif, 1 = entier négatif Bit de poids fort : le plus à gauche Bit de poids faible : le plus à droite Les autres bits codent le nombre en valeur absolue Nécessité de savoir sur combien de bits on code le nombre pour déterminer quel bit code quoi Exemples si codage sur 4 bits (0111)2 = 7 car bit de poids fort à 0 (1111)2 = -7 car bit de poids fort à 1

Algorithmique Codage des Nombres Les Entiers Un ordinateur manipule des nombres binaires sous forme de 8 bits = un Octet = 1 Byte Données codées sur un ou plusieurs octets : 8 bits, 16 bits, 32 bits, 64 bits ... Avec p bits, on code N valeurs avec 0 ≤ N ≤ 2p - 1 Avec 16 bits, on peut coder 216 = 65536 valeurs différentes Soit les entiers de 0 à 65535 pour les entiers positifs

Algorithmique Codage des Nombres Les Entiers Pour un entier signé sur 16 bits : Nombres positifs : 0XXXXXXXXXXXXXXX Nombres négatifs : 1XXXXXXXXXXXXXXX On a 15 bits pour coder la valeur absolue du nombre soit 215 = 32768 valeurs possibles Pour le positif : de 0 à 32767 Pour le négatif : de -0 à -32767 Pour p bits : -(2p-1 - 1) ≤ N ≤ 2p-1 - 1 Inconvénient : on code 2 fois le 0

Algorithmique Les Variables Dans un programme informatique, on va avoir en permanence besoin de stocker provisoirement des valeurs de types différents: utilisation de variables Une variable est une boîte, que le programme (l’ordinateur) va repérer par une étiquette. Pour avoir accès au contenu de la boîte, il suffit de la désigner par son étiquette. Déclaration des variables => créer la boîte et de lui coller une étiquette. Le nom de la variable (l’étiquette de la boîte) obéit à des impératifs changeant selon les langages: Un nom de variable correct commence impérativement par une lettre. Comporte des lettres et des chiffres, mais qui exclut la plupart des signes de ponctuation, en particulier les espaces.

Algorithmique Le Type Le type de la boite précise ce que l’on voudra mettre dedans, car de cela dépendent la taille de la boîte Les principaux types de base sont : Types numériques Type alphanumérique Type booléen Le type est défini en fonction des besoins Le type booléen est très économique en termes de place mémoire occupée, puisque pour stocker une telle information binaire, un seul bit suffit Les autres types sont généralement composés à partir des types de base.

Algorithmique L’instruction d’affectation Affecter une variable c’est lui attribuer une valeur => mettre un contenu dans la boite. En pseudo-code, l'instruction d'affectation se note avec le signe ← maVariable ← 24 //Attribue la valeur 24 à la variable maVariable Il faut vérifier : La comptabilité entre le contenant et le contenu La variable désigné doit être au préalable déclarée

Différence avec le = mathématiques Algorithmique L’instruction d’affectation Différence avec le = mathématiques Quand on dit qu'une variable prend pour valeur une autre variable, ça ne veut pas dire qu'elles seront toujours égales ! Cela veut seulement dire que la première variable va prendre la valeur de la seconde Le contenu de la première boite sera le même celui de la seconde boite… Mais si on modifie le contenu de la seconde boite après, ça n’a pas d’impact sur le contenu de la première boite !

Différence avec le = mathématiques Algorithmique L’instruction d’affectation Différence avec le = mathématiques Exemples Algo : x <- y différend de y <- x Maths : x = y équivaut à y = x Algo : x + 12 <- y impossible ! Maths : x + 12 = y a un sens Algo : x <- x + 7 a un sens Maths : x = x + 7 impossible

Algorithmique Exemple de variables Identificateur : X Type : entier Mémoire centrale (mémoire vive) Identificateur : X Type : entier Valeur : 25 Identificateur : Y Type : réel Valeur : 3,7 X 25 Y 3,7

Algorithmique Les Opérateurs Les opérations possibles sur les variables dépendent de leur type On ne peux pas par exemple multiplier des mots… Pour le Type Réel

Algorithmique Les Opérateurs Pour le Type Entier

Algorithmique Les Opérateurs Pour le Type Caractère Pour le Type Chaîne de caractères

Algorithmique Les Opérateurs Pour le Type Booléen

Algorithmique Exemples Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ? Variables A, B en Entier Début A ← 5 B ← 2 A ← B B ← A Fin Moralité : les deux dernières instructions permettent- elles d’échanger les deux valeurs de B et A ? Si l’on inverse les deux dernières instructions, cela change-t-il quelque chose ?

Algorithmique Correction Instruction Etat des Variables A ← 5     A = 5          B = ? B ← 2        A = 5          B = 2 A ← B          A = 2          B = 2 B ← A         A = 2         B = 2 Les deux dernières instructions ne permettent donc pas d’échanger les deux valeurs de B et A, puisque l’une des deux valeurs (celle de A) est ici écrasée. Si l’on inverse les deux dernières instructions, cela ne changera rien du tout, hormis le fait que cette fois c’est la valeur de B qui sera écrasée. Début A ← 5 B ← 2 A ← B B ← A Fin

Algorithmique Exemples Un classique absolu, qu’il faut absolument maîtriser : écrire un algorithme permettant d’échanger les valeurs de deux variables A et B, et ce quel que soit leur contenu préalable. Solution Début … C ← A A ← B B ← C Fin Remarque On est obligé de passer par une variable dite temporaire (la variable C).

Algorithmique Exercice On dispose de trois variables A, B et C. Ecrivez un algorithme transférant à B la valeur de A, à C la valeur de B et à A la valeur de C (toujours quels que soient les contenus préalables de ces variables). Solution Début … D ← C C ← B B ← A A ← D Fin Remarque En fait, quel que soit le nombre de variables, une seule variable temporaire suffit…

Algorithmique Les Instructions Les Branchements Le test booléen Si condition alors Instruction(s) Sinon Instruction(s) Fin si (fsi)

Algorithmique Les Instructions Les Branchements Sélection de cas Cas [variable] 1er cas: Instruction(s) 2ème cas: Instruction(s) … Cas échéant: Instruction(s) Fin cas

Algorithmique Les Instructions Les Boucles La boucle pour Pour [variable] de v_début à v_fin faire Instruction(s) Fin Pour (fpour)

Algorithmique Les Instructions Les Boucles La boucle tant que (while … do) Tant que condition(s) vérifiée faire Instruction(s) Fin tant que (ftq) Autre forme (do … while) Faire Tant que condition(s) vérifiée

Algorithmique Les Instructions Les Boucles La boucle répéter (repeat … until) Répéter Instruction(s) Jusqu’à condition de sortie

Algorithmique Les Instructions Les Boucles Choix de la boucle La règle est simple : Si le nombre d’itérations est connu à priori, alors on utilise une boucle Pour. Sinon Si l’instruction est exécutée au moins une seule fois, on utilise Répéter…jusqu’à (ou sa version faire…tant que) Sinon on utilise la boucle Tant que … faire

Algorithmique Les Procédures Syntaxe Une procédure est un sous-programme Sert à découper un programme en plusieurs morceaux Chaque procédure définit une nouvelle instruction qu’on peut appeler en tout endroit du programme  réutilisation de code Découpage de programme  analyse descendante  du plus général au détail Syntaxe Procédure nom_procédure([Paramètres]) Début Instruction(s) Fin

Algorithmique Les Fonctions Syntaxe Une fonction est une procédure qui renvoie un résultat, de manière à ce qu’on puisse l’appeler dans une expression : y  cos(x)+1 Syntaxe Fonction nom_fonction([Paramètres]) Début Instruction(s) Retourner(résultat) Fin

Algorithmique Complexité Algorithmique L’exécution d’un programme a un coût Le temps d’exécution L’espace mémoire requi Aujourd’hui, point sensible  temps La théorie de la complexité algorithmique s'intéresse à l'estimation de l'efficacité des algorithmes. Elle s'attache à la question : entre différents algorithmes réalisant une même tâche, quel est le plus rapide et dans quelles conditions ? Illustration : Etude de la complexité et mesure des performances de quelques algorithmes bien connus Tri par sélection Tri par insertion Tri par bulles Tri rapide

Algorithmique Complexité Algorithmique Domination La notation grand O de Landau dénote le caractère dominé d'une fonction par rapport à une autre. Définition Soient f et g deux fonctions de la variable réelle x. On dit que f est dominée par g en +∞, ou que g domine f en +∞, et on note Lorsqu'il existe des constantes N et C telles que Intuitivement, cela signifie que f ne croît pas plus vite que g.

Algorithmique Complexité Algorithmique Voici une liste de catégories de fonctions couramment utilisées en analyse. notation croissance O(1) constante O(log(n)) logarithmique O((log(n))c) polylogarithmique O(n) linéaire O(n log(n)) parfois appelée « linéarithmique », ou « quasi-linéaire » O(n2) quadratique O(nc) polynomiale O(cn) exponentielle, parfois « géométrique » O(n!) factorielle

Algorithmique Complexité Algorithmique Règles utiles Règle 1: La complexité d’un semble d’instructions est la somme des complexités de chacune d’elles. Règle 2: Les opérations élémentaires telle que l’affectation, test, accès à un tableau, opérations logiques et arithmétiques, lecture ou écriture d’une variable simple ... etc, sont en O(1) Règle 3: Instruction if: maximum entre le then et le else Le switch: maximum parmi les différents cas

Algorithmique Complexité Algorithmique Règles utiles Règle 4: Instructions de répétition La complexité de la boucle for est calculée par la complexité du corps de cette boucle multipliée par le nombre de fois qu’elle est répétée. En règle générale, pour déterminer la complexité d’une boucle while, il faudra avant tout déterminer le nombre de fois que cette boucle est répétée, ensuite le multiplier par la complexité du corps de cette boucle. Règle 5: Procédure et fonction Leur complexité est déterminée par celle de leur corps. L’appel à une fonction est supposé prendre un temps constant en O(1) Notons qu’on fait la distinction entre les fonctions récursive et celles qui ne le sont pas Dans le cas de la récursivité, le temps de calcul est exprimé comme une relation de récurrence.

Algorithmique Récursivité

Algorithmique Récursivité Définition: Une fonction est récursive si elle fait appel à elle-même d’une manière directe ou indirecte La récursivité est une technique de programmation très utile qui permet de trouver des solutions d’une grande élégance à un certain nombre de problèmes. Attention! Lorsqu’elle mal utilisée, cette subtilité informatique peut créer un code totalement inefficace. Propriétés La récursivité (appels de la fonction à elle-même) doit s’arrêter à un moment donné (test d’arrêt). Autrement, l’exécution va continuer indéfiniment Un processus de réduction: à chaque appel, on doit se rapprocher de la condition d’arrêt.

Algorithmique Récursivité Exemple Vision itérative: Un escalier de hauteur h c’est : une séquence de h marches Vision récursive: Un escalier de hauteur h c’est : une marche suivie d’un escalier de hauteur h−1

Recette de récursivité Algorithmique Récursivité Recette de récursivité S’assurer que le problème peut se décomposer en un ou plusieurs sous-problèmes de même nature Identifier le cas de base qui est le plus petit problème qui ne se décompose pas en sous-problèmes Résoudre(P) = si P est un cas de base, le résoudre directement sinon décomposer P en sous-problèmes P1, P2,... résoudre récursivement P1, P2,... combiner les résultats obtenus pour P1, P2, …, pour obtenir la solution et avoir la solution au problème de départ.

Algorithmique Récursivité Fonctionnement Exemple Création d’une pile pour la sauvegarde entre autres des paramètres d’appels de la procédure et la l’adresse de retour. Exemple Calculer le factoriel de n, noté n! Le problème est: Calculer le factoriel d'un nombre entier donné en entrée. En entrée: Nous avons n nombre entiers qui sont plus grands ou égaux à 0. Sortie: Nous avons un nombre entier qui représente le factoriel de n.

Algorithmique Récursivité Factoriel fonction fact (n : Naturel) : Naturel Debut si n=0 ou n=1 alors retourner 1 sinon retourner n*fact(n-1) Finsi Fin Exemple Fact(4)=4*Fact(3) Fact(3)=3*Fact(2) Fact(2)=2*Fact(1) Fact(1)=1 4*6=24 3*2=6 2*1=2 1

Empilage du contexte local Algorithmique Récursivité Empilage du contexte local Chaque procédure stocke dans une zone mémoire les paramètres les variables locales Cette zone s’appelle la pile car les données sont empilées lors de l ’appel d’une procédure désempilées à la fin de la procédure A chaque appel récursif, l ’ordinateur empile donc les paramètres qui doivent changer à chaque appel

Algorithmique Récursivité Inverser une chaîne Exemple Fonction inverse(ch : chaîne) début l= Longueur(ch); Si (l<=1) retourner ch; Sinon retourner inverse(Sous-Chaîne(ch,2,l))& Ch(1); Fin Si Fin Exemple inverse(“abcd”)-> inverse(“bcd”)&”a” inverse(“bcd”)-> inverse(“cd”)&”b” inverse(“cd”)-> inverse(“d”)&”c” dc dcb dcba

Récursivité terminale Algorithmique Récursivité Récursivité terminale Définition : L'appel récursif est la dernière instruction et elle est isolée. Exemple : fonction plus (a,b : Naturel) : natuel début si b=0 alors retourner a sinon retourner plus(a+1,b-1) Finsi Fin Exécution plus(4,2)=plus(5,1)=plus(6,0)=6

Récursivité non terminale Algorithmique Récursivité Récursivité non terminale Définition : L'appel récursif n'est pas la dernière instruction et/ou elle n'est pas isolée (fait partie d'une expression) Exemple : fonction plus (a,b : Naturel) : natuel début si b=0 alors retourner a sinon retourner 1+plus(a,b-1) Finsi Fin Exécution plus(4,2)=1+plus(4,1)=1+1+plus(4,0)=1+1+4=6

Algorithmique Récursivité Les Tours de Hanoï Les tours de Hanoï est un jeu solitaire dont l'objectif est de déplacer les disques qui se trouvent sur une tour (par exemple ici la première tour, celle la plus a gauche) vers une autre tour (par exemple la dernière, celle la plus a droite) en suivant les règles suivantes : on ne peut déplacer que le disque se trouvant au sommet d'une tour ; on ne peut déplacer qu'un seul disque a la fois ; un disque ne peut pas être posé sur un disque plus petit.

Algorithmique Récursivité Les Tours de Hanoï Etude du problème Un peu de jeu Pilier 1 Pilier 2 Pilier 3 Pilier 1 Pilier 2 Pilier 3 Pilier 1 Pilier 2 Pilier 3 Pilier 1 Pilier 2 Pilier 3

Reformulation du problème Algorithmique Récursivité Les Tours de Hanoï Etude du problème Ceci correspond à Hanoï avec n-1 disques Reformulation du problème Si on a "n" disques à déplacer alors : on déplace "n-1" disques vers le pilier intermédiaire on déplace le disque "n" du pilier initial vers le pilier final on déplace les "n-1" disques du pilier intermédiaire vers le pilier final Pilier 1 Pilier 2 Pilier 3 Pilier 1 Pilier 2 Pilier 3

Algorithmique Récursivité Les Tours de Hanoï Algorithme Procedure hanoi(nbdisk, source, destination: Naturels) Début intermediaire = 6-(source+destination); Si (nbdisk > 0) Alors hanoi(nbdisk -1, source, intermediaire); Afficher("disque “& nbdisk &" de “&Source & "- >" & destination); hanoi(nbdisk-1, intermediaire, destination); Fin Si Fin Voir le programme en PHP par exemple

Algorithmique Récursivité Hanoï - Complexité En général, on a 2n-1 déplacements pour n disques Soit O(2n) : complexité exponentielle Si par exemple un déplacement coûte 1 seconde Pour 64 disques, on a : 264-1=18.446.744.073.709.551.615 secondes C’est 584.942.417.355 soit 585 milliard années disques 1 2 3 4 5 … déplacements 7 15 31

Efficacité de la Récursivité Algorithmique Récursivité Efficacité de la Récursivité Un algorithme récursif est légèrement moins rapide qu’un algorithme itératif équivalent Temps nécessaire à l ’empilage et au dépilage des données La récursivité utilise plus de ressources mémoire pour empiler les contextes La récursivité est plus « élégante » Les algorithmes récursifs sont souvent plus faciles à écrire

Algorithmique Les Arbres Structures de données En informatique, une structure de données est une structure logique destinée à contenir des données, afin de leur donner une organisation permettant de simplifier leur traitement. Une structure de données implémente concrètement un type abstrait. Différentes structures de données existent : Structures finies constantes variables enregistrements structures composées finies Structures indexées tableaux sur [1..n] tableaux sur [1..n][1..m] tableaux associatifs Structures récursives listes arbres graphes

Algorithmique Structures Les Tableaux Un tableau de taille  n est une structure très simple constituée de  emplacements consécutifs en mémoire. Il est donc possible d'accéder à un élément d'un tableau en temps constant O(1) pourvu que l'on connaisse sa position (ou indice). Un tableau est donc une structure très simple et très efficace. Il n'est cependant pas possible de modifier la taille d'un tableau, ce qui est gênant pour un certain nombre d'algorithmes. On dit cette structure est statique. Le nombre d'éléments qu'elle contient ne peut pas varier. Le principe d'un tableau est donc très simple : on stocke les éléments dans des cases, chaque case étant étiquetée d'un numéro (généralement appelé indice). Pour accéder à un élément particulier d'un tableau, on donne son indice. 

Algorithmique Structures Les Listes Chaînées Une liste chaînée est une liste à accès séquentiel, où chaque élément contient une valeur et une référence à l'élément suivant. L'intérêt d'une telle liste est que sa taille peut varier dynamiquement sans soucis de la fragmentation de son stockage mémoire. S'il est vrai que les tableaux sont stockés de manière contiguë en mémoire, il n'en va pas de même pour la liste chaînée, d'où sa plus grande souplesse d'emploi. Agrandir la liste revient à créer un nouvel élément en mémoire et à le lier à la liste chaînée par une référence vers son emplacement mémoire. A une liste chaînée sont associée les primitives ou fonctions de service suivantes: Insérer Supprimer La liste est-elle vide ? Nombre d'éléments dans la liste

Algorithmique Structures Les Listes Chaînées Liste simplement chaînée Un élément d'une liste simplement chaînée est constitué d'une clé (la valeur de l'élément) et d'une référence à l'élément suivant (pointeur vers élément). Par convention, l'accès à une liste  simplement chaînée est simplement un pointeur vers le premier élément de cette liste. Primitives tete[L] qui a une liste L renvoie l'adresse de son premier élément. succ[x] qui a un élément x renvoie l'adresse de son successeur. cle[x] qui a un élément x renvoie sa valeur.

Algorithmique Structures Les Listes Chaînées Liste simplement chaînée Insertion: Attention à l’ordre Suppression: N’oubliez pas de supprimer l’élément de la mémoire.

Algorithmique Structures Les Listes Chaînées Liste doublement chaînée Un élément d'une liste doublement chaînée est constitué d'une clé, d'une référence à l'élément suivant et d'une référence arrière vers l'élément précédent. Par convention l'accès à une liste doublement chaînée est simplement un pointeur vers le premier élément de cette liste.

Algorithmique Structures Les Piles En informatique, une pile (stack) est une structure de données de type LIFO (Last In, First Out), c'est à dire fonctionnant sur le principe «dernier arrivé, premier sorti». Les derniers éléments ajoutés à la pile seront les premiers à être récupérés. On peut représenter une pile par une liste chaînée. Les insertions et suppressions sont faites seulement dans la queue de la liste. Empiler/Dépiler sont les fonctions de base.

Algorithmique Structures Les Files En informatique, une file (queue) est une structure de données de type FIFO (First In, First Out), c'est à dire fondée sur le principe «premier arrivé, premier sorti » . Les premiers éléments ajoutés à la file seront les premiers à être récupérés.. On peut représenter une file par une liste chaînée. Les insertions sont en queue et les suppressions sont faites dans la tête de la liste. Enfiler/Défiler sont les fonctions de base.

Algorithmique Structures Les Arbres Définition : un arbre est une structure de données composée d’un ensemble de nœuds. Chaque nœud contient l’information spécifique de l’application et des pointeurs vers d’autres nœuds (d’autres sous-arbres). Définition récursive d'un arbre : Arbre vide Un seul noeud = racine Si on dispose d'un certain nombre d'arbres, on peut les "raccrocher" à un nouveau nœud, qui devient racine. R Sous arbre A1 A2 A3

Algorithmique Les Arbres Notions Racine : C'est le noeud qui n'a pas de prédécesseur. La racine constitue la caractéristique d'un arbre. Dans l'exemple c'est a Feuille : c'est le noeud qui n'a pas de successeur. Une feuille est aussi appelée un noeud externe. Dans l'exemple, les feuilles sont : c, i, j, e, g et h. Nœud interne : c'est tout noeud qui admet au moins un successeur. Dans l'exemple, les noeuds internes sont : a, b, f et d. Fils : c’est le successeur. Dans l'exemple, c, d et e sont les fils du noeud b. a f b d c e g h i j

Algorithmique Les Arbres Notions Frères : ce sont les successeurs issus d'un même nœud. Dans l'exemple, c, d et e sont des frères. Père : c'est un nœud qui admet au moins un successeur. Dans l'exemple, b est le père des nœuds c, d et e. Sous arbre : C'est une portion de l'arbre. Dans l'exemple, le noeud f avec ces deux fils g et h constituent un sous arbre. Descendants d’un nœud : ce sont tous les noeuds du sous arbre de racine noeud. Dans l'exemple, les descendants de h sont h, c, d, e, i et j. a f b d c e g h i j

Algorithmique Les Arbres Ascendants d’un nœud : ce sont tous les nœuds se trouvant sur la branche de la racine vers ce nœud. Dans l'exemple, les ascendants de d sont d, b et a. Les ascendants de g sont f et a. Branche : Les ascendants d'une feuille constituent une branche de l'arbre. Dans l'exemple, les branches de l'arbre sont a-b-c, a-b-d-i, a-b-d-j, a-b-e, a-f-g et a-f-h. Degré d’un nœud : C'est le nombre de ses fils. Dans l'exemple, le degré de b est 3. Niveau d’un nœud : On dit que la racine a le niveau 0, ses fils ont le niveau 1, les fils des fils ont le niveau 2. etc...  Dans l'exemple, a est de niveau 0, d est de niveau 2 et j est de niveau 3. a f b d c e g h i j

Algorithmique Les Arbres Notions Profondeur de l’arbre : C'est le niveau maximal des feuilles de l'arbre. L'arbre de l'exemple est de profondeur 3. Arité ou degré d’un arbre : c’est le maximum de fils qu’un nœud peut avoir (arité 3 dans l’exemple). Arbre binaire : Un arbre binaire est un arbre tel que chaque nœud a au plus deux fils (ou successeurs). On parle de fils gauche et fils droit. Dans la suite, on va étudier que les arbres binaires. a f b d c e g h i j

Représentation en mémoire Algorithmique Les Arbres Représentation en mémoire On peut représenter un arbre binaire par une liste chaînée A C D NULL NULL NULL E NULL NULL

Stratégies de parcours Algorithmique Les Arbres Stratégies de parcours Il existe 2 méthodes classiques de parcours d'arbre : Parcours en Profondeur, on part de la racine et on descend jusqu'à une première feuille avant de passer aux nœuds suivant puis remonter. Dans cette représentation, les feuilles apparaissent aux côtés de leur arborescence. Parcours en Largeur, l’élément du niveau courant est noté puis on passe au fils de chacun d'eux. Cela peut s'apparenter à la vue dans un navigateur de fichier (Explorer Windows, Nautilus...). Pour les parcours en profondeur, on a : La notation préfixée La notation infixée La notation post-fixée

Algorithmes de parcours Algorithmique Les Arbres Algorithmes de parcours Parcours Préfixé Procédure Préfixé(racine) Début Afficher(Racine); Préfixé(Racine->Gauche); Préfixé(Racine->Droite); Fin Parcours Post-fixé Procédure Postfixé(racine) Postfixé(racine->Gauche); Postfixé(racine->Droite);

Algorithmes de parcours Algorithmique Les Arbres Algorithmes de parcours Parcours Infixé Procédure Infixé(racine) Début Infixé(Racine->Gauche); Afficher(Racine); Infixé(Racine->Droite); Fin